01.10.2010, 18:30 | #1 |
Участник
|
Самый быстрый способ выгрузить данные из формы в CSV ?
Стоит задача выгрузить данные из формы (к примеру 20 полей из которых 5-7 display x 50000 строк) максимально быстро по отношению к стандартной функции выгруза данных в Эксель.
Пробовал передавать в класс QueryRun и писать в CSV -на этом обьеме выходит примерно тоже самое что и стандартный Export to Excel (5 мин / 7 мин): X++: itemTable = _queryRun.get(tablenum(ItemTable));
outputFileLine = conpoke(outputFileLine , 1, itemTable.ItemId);
...
fileCSV.write(outputFileLine);
__________________
_databaseTransDelete ... bl@$ ! |
|
01.10.2010, 19:39 | #2 |
Участник
|
Под "стандартной" понимается автоотчет? А зачем Вы в Excel выгружали? Выгружайте в TXT (файл ASCII), потом открывайте полученный файл в Excel.
|
|
01.10.2010, 20:30 | #3 |
Участник
|
Под "стандартной" понимается кнопка выгруза в Эксель на форме (Ctrl+E).
Я не выгружал в Эксель, я выгружал в CSV а потом открывал полученный файл в Эксель, что подозреваю по скорости должно быть стравнимо с использованием TXT. Автоотчет(Ctrl+P) занимает еще больше времени.
__________________
_databaseTransDelete ... bl@$ ! |
|
06.10.2010, 12:52 | #4 |
Участник
|
Можно использовать класс ComExcelDocument_RU. Я бы для удобства даже создал бы собственный класс для работы с CSV. Возможно это сократит выгрузку до 2-3 минут.
__________________
// no comments |
|
06.10.2010, 20:21 | #5 |
Участник
|
Это как раз то что я сделал.
Доступа к *RU классам нет.
__________________
_databaseTransDelete ... bl@$ ! |
|
11.10.2010, 14:53 | #6 |
MCTS
|
DTD, попробуйте вот это Классы для генерации отчетов в Excel . Кстати, у нас этот класс довольно таки переработан, там по ссылке лежит старая версия, так что если заинтересуетесь, выложу новую.
|
|
11.10.2010, 15:46 | #7 |
Участник
|
Eldar9x
А Ваш класс можно адаптировать для работы с картинками? Прайс по номенклатуре с картинками хотят. Вот и пытаюсь сообразить, как это лучше сделать. У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то). С XML просто не в курсе, как сделать. В идеале, конечно, хотелось бы вставлять не ссылку на картинку, а бинарную информацию из контейнерного поля Axapta, ну, или из файла. Чтобы полученный файл был самодостаточен. Без необходимости тащить набор файлов. |
|
11.10.2010, 16:07 | #8 |
Участник
|
Вот так для таблицы. А как из формы выгружать, думаю сами прикрутите...
X++: AsciiIo txtFile; Inventtable Inventtable; ; txtFile = new AsciiIo( 'C:\\test.csv' ,"W"); txtFile.outFieldDelimiter( num2char(9) ); // разделитель = табуляция txtFile.writeExp(['ItemId', 'ItemName']); while select inventtable { txtFile.writeExp( [Inventtable.ItemId,inventtable.itemname] ); } |
|
11.10.2010, 16:11 | #9 |
Ищущий знания...
|
Цитата:
Сообщение от Владимир Максимов
Eldar9x
А Ваш класс можно адаптировать для работы с картинками? Прайс по номенклатуре с картинками хотят. Вот и пытаюсь сообразить, как это лучше сделать. У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то). С XML просто не в курсе, как сделать. В идеале, конечно, хотелось бы вставлять не ссылку на картинку, а бинарную информацию из контейнерного поля Axapta, ну, или из файла. Чтобы полученный файл был самодостаточен. Без необходимости тащить набор файлов. картинки хранятся в табличке CompanyImage. 1. при заполнении строк отчета сохраняется номер строки, куда будет вставляться картинка, и ItemId. 2. когда уже весь отчет заполнен и выведен выполняется вставка картинок. пробегаемся по контейнеру, заполненному в пункте 1, и для каждой строки вставляем картинку. вот пример кода вставки картинки: X++: Image pictureImage; CompanyImage companyImage; COM Range; ExcelRange rng; Image Image = new Image(); ; companyImage = inventTable::find(_ItemID).CompanyImage(); try { if (CompanyImage.Image) { Image.setData(CompanyImage.Image); Image.resize(128,96,3); // тут нужный размер подгоняется Range = excel.Range(i,j); // i - номер строки, j - столбец Range.select(); Image.clipboardCopy(); excel.WorkSheetCur().pasteSpecial(0); // 1 - "Text only" mode } } catch (EXCEPTION::Warning) { error(StrFmt("@SYS19312",CompanyImage.Image)); }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 11.10.2010 в 17:39. Причина: подредактировал код |
|
|
За это сообщение автора поблагодарили: Zabr (3). |
11.10.2010, 16:20 | #10 |
Administrator
|
Цитата:
Собственно - стояла такая же задача. Что делал: а) Воспользовался семейством классов SysExcelApplication* чтобы не заморачиваться между 2007-м и 2003-м офисом. б) Использовал шаблон, в который вставлял данные. Ориентировался на ширину ячеек, заданную в шаблоне. в) Ячейки заполнял как обычно - циклом - т.е. безо всяких там массивов и буферов обмена. г) Картинки брал из аттачей. Там штатный код распаковывает во временную папку файл. Что удобно - этот код сразу анализирует как хранится файл. Т.е. немного понадергав строчек кода - получил путь к файлу (постоянному или временно распакованному) д) Через объект Picture (Excel-ный) вставлял картинку (при вставке скармливается путь к файлу) е) Получал координаты вставленной картинки. Получал координаты конкретного столбца текущей строки (т.е. текущей ячейки) ж) Через методы Picture.ShapeRange().Scale* масштабировал картинку до нужной ширины (высота автоматически изменялась) с учетом существования (и очень небольшого) предела по высоте ячейки (по ширине предел тоже существует - но я смотрел на ширину из шаблона) Собсно все... Скорость конечно не ахти... Но дождаться можно. Эффектно. Но бестолково . Потому что следующее - с чем столкнулись манагеры - это с тем - что этот прайс (фактически - коммерческое предложение) очень много весит в мегабайтах. А если они и могут отправить такой прайс - то получатель (особенно в регионах) с интернетом со скоростью диалапа утомляется получать данный файл. В результате - они его уже ручками урезают (удаляя картинки) и уже шлют
__________________
Возможно сделать все. Вопрос времени |
|
11.10.2010, 18:46 | #11 |
Участник
|
Спасибо, конечно, только ведь картинка в Excel находится "поверх" самого листа. Т.е. изменение размер ячеек не приводит к изменению картинки. Частично, это решается через
ActiveSheet.Shapes("Picture 1").Placement = xlMoveAndSize Т.е. в свойствах картинки на закладке "Свойства" установить переключатель "Привязка объекта к фону" в положение "Перемещать и изменять объект вместе с ячейками". Но эта штука, во-первых, работает только в случае, если линии сетки находятся внутри области картинки (или на границе), а, во-вторых, никак не препятствуют перемещению самой картинки по листу. Вот я и спрашиваю, может через XML можно интегрировать картинку в лист Excel ? Т.е. действительно интегрировать, а не "сделать вид". |
|
12.10.2010, 10:57 | #12 |
Участник
|
Можно использовать защиту листа (картинка, как защищаемый объект, а ячейки - нет) - картинку нельзя будет двигать мышью, но при изменениях смежных ячеек она будет изменять положение.
К сожалению, задать картинку, как фон для ячейки нельзя даже в 2010-м офисе, по-этому и через xml это сделать тоже нельзя
__________________
Axapta v.3.0 sp5 kr2 |
|
12.10.2010, 11:17 | #13 |
MCTS
|
Цитата:
Сообщение от Владимир Максимов
Eldar9x
А Ваш класс можно адаптировать для работы с картинками? Прайс по номенклатуре с картинками хотят. Вот и пытаюсь сообразить, как это лучше сделать. У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то). С XML просто не в курсе, как сделать. В идеале, конечно, хотелось бы вставлять не ссылку на картинку, а бинарную информацию из контейнерного поля Axapta, ну, или из файла. Чтобы полученный файл был самодостаточен. Без необходимости тащить набор файлов. |
|