31.10.2003, 13:46 | #21 |
Участник
|
Российская отчетность это хорошо, но как было отмечено выше, уж очень утомительно, а еще бы украинскую отчетность бы иметь, было бы вообще прелесть!!! И еще есть один фактор, мне кажется, что бухгалтера это люди, которые очень любят выстраивать различные "цифровые комбинации" на базе одних и тех же данных, ну вот выгрузить их в Excel и пусть над ними издеваются!!!!)))) А еще дело привычки, очень сильная штука!!!
|
|
31.10.2003, 13:54 | #22 |
Участник
|
Цитата:
Изначально опубликовано mazzy
Посмотрите на документооборот и постарайтесь не париться с программированием. А касаемо документооборота - в тот и дело, что смотрю и остатки волос иной раз дыбом встают... |
|
31.10.2003, 14:07 | #23 |
Участник
|
Цитата:
Изначально опубликовано Alex_K
Сергей, как жы вы это дело не любите... (в смысле, программирование). Поэтому и берегу только для исключительных случаев Цитата:
Изначально опубликовано Alex_K
А касаемо документооборота - в тот и дело, что смотрю и остатки волос иной раз дыбом встают... |
|
04.11.2003, 10:36 | #24 |
Участник
|
Вообще то можно выгружать еще и с помощью класса CommaIo и его функции
writeExp в формат файла с расширением ' *.csv '. По моим наблюдениям ето где-то в 3 раза быстрее. Конечно сервиса класса comExcelDocument_ru там нет, зато функция вставки отрабатывает не так долго в отличие от insertValue. От пользователя требуется лишь сохранить файл как документ Excel. При отработке winapi::ShellExecute csv - файл сам откроется в Excel. Вот только беда: когда у нас стояла версия 2.5 сервис-пак 2 все было отлично, но как перешли на сервис-пак 3 система упорно не разбивает csv - файл по ячейкам , а все пишет в одну ячейку через запятую. Хрен знает в чем проблема. |
|
04.11.2003, 13:45 | #25 |
Участник
|
Посмотрите региональные настройки.
Может у вас сейчас разделитель ; а не запятая |
|
04.11.2003, 21:16 | #26 |
NavAx
|
Поигрался с DDEClient. Хоть и не модно, зато шустро и удобно:
X++: void run() { DDEClient DDEClient; boolean FirstTry = TRUE; ; try { DDEClient = new DDEClient('excel','[1.xls]list1'); if (! DDEClient.isValid()) return; // R1C1 означает row 1 column 1, т.е. адресс ячейки DDEClient.poke('R1C1' , "Hell World!"); } catch(Exception::Internal) { // Only try to start excel once ... if (FirstTry) { FirstTry = FALSE; winApi::shellExecute( "excel.exe", "c:\\test\\1.xls"); sleep(1000); // wait some time to allow excel to start retry; } else { Box::warning("Unable to start DDE with excel","Error","Sorry !"); } } } P.S.S. 2 Vasilenko Alexsandr: не сочти за демпинг ;-) |
|
06.11.2003, 21:07 | #27 |
Участник
|
2 andreynikolai
Приблизительно такого же результата можно добиться используя ADO. Если интересно, посмотрите как реализована печать налоговых регистров. Конкретно - класс RTax25Report_RegisterTransToExcel. Если нужны комментарии - welcome. |
|
10.11.2003, 10:51 | #28 |
Участник
|
А это шустрее работает чем ComExcelDocument_RU ???
|
|
10.11.2003, 11:08 | #29 |
Участник
|
Гораздо быстрее Попробуйте сами. При данном подходе, работа с листом Excel ведется как с таблицей базы данных. Т.е. Вы сможете быстро вывести данные, но не отформатировать их. Для форматирования нужно иметь доступ к объектной модели. Принципиально технология может быть следующей:
1. Открыть(создать) книгу excel 2. Сформировать структуру таблицы с помощью ADOX. Т.е. определить количество и тип колонок. Обратите внимание на строку подключения. 3. С помощью ADO вывести табличные данные. 4. С помощью объектной модели Excel произвести форматирование данных. Построить нужные обрамления, заливки, вставить нужную шапку и т.д. Мы использовали эти технологии для печати налоговых регистров. Работает очень быстро. Правда с шапкой поступили не очень хорошо, можно было поумнее сделать. Так, как я описал выше. У нас шапка выводится как обычная запись. |
|
10.11.2003, 12:35 | #30 |
NavAx
|
ANVA, у нас 2.5 sp2, и класса RTax25Report_RegisterTransToExcel нет :-( Может приведете кусочек кода?
P.S. IHMO DDE все равно будет работать быстрее, т.к. пишет непосредственно в память Excel, но для удобства можно пожертвовать быстродействием. Все равно на порядок быстрее, чем через COM будет ;-) |
|
10.11.2003, 12:42 | #31 |
Участник
|
Не думаю, что медленнее DDE, а прогрммировать на порядок удобнее. Работа идет через родной драйвер Microsoft Excel, в axapta исполняется минимум кода. Постараюсь до вечера запостить вам пример.
|
|
10.11.2003, 12:54 | #32 |
Участник
|
Хотите я вам пришлю этот класс, он не наследован ни от кого и следовательно
безболезненно пройдет инкрементную компиляцию. |
|
10.11.2003, 13:23 | #33 |
Участник
|
Компиляцию он вряд-ли пройдет, поскольку использует функционал, отсутствующий в sp2. Но вы правы, идею можно будет посмотреть и так. Просто хотелось бы чтобы эта идея сохранилась в форуме, может еще кому понадобится
|
|
10.11.2003, 17:23 | #34 |
Участник
|
Сначала необходимо создать файл Excel.
X++: boolean createExcelFile(container _fieldLabels) { COM workBook; COM application = new COM('Excel.application'); ; try { workBook = this.createEmptyBook(application); if (! workBook) return false; } catch(Exception::Error) { infolog.clear(); info("@SYS55051"); } if(application) { if(workBook) { workBook.Save(); } application.quit(); } return true; } X++: protected str connectionString() { return 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + fileName + ';Mode=ReadWrite|Share Deny None;Extended Properties="Excel 8.0;HDR=No";Persist Security Info=False;'; } X++: COM adx = new COM("ADOX.Catalog"); COM adoConnection, adoErrors, adoError; str txtError; ; adoConnection = new COM("ADODB.Connection"); if(! adoConnection) throw error("Ошибка подключения к источнику данных"); adoConnection.open(this.connectionString(), "", "", -1); if(adoConnection.state() != #adStateOpen) throw error("Ошибка подключения к источнику данных "); adx.ActiveConnection(adoConnection); tbls = adx.Tables(); tbl = new COM("ADOX.Table"); tbl.name("Axapta"); cols = tbl.Columns(); X++: for (i=1;..) { _col = new COM("ADOX.Column"); _col.Name(strfmt("F%1", i)); _col.Type(#adWChar); // Эта и другие константы ADO объявлены в макросе CCADO _cols.Append(_col); } X++: While (queryRun.next()) { table = strfmt("`%1$`", 'Axapta'); queryString = "insert into " + table + "(" + fieldsList + ") values (" + labelsList + ")"; _adoConnection.execute(queryString); } X++: catch(Exception::Error) { if(adoConnection) { adoErrors = adoConnection.Errors(); for(i=0; i < adoErrors.Count(); i++) { adoError = adoErrors.Item(i); txtError = adoError.Description(); error(txtError); } adoConnection.close(); } |
|
12.11.2003, 08:37 | #35 |
Участник
|
Попробуте посмотреть: здесь
|
|
12.11.2003, 11:36 | #36 |
Участник
|
Знали бы бухгалтера какие умы пропадают ))
Ничего не понятно... а внушает уважение и доверие. оммммм........ |
|
13.11.2003, 13:19 | #37 |
NavAx
|
2 dumf : бухгалтерам такие вещи знать не за чем, но это уже обсуждение для курилки ;-)
ANVA, storer, спасибо большое, за приведенные примеры :-) |
|
06.07.2004, 12:00 | #38 |
Участник
|
Можно ия свою лепту внесу . Очень быстро данные переносяться массивом . Т.е . массив формирутся , а затем все мскопом переносите в Excel. Быстрее чем , допустим , по одному элементу закидывать . Попробуйте сравнить
|
|
07.07.2004, 12:12 | #39 |
Участник
|
Цитата:
Изначально опубликовано lp
Можно ия свою лепту внесу . Очень быстро данные переносяться массивом . Т.е . массив формирутся , а затем все мскопом переносите в Excel. Быстрее чем , допустим , по одному элементу закидывать . Попробуйте сравнить 1. Формируем нужные сроки, заносим их в TextBuffer c разделителем табуляция между полями. 2. Затем TextBuffer.toClipboard() 3. Становимся на нужное место в документе Excel и делаем paste() (имеется ввиду не ручками, а из того же кода). Данные очень шустренько вставляются, в отличие от поячеистого прохода. Правда несколько надо подправить стандартный COMExcelDocument_RU. Например сделать в нём метод paste(). |
|
02.03.2005, 02:42 | #40 |
Участник
|
Jet, ADO (OLEDB) и Excel
MS Jet - это замечательно, но для него надо заранее средствами самого Excel'я разметить типы данных используемых ячеек, иначе он всё пытается запихнуть как строки (с апострофом). Ешё он напрочь отказывается понимать адресацию ячеек вида R1C1, т.е. написать
select * from [Sheet1$A1:B2] можно, а select * from [Sheet1$R1C1:R2C2] нельзя, хотя так было бы удобнее. Лечится или нет - не знаю, думал, что надо указать какой-нибудь Extended Property, но ничего не нашёл. |
|