AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

Результаты опроса: Оцените полезность этого класса ?
Очень полезно 2 9.09%
Пригодилось 5 22.73%
На досуге посмотрю 13 59.09%
Совершенно ненужная вешь 2 9.09%
Голосовавшие: 22. Вы ещё не голосовали в этом опросе

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.11.2004, 09:33   #1  
tron is offline
tron
Участник
 
6 / 10 (1) +
Регистрация: 24.11.2004
Адрес: Томск
Ускорение экспорта в Excel
Привет.
Я тут новенький, но вижу тут много раз всплывает тема экспорта в Excel.

Мы тоже столкнулись с проблемой медленной выгрузки в Excel, для ее решения был написан класс ExportExcelViaCsv наследник ComExcelDocument_RU , который экспортирует данные через временный файл c:\data.csv.

Который в свою очередь импортируется в Excel через макрос import_csv.bas.

За счет этого скорость вывода стала значительно выросла, для примера
раньше печать отчета по остаткам товара 40000 строк занимала 3 часа 10 минут, теперь 9 минут ...

В нем конечно реализованны не все функции, в связи с вечной нехваткой времени пока только:

deleteRow
dks_copyBookmark
insertValue

я думаю не составит проблем дописать остальные методы...

Использование:

1 Заменяете new ComExcelDocument_RU() на new ExportExcelViaCsv()
2 В файл шаблона вставляете макрос import_csv.bas...

Запускаете радуетесь жизни :-)
Вложения
Тип файла: zip exportexcelviacsv.zip (7.4 Кб, 270 просмотров)
Старый 24.11.2004, 10:15   #2  
tron is offline
tron
Участник
 
6 / 10 (1) +
Регистрация: 24.11.2004
Адрес: Томск
Кому импортить проект неохота вот основные части простым текстом:
Таким образом формируется файл из Axapta 3.0
PHP код:
// Tron 01.10.2004
void finalize()
{
    
TextBuffer      textBuffer = new TextBuffer();
    ;
    
// Добавляем тип файла
    
csvTextBuffer "1;" csvTextBuffer;

    
textBuffer.setText(csvTextBuffer);
    
textBuffer.toFile("c:\\data.csv");

    
this.dks_runMacro("Main");
    
super();

А вот собственно макрос на Visual Basic:
PHP код:
Rem Tron 01.10.2004
Rem Загрузка данных из внешних файлов 
// Axapta
Rem Ver1.0.1.5

Dim CurrentString 
As String
Dim Variables 
As String
Dim I 
As Long
Dim NowChar 
As Long

Dim FromRange 
As String
Dim ToRange 
As String
Dim Value 
As String

Sub Main
()
    
Application.ScreenUpdating False
    Application
.Visible False
        
    Import
 
    Sheets
(1).Name "Отчет"
    
Worksheets(1).Activate
    Application
.Visible True
    Application
.ScreenUpdating True
End Sub

Sub Import
()
On Error GoTo ErrorHandler
        Open 
"c:\data.csv" For Input Access Read As #1
        
Line Input #1, Variables
    
        
Do While Not EOF(1)
            
Line Input #1, CurrentString
            
FillWorkSheet
        Loop
    
        Close 
#1
Exit Sub
ErrorHandler
:
    
Worksheets(1).Range("A1").Value "Произошла ошибка обмена данными"
Exit Sub
    
End Sub

Sub FillWorkSheet
()
    
NowChar 3
    Worksheets
(1).Activate
    
    Rem Dks_copyBookMark
    
If (Left(CurrentString1) = "1"Then
        FromRange 
ReturnPart
        ToRange 
ReturnPart
        Range
(FromRange).Select
        Selection
.Copy
        Range
(ToRange).Select
        Selection
.PasteSpecial Paste:=xlPasteColumnWidthsOperation:=xlNone_
            SkipBlanks
:=FalseTranspose:=False
        ActiveSheet
.Paste
    Rem InsertValue
    
ElseIf (Left(CurrentString1) = "2"Then
        ToRange 
ReturnPart
        Value 
ReturnPart
        Worksheets
(1).Range(ToRange).Value Value
    Rem DeleteRow
    
ElseIf (Left(CurrentString1) = "3"Then
        ToRange 
ReturnPart
        CurrentRegion 
ToRange ":" ToRange
        Rows
(CurrentRegion).Select
        Selection
.Delete Shift:=xlUp
    Rem DeleteColumn
    
ElseIf (Left(CurrentString1) = "4"Then
        ToRange 
ReturnPart
        CurrentRegion 
ToRange ":" ToRange
        Columns
(CurrentRegion).Select
        Selection
.Delete Shift:=xlToLeft
    End 
If
    
    
End Sub

Function ReturnPart() As String
    ReturnPart 
""
    
For NowChar NowChar To Len(CurrentString)
        If (
Mid(CurrentStringNowChar1) = ";"Then
            
Exit For
        
End If
        
ReturnPart ReturnPart Mid(CurrentStringNowChar1)
    
Next
    NowChar 
NowChar 1
End 
Function 
Старый 24.11.2004, 10:36   #3  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
Смысл экселевского макроса понять не могу. Exel сам способен работать с форматом .csv при простом открытии если грамотно расположить разделители естественно.

А проблема медленного экспорта действительно существует. Мы, например, выводим в Exel через ActiveX. Скорость вырастает в разы.
Старый 24.11.2004, 10:44   #4  
tron is offline
tron
Участник
 
6 / 10 (1) +
Регистрация: 24.11.2004
Адрес: Томск
Цитата:
Изначально опубликовано YVAS
Смысл экселевского макроса понять не могу. Exel сам способен работать с форматом .csv при простом открытии если грамотно расположить разделители естественно.
Смысл макроса простой, я сделал так чтобы не переписывать все существующие отчеты, из Axapta просто формируются команды соответвующих действий, а макрос их исполняет.

Делал и через простой импорт данных CSV с разделителями,
но есть минусы
1. Необходима большая функциональность чем просто вставить данные, необходимо еще копировать оформление, удалять строки и столбцы включать ограничители страниц и.т.д. (многое конечно в будщем когда время появится

2. ограничение Excel не умеет вставлять больше 65536 строк на одну страницу, с помощью макроса такое ограничение можно обойти.
Старый 24.11.2004, 12:42   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,305 / 3539 (124) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Ну кстати, вполне может быть что данный макрос заменит ActiveX-ную компоненту.
Скорость не проверял - однако - если по скорости способ YVAS не лучше скорости Tron, то на мой взгляд очень даже вполне. В качестве минусов метода Tron можно сказать, что:
1. в каждый шаблон нужно вставлять макрос, и в каждом клиентском Excel е, (если работа с Аксаптой конечно ведется не по терминалке) надо разрешать исполнение макроса без подтверждения пользователя (ставить низкий уровень безопасности).
2. Действительно, надо писать все команды-сообщения для форматирования в Excel-е. В ActiveX-компоненте сие делается напрямую - и там проблем нет. Другое дело, что возникает вопрос, а много ли отчетов (из внутренних) у которых будет много шаблонов?

В отношении ограничения кол-ва строк есть вполне резонный (и немного философский) вопрос - о том - кто будет читать такой отчет. Когда кто-то хочет получить такой отчет - он хочет получить фактически некие данные для последующей, вторичной выборки и группировки - как ему удобно (100% вер-ть, что не будет отчет с 65535 строками печататься весь). А значит (как вариант) можно задать все варианты группировки и фильтрации в Аксапте путем программирования.

Однако сказанное выше есть сугубо мое личное мнение - я вполне могу ошибаться.
Старый 24.11.2004, 13:28   #6  
ddadream is offline
ddadream
Участник
Аватар для ddadream
 
130 / 17 (1) ++
Регистрация: 30.11.2001
Адрес: moscow
Вообще с импортом и экспортом в экселе можно работать через ODBC драйвера, получается очень быстро, а так же без промежуточных файлов..
что то типа этого, и скорость вам очень понравится

/*
exec sp_addlinkedserver
@server = 'X2SQL',
@srvproduct = 'Jet 4.0 file',
@provider = 'Microsoft.Jet.OLEDB.4.0',

@datasrc = 'I:\Inetpub\trade\v2.4\aaa.xls',
@location = NULL,
@provstr = 'Excel 8.0, HDR=No'
go
select * from
openquery(X2SQL,'select * from [qqq$]')
go
exec sp_dropserver 'X2SQL'
*/
Старый 24.11.2004, 13:52   #7  
tron is offline
tron
Участник
 
6 / 10 (1) +
Регистрация: 24.11.2004
Адрес: Томск
Цитата:
Изначально опубликовано sukhanchik
1. в каждый шаблон нужно вставлять макрос, и в каждом клиентском Excel е, (если работа с Аксаптой конечно ведется не по терминалке) надо разрешать исполнение макроса без подтверждения пользователя (ставить низкий уровень безопасности).
Про уровень безопастности, как не странно Excel проглатывает шаблоны с макросами
открытые через com- объект с любым уровнем безопастности без всяких вопросов. Так что уровень менять ненадо...

Про каждый шаблон это да, но это только один раз, больше ничего менять не надо...

Цитата:
Изначально опубликовано sukhanchik
В отношении ограничения кол-ва строк есть вполне резонный (и немного философский) вопрос - о том - кто будет читать такой отчет. Когда кто-то хочет получить такой отчет - он хочет получить фактически некие данные для последующей, вторичной выборки и группировки - как ему удобно (100% вер-ть, что не будет отчет с 65535 строками печататься весь). А значит (как вариант) можно задать все варианты группировки и фильтрации в Аксапте путем программирования.
Мы тоже интересовались кто его будет читать, но было решено обойти это заранее до момента когда на это нарвутся и придется менять все и везде как с ошибкой 2000 года
Старый 24.11.2004, 14:35   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,305 / 3539 (124) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Про уровень безопастности, как не странно Excel проглатывает шаблоны с макросами
открытые через com- объект с любым уровнем безопастности без всяких вопросов.
Мдаа.... вот тебе и защита.... хорошая дырочка в Excel...
Даже не думал...
Старый 24.11.2004, 16:37   #9  
Pavel is offline
Pavel
SAP
SAP
 
2,760 / 239 (13) ++++++
Регистрация: 14.12.2001
Адрес: Moscow
Цитата:
Изначально опубликовано ddadream
Вообще с импортом и экспортом в экселе можно работать через ODBC драйвера, получается очень быстро, а так же без промежуточных файлов..
Еще через DDE можно попробовать.
Старый 24.11.2004, 17:19   #10  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,230 / 975 (37) +++++++
Регистрация: 03.04.2002
Ну, раз поднялась эта тема, то и я словечко вверну
Конструкция:
TextBuffer.toClipboard();
worksheet.pastespecial(1);
работает великолепно и быстро. Но вот при работе в терминале у меня возникли проблемы. Если запустить пакетного обработчика и закрыть окно терминала, то она выдаст ошибку. А если оставть окно терминала, то она хватает мой локальный буффер.
Может кто посоветует, как это исправить?
__________________
Isn't it nice when things just work?
Старый 29.11.2004, 11:12   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
tron
Я конечно, извиняюсь, но Вы сравнивали производительность, достоинства и недостатки, Вашего метода и вот этого

http://forum.mazzy.ru/index.php?showtopic=385&hl=excel

Смысл в том, что данные вставляются из буфера обмена напрямую в EXCEL минуя промежуточный текстовый файл. Как следствие, нет необходимости в макросе Excel.

Подробное обсуждение этого метода было здесь
http://www.axforum.info/forums/showt...4163#post24163
Старый 25.01.2005, 17:34   #12  
puga555 is offline
puga555
Участник
 
1 / 10 (1) +
Регистрация: 25.01.2005
Адрес: Tver
Может кто-то поможет???

написал макрос который сохраняет выделенную область в формате CSV, как известно значения ячеек разделяются символом ";" а если в ячейке есть точка с запятой то значение должно браться в кавычки.
Так вот если в ячейке стоит точка с запятой и сохранять файл макросом, то кавычки не ставятся при наличии в ячейке ; , а если сохранять через меню то кавычки появляются.
Помогите решить данную проблему
Старый 26.01.2005, 15:24   #13  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано YVAS
Смысл экселевского макроса понять не могу. Exel сам способен работать с форматом .csv при простом открытии если грамотно расположить разделители естественно.

А проблема медленного экспорта действительно существует. Мы, например, выводим в Exel через ActiveX. Скорость вырастает в разы.

Извините, а что за ActiveX ???
Старый 27.01.2005, 09:14   #14  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
2 simply2double:
Компонентина такая SpreadSheet, встроенная в Excel. Набирайте в окне поиска слово SpreadSheet здесь были ссылки про нее.
Старый 27.01.2005, 09:29   #15  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано YVAS
2 simply2double:
Компонентина такая SpreadSheet, встроенная в Excel. Набирайте в окне поиска слово SpreadSheet здесь были ссылки про нее.
спасибо...
Теги
excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Использование OWC.Spreadsheet для ускорения экспорта/импорта в/из Excel. storer DAX: Программирование 24 28.03.2005 19:10
Особенности экспорта данных в Excel Roman-sp DAX: Функционал 18 01.03.2004 12:07

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:57.