22.07.2003, 09:53 | #1 |
Участник
|
Экспорт отчета в Excel
Добрый день.
Есть такая задача: Есть обычный аксаптовский отчет. Отчет не очень простой - много чего делается программно. Есть желание данные, которые получаютcя в результате, отправить в Exсel - ну, чтоб не просто напечатать, а еще чего-нить с ними делать можно было. Расскажите пожалуйста, нет ли какого-нибудь более-менее стандартного / общепризнанного решения этой проблемы? Вообще, основная проблема, как мне видится, заключается в том, как после получения отчета поиметь доступ к его данным. Если это можно сделать, то отправить данные в Excel используя ComExсelDocument довольно просто. Возможно ли это? Или я для выполнения этой задачи должен фактически написать новый класс, который будет получать данные также, как это делает исходный отчет? Этого очень не хочется. Поделитесь мыслями на этот счет. |
|
22.07.2003, 10:04 | #2 |
Moderator
|
Цитата:
то отправить данные в Excel используя ComExсelDocument довольно просто. Возможно ли это?
Если у Вас более ранняя версия Аксапты и этого класса просто еще нет, то посмотрите сюда http://www.axforum.info/forums/showt...ighlight=Excel Если у Вас третья Аксапта и нет желания форматировать отчет вручную из Аксапты, что как правило занимает много времени и вызывает много отрицательных эмоций, можно сделать так - создать в Excel'е шаблон отчета, поместить его в Аксаптовские ресурсы, а при построении отчета выгружать этот шаблон например в папку Temp пользователя, заполняя необходимыми данными. Если вы собираетесь делать такие вещи постоянно можно задуматься о написании некоего Framework'а, который облегчит дальнейшее построение отчетов. |
|
22.07.2003, 10:10 | #3 |
Участник
|
У на 3-я аксапта и там есть класс ComExсelDocument_RU. Вопрос не в том как в нужную ячейку Excel'a записать значение, а в том, как получить эти значения из готового аксаптовского отчета.
|
|
22.07.2003, 10:24 | #4 |
Moderator
|
Цитата:
а в том, как получить эти значения из готового аксаптовского отчета.
Поэтому и подход для переделки каждого отчета должен быть индивидуальным. Вам необходимо будет переделать все места где значения всатвляются в отчет так, чтобы они вставлялись в Excel. Ключевые места send(), fetch(), executeSection(). Не удивлюсь, если выяснится, что было проще начать писать отчет заново. p.s. Если отчет простой, то может стоит попробовать вывод в ASCII файл с последующим форматированием в Excel'е. p.s.s. ComExсelDocument_RU всего лишь обертка над COM объектом и ничего магического он не может. |
|
22.07.2003, 10:34 | #5 |
Участник
|
Цитата:
Изначально опубликовано Андре
Поэтому и подход для переделки каждого отчета должен быть индивидуальным. Вам необходимо будет переделать все места где значения всатвляются в отчет так, чтобы они вставлялись в Excel. Ключевые места send(), fetch(), executeSection(). Цитата:
p.s. Если отчет простой, то может стоит попробовать вывод в ASCII файл с последующим форматированием в Excel'е. Цитата:
p.s.s. ComExсelDocument_RU всего лишь обертка над COM объектом и ничего магического он не может. Пока видится такой вариант: 1. Дублированием создать класс и отчет на основе существующих 2. Изменить send(), fetch(), executeSection() так, чтоб печатать в Excel 3. Подавить появление исходного отчета Я правильно понял? Есть ли какие-нибудь другие мысли? |
|
22.07.2003, 10:52 | #6 |
Moderator
|
Цитата:
Я правильно понял? Есть ли какие-нибудь другие мысли?
Цитата:
Не удивлюсь, если выяснится, что было проще начать писать отчет заново.
Просто идеология построения простого отчета и отчета в Excel может сильно отличаться. |
|
22.07.2003, 10:56 | #7 |
Участник
|
Спасибо.
При этом придется лезть вглубь и понимать логику работы этого отчета. Я не говорю, что это очень трудно, но вообще-то хочется использовать готовый код как "черный ящик" 8-) |
|
22.07.2003, 11:05 | #8 |
----------------
|
Черный ящик
Помнится, на одном семинаре в CITP демонстрировали, что-то похожее.. при выводе отчета просто выбираешь "В excel" вместо принтера.
Может быть вам продадут, если доделали. |
|
22.07.2003, 11:13 | #9 |
Участник
|
я делал такую штуку для Axapta 2.5 sp 4 - печать кучи
доков и репортов в Word и Excel.... ничего особо страшного нет. |
|
22.07.2003, 13:43 | #10 |
Участник
|
Вот вариант с выбором "Excel" вместо принтера мне понравился больше. А может кто-нить сказать, каким образом изменяется алгоритм печати? Я пока дошел до формы SysPrintForm, где выбираются варианты, но как указанные там значения влияют на печать пока не нашел. Может, кто-нить знает?
|
|
23.07.2003, 10:55 | #11 |
Участник
|
Для этого, скорее всего, необходимо использовать класс ReportOutputUser. Справка по нему есть во встроенной документации, там же дан небольшой и очень простой пример.
В свое время я попытался было сделать печать отчета в Ексель, но мой энтузиазм быстро угас, когда я понял, что красиво все равно не получится. В итоге это оказалось не столь уж необходимым. В крайнем случае можно печатать отчет в HTML, а потом открывать в Екселе. Выглядит, конечно, страшно, но крайней мере все на месте. |
|
23.07.2003, 11:01 | #12 |
Участник
|
Еще одна подсказка
В качестве работающих (ну или почти работающих ) классов рекомендую посмотреть PDFViewer и WebReportHTML.
|
|
23.07.2003, 13:44 | #13 |
Участник
|
Большое спасибо!
|
|
10.02.2006, 11:49 | #14 |
Участник
|
У меня вопрос по етой же теме. Я создал наследника класса ReportOutputUser и перегрузил все методи так как надо. Вопрос в том как его теперь подклучить к общей логике. Я столкнулся с такойже проблемой. Как это можно обойти? Ко всему прочему в классе ClassFactory.createViewer тоже хотелось бы что-то сделать а не исполйзовать case ReportOutputUserType:: Default: как было приведено в доке для класса ReportOutputUser. Я имею ввиду например case ReportOutputUserType::XLS. Microsoft позакривал все енумы и классы вокруг этой рутини. Наверняка кто-то делал что-то подобное раньше. Поделитесь секретом как ето можно обойти?
С уважением Анатолий |
|
10.02.2006, 16:24 | #15 |
Участник
|
Сам задал вопрос и сам отвечу. Посидел подумал и придумал: HTML использует очень похожие теги как и MS Excel. Тоесть достаточно изменить концовку фаила на .xls и добавить пару значений в используемые емуны и макроси и рапорти со свистом сохраняются в Excel. Если кому интересно могу пояснить как сделал.
С Уважением Анатолий |
|
10.02.2006, 17:14 | #16 |
Moderator
|
В "Правилах форума AXForum" в пункте 2.8 есть такой стринг:
"Ни у кого нет желания вытягивать из Вас эти сведения клещами." Мораль: если Вам самому хочется - расскажите, остальные буду Вам только благодарны, пусть даже и молчаливо. Зайти в ветку и увидеть блок конкретных действий без необходимости делать еще один шаг - запрос автору, всегда удобнее, чем ловить автора, спустя, например, 2-3 года. Подумайте о благодарных потомках... |
|
10.02.2006, 18:07 | #17 |
Участник
|
Рецепт следующий:
1) добавить формат .xls в макрос "File" 2) добавить элемент XLS в энум SysPrintFileType 3) добавить соответствующий уже существующему код в SysPrintForm.findFileNameType() 4) в SysPrintForm.changeFormat() добавить: PHP код:
Всем удачного пользования. С уважением Анатолий |
|
|
За это сообщение автора поблагодарили: Gustav (1). |
13.02.2006, 16:13 | #18 |
Участник
|
Вариант с HTML файлом катит слабо.
В Excel между данными появляются пустые столбцы и Axapta выводит шапку страницы не только на первой странице, но и на всех последующих, т.е. в Excel появляются ненужные строчки и данные никуда не скопируешь. В свое время была задача по реализации вывода любого отчета в Excel, которая и выродилась в создание утилиты. Главная идея вывода, что все данные в отчете выводятся строго по столбцам без прерываний, все остальные элементы подгоняются под них. Технически - создается класс, наследник от reportOutputUser, которые предлагался как viewer при печати, на нем перекрываете большинство методов writeString, writeEnum и т.д. и т.п. Таким образом по завершении работа этого класса у вас есть все элементы и их координаты. Дальше уже ваша фантазия - надо их как-то отобразить на ячейки Excel Описание того, что получилось прилагаю, если есть вопросы по приобретению, то к селзам в Колумбус, утилита продается, если какие-то технические вопросы, то задавайте здесь |
|