|
|
#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@$ ! |
|
|
|
|
#2 |
|
Участник
|
Под "стандартной" понимается автоотчет? А зачем Вы в Excel выгружали? Выгружайте в TXT (файл ASCII), потом открывайте полученный файл в Excel.
|
|
|
|
|
#3 |
|
Участник
|
Под "стандартной" понимается кнопка выгруза в Эксель на форме (Ctrl+E).
Я не выгружал в Эксель, я выгружал в CSV а потом открывал полученный файл в Эксель, что подозреваю по скорости должно быть стравнимо с использованием TXT. Автоотчет(Ctrl+P) занимает еще больше времени.
__________________
_databaseTransDelete ... bl@$ ! |
|
|
|
|
#4 |
|
Участник
|
Можно использовать класс ComExcelDocument_RU. Я бы для удобства даже создал бы собственный класс для работы с CSV. Возможно это сократит выгрузку до 2-3 минут.
__________________
// no comments |
|
|
|
|
#5 |
|
Участник
|
Это как раз то что я сделал.
Доступа к *RU классам нет.
__________________
_databaseTransDelete ... bl@$ ! |
|
|
|
|
#6 |
|
MCTS
|
DTD, попробуйте вот это Классы для генерации отчетов в Excel . Кстати, у нас этот класс довольно таки переработан, там по ссылке лежит старая версия, так что если заинтересуетесь, выложу новую.
|
|
|
|
|
#7 |
|
Участник
|
Eldar9x
А Ваш класс можно адаптировать для работы с картинками? Прайс по номенклатуре с картинками хотят. Вот и пытаюсь сообразить, как это лучше сделать. ![]() У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то). С XML просто не в курсе, как сделать. В идеале, конечно, хотелось бы вставлять не ссылку на картинку, а бинарную информацию из контейнерного поля Axapta, ну, или из файла. Чтобы полученный файл был самодостаточен. Без необходимости тащить набор файлов. |
|
|
|
|
#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] );
} |
|
|
|
|
#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). | |
|
|
#10 |
|
Administrator
|
Цитата:
Собственно - стояла такая же задача. Что делал: а) Воспользовался семейством классов SysExcelApplication* чтобы не заморачиваться между 2007-м и 2003-м офисом. б) Использовал шаблон, в который вставлял данные. Ориентировался на ширину ячеек, заданную в шаблоне. в) Ячейки заполнял как обычно - циклом - т.е. безо всяких там массивов и буферов обмена. г) Картинки брал из аттачей. Там штатный код распаковывает во временную папку файл. Что удобно - этот код сразу анализирует как хранится файл. Т.е. немного понадергав строчек кода - получил путь к файлу (постоянному или временно распакованному) д) Через объект Picture (Excel-ный) вставлял картинку (при вставке скармливается путь к файлу) е) Получал координаты вставленной картинки. Получал координаты конкретного столбца текущей строки (т.е. текущей ячейки) ж) Через методы Picture.ShapeRange().Scale* масштабировал картинку до нужной ширины (высота автоматически изменялась) с учетом существования (и очень небольшого) предела по высоте ячейки (по ширине предел тоже существует - но я смотрел на ширину из шаблона) Собсно все... Скорость конечно не ахти... Но дождаться можно. Эффектно. Но бестолково . Потому что следующее - с чем столкнулись манагеры - это с тем - что этот прайс (фактически - коммерческое предложение) очень много весит в мегабайтах. А если они и могут отправить такой прайс - то получатель (особенно в регионах) с интернетом со скоростью диалапа утомляется получать данный файл.В результате - они его уже ручками урезают (удаляя картинки) и уже шлют
__________________
Возможно сделать все. Вопрос времени |
|
|
|
|
#11 |
|
Участник
|
Спасибо, конечно, только ведь картинка в Excel находится "поверх" самого листа. Т.е. изменение размер ячеек не приводит к изменению картинки. Частично, это решается через
ActiveSheet.Shapes("Picture 1").Placement = xlMoveAndSize Т.е. в свойствах картинки на закладке "Свойства" установить переключатель "Привязка объекта к фону" в положение "Перемещать и изменять объект вместе с ячейками". Но эта штука, во-первых, работает только в случае, если линии сетки находятся внутри области картинки (или на границе), а, во-вторых, никак не препятствуют перемещению самой картинки по листу. Вот я и спрашиваю, может через XML можно интегрировать картинку в лист Excel ? Т.е. действительно интегрировать, а не "сделать вид". |
|
|
|
|
#12 |
|
Участник
|
Можно использовать защиту листа (картинка, как защищаемый объект, а ячейки - нет) - картинку нельзя будет двигать мышью, но при изменениях смежных ячеек она будет изменять положение.
К сожалению, задать картинку, как фон для ячейки нельзя даже в 2010-м офисе, по-этому и через xml это сделать тоже нельзя
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|
|
#13 |
|
MCTS
|
Цитата:
Сообщение от Владимир Максимов
Eldar9x
А Ваш класс можно адаптировать для работы с картинками? Прайс по номенклатуре с картинками хотят. Вот и пытаюсь сообразить, как это лучше сделать. ![]() У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то). С XML просто не в курсе, как сделать. В идеале, конечно, хотелось бы вставлять не ссылку на картинку, а бинарную информацию из контейнерного поля Axapta, ну, или из файла. Чтобы полученный файл был самодостаточен. Без необходимости тащить набор файлов. |
|
|