Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
Хотелось бы нарисовать, например, заголовок, оформить его в соответствии с дизайном, расположение текста, шрифты, обводку и т.д., и потом одним махом сформировать код для дельфи, чтобы программно его создавать.
Рисую заголовок программно, нужно учесть все нюансы текста, объединения ячеек, ориентацию шрифтов, уже второй час, это не вариант.
26 дек 17, 12:51    [21062867]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24624
Я-бы начал с создания шаблона в экселе с нужными диапазонами, которые уже отформатированы.
Остается только заполнить диапазоны данными.
26 дек 17, 12:55    [21062881]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
wadman
Я-бы начал с создания шаблона в экселе с нужными диапазонами, которые уже отформатированы.
Остается только заполнить диапазоны данными.

Там в одном листе несколько таблиц, располагающихся одни под другими и сбоку от них, и количество строк каждой таблицы заранее неизвестно. Поэтому позиция очередной таблицы должна гулять по листу в произвольном направлении.
26 дек 17, 13:02    [21062904]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
Не мембер
Guest
А вы заполняйте данными таблицы на других листах, а с них ссылки с переносом данных на шаблонный лист
26 дек 17, 13:19    [21062960]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
sereginseregin
Member

Откуда:
Сообщений: 170
svnvlad,
выгрузка для Ehgrid с шапкой и итогами

Полубесплатный старый ActiveX компонент, Вначале рисуешь шаблон в Excel с ключевыми словами, затем запускаешь генерацию отчета. С ограничениями можно справиться, но не уверен что заработает в последних Excel

В исходниках проекта Ананас на С++ можно позаимствовать алгоритмы заполнения шаблонов Calc, по аналогии с предыдущим компонентом ActiveX
26 дек 17, 13:37    [21063052]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
[quot sereginseregin]svnvlad,
выгрузка для Ehgrid с шапкой и итогами

Ну там посложней вариант, данная версия не прокатит. (см. рис.).

Представляется более реальным что-то типа хранения заголовков, одного пустого блока данных и футера, и копирования-вставки в итоговый лист после заполнения строк данных.

К сообщению приложен файл. Размер - 61Kb
26 дек 17, 13:49    [21063107]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
Не мембер
А вы заполняйте данными таблицы на других листах, а с них ссылки с переносом данных на шаблонный лист

Можно подробней про перенос данных ссылками?
26 дек 17, 13:50    [21063112]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
sereginseregin
Member

Откуда:
Сообщений: 170
svnvlad
Представляется более реальным что-то типа хранения заголовков, одного пустого блока данных и футера, и копирования-вставки в итоговый лист после заполнения строк данных.

Второй и третий вариант как раз для этого
Рисуете шапки и подвалы таблиц, одну (или несколько) строк между ними для табличной части с указанием имен полей и специальных тегов. Алгоритм находит нужные места, дублирует строку табличной части по количеству строк в данных, заносит значения в ячейки.
26 дек 17, 14:03    [21063175]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 54505
Блог
svnvlad
Рисую заголовок программно, нужно учесть все нюансы текста, объединения ячеек, ориентацию шрифтов, уже второй час, это не вариант.

Это не вариант, это идиотизм.

Лично я лет двадцать назад делал так: давал аналитикам нарисовать шаблон отчёта, с помощью Named Cells отмечал места, куда нужно вставлять данные, и оставалось только сделать заполнение отчёта в пять строк типа WriteQueryToExcel(qSomeData, MyExcel) и сказать "калечьте шаблон как хотите, меня это уже не касается".
26 дек 17, 16:56    [21064087]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
softwarer
svnvlad
Рисую заголовок программно, нужно учесть все нюансы текста, объединения ячеек, ориентацию шрифтов, уже второй час, это не вариант.

Это не вариант, это идиотизм.

Лично я лет двадцать назад делал так: давал аналитикам нарисовать шаблон отчёта, с помощью Named Cells отмечал места, куда нужно вставлять данные, и оставалось только сделать заполнение отчёта в пять строк типа WriteQueryToExcel(qSomeData, MyExcel) и сказать "калечьте шаблон как хотите, меня это уже не касается".

А можно подробнее про Named Cells, и где об этом почитать?
Такой шаблон позволит работать с динамически изменяемым размером массивов данных? Как на рисунке - расположение нижней таблицы будет определяться количеством строк верхней таблицы.
27 дек 17, 01:01    [21065245]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24624
svnvlad
А можно подробнее про Named Cells, и где об этом почитать?

Это то, что я назвал диапазоном. Настраивается в диспетчере имен закладки "Формулы".
27 дек 17, 08:50    [21065459]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
wadman,

почитал про именованные диапазоны. Это не самое страшное. Можно и по адресам ячеек добавлять данные, разница небольшая.
Самое трудное - это сдвинуть вниз футер таблицы, чтобы вставить нужное количество строк данных.
Алгоритм видится такой:
1. Создаем шаблон, состоящий из 4 листов - по одной таблице на каждом листе. В таблице только шапка, один пустой блок данных и футер. Таблица расчерчена, обводка и форматирование ячеек сформированы.
2. При вставке данных из дельфи с каждой новой вставляемой строкой данных:
- вставляем перед футером пустую строку (или 2 строки, смотря какой блок данных);
- копируем пустой блок данных и вставляем его в эти новые 2 строки - это для того, чтобы скопировалось форматирование и объединенные ячейки;
- вставляем из дельфи данные в первый пустой блок;
- повторяем в зависимости от количества импортируемых строк данных.
3. Удаляем лишний хвостовой пустой блок перед футером.
4. В футер заносим итоги.
5. Таким же образом заполняем остальные 3 таблицы на 3 листах.
6. Создаем новый 5-й лист, и делаем Copy-Paste 3-х заполненных таблиц с листов 1,2,3,4 на лист 5 в соответствии с объемом сформированных таблиц.
7. Удаляем листы 1,2,3,4.
8. Сохраняем файл.
27 дек 17, 09:42    [21065562]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 54505
Блог
svnvlad
Такой шаблон позволит работать с динамически изменяемым размером массивов данных?

Шаблон - это шаблон. Как напишешь работу с ним, так и позволяет. Named Cells нужны как раз для того, чтобы при вставке датасета, когда дальнейшие строки сдвинулись вниз, легко найти место, куда вставлять следующий набор данных. Основная сложность на самом деле в другом - сделать так, чтобы когда разные данные выводятся "в две колонки" (разной длины), сделать так, чтобы общий футер сдвинулся правильно (не ломаясь, на максимум из их длин), но при этом более короткая из таблиц не залила бы своим форматированием нижележащие пустые строки.
27 дек 17, 10:32    [21065722]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
softwarer
svnvlad
Такой шаблон позволит работать с динамически изменяемым размером массивов данных?

Шаблон - это шаблон. Как напишешь работу с ним, так и позволяет. Named Cells нужны как раз для того, чтобы при вставке датасета, когда дальнейшие строки сдвинулись вниз, легко найти место, куда вставлять следующий набор данных. Основная сложность на самом деле в другом - сделать так, чтобы когда разные данные выводятся "в две колонки" (разной длины), сделать так, чтобы общий футер сдвинулся правильно (не ломаясь, на максимум из их длин), но при этом более короткая из таблиц не залила бы своим форматированием нижележащие пустые строки.

Подойдет ли вышеприведенный алгоритм (в моем сообщении выше), или именованный шаблон сам отодвигает футер при вставке данных?
Есть ли у вас пример работы с именованными диапазонами, например, для вставки таких блоков данных (где высота - 2 строки и есть объединения ячеек)?

К сообщению приложен файл. Размер - 37Kb
27 дек 17, 10:42    [21065758]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
Василий №2
Guest
svnvlad
Алгоритм видится такой

Да, я у себя так и делаю.
Только я прямо в ячейках размещаю подстановки типа #Name#, которые потом заменяются на соответствующее поле из набора данных
27 дек 17, 10:46    [21065771]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 54505
Блог
svnvlad
Подойдет ли вышеприведенный алгоритм (в моем сообщении выше)

Наверное, да. Я с таким не парился, но для совсем сложных отчётов, наверное, так действительно удобнее.

svnvlad
или именованный шаблон сам отодвигает футер при вставке данных?

Шаблон - это шаблон. Футер отодвигает команда "вставить строку" Экселя. Команда вызывается из той самой процедуры, которая выводит датасет.

svnvlad
Есть ли у вас пример работы с именованными диапазонами, например, для вставки таких блоков данных (где высота - 2 строки и есть объединения ячеек)?

Не помню. Я делал это где-то в двухтысячном году, сделал API, которого хватало под требовавшиеся отчёты и с тех пор к нему не возвращался.
27 дек 17, 10:53    [21065792]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
Василий №2
svnvlad
Алгоритм видится такой

Да, я у себя так и делаю.
Только я прямо в ячейках размещаю подстановки типа #Name#, которые потом заменяются на соответствующее поле из набора данных

#Name# имеется в виду в ячейках такие идентификаторы прописаны? И производится перебор ячеек внутри экселя на нахождение и замену этой ячейки на данные?
27 дек 17, 11:17    [21065880]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
sereginseregin
Member

Откуда:
Сообщений: 170
svnvlad
1. Создаем шаблон, состоящий из 4 листов - по одной таблице на каждом листе. В таблице только шапка, один пустой блок данных и футер. Таблица расчерчена, обводка и форматирование ячеек сформированы.
...
6. Создаем новый 5-й лист, и делаем Copy-Paste 3-х заполненных таблиц с листов 1,2,3,4 на лист 5 в соответствии с объемом сформированных таблиц.
7. Удаляем листы 1,2,3,4.

Если у таблиц разное количество колонок с разной шириной - поедет форматирование после копирования
Помимо Named Cells, необходимо служебными словами указывать секции (блоки) - строки для заполнения табличными данными. В Tera XL Report справа для каждого блока указывается в первой строке блока #begin table1, к последней строке блока #end table1. В Ананасе в строке любой колонки [:table_section1:]. Табличных секций (блоков) на одном листе может быть много.
svnvlad
2. При вставке данных из дельфи с каждой новой вставляемой строкой данных:
- вставляем перед футером пустую строку (или 2 строки, смотря какой блок данных);
- копируем пустой блок данных и вставляем его в эти новые 2 строки - это для того, чтобы скопировалось форматирование и объединенные ячейки;
- вставляем из дельфи данные в первый пустой блок;
- повторяем в зависимости от количества импортируемых строк данных.
3. Удаляем лишний хвостовой пустой блок перед футером.

Главное определить начало и конец (строки) табличного блока по служебным словам. Копировать блок (эти строки) по количеству записей в datasete.

Вообще подобные отчеты генерим в 4 этапа
1. Заполняются именованные ячейки Шапки-Подвала отчета (Одна запись из датасета)
2. В цикле именованные табличные части заполняется из своих датасетов
3. Файл сохраняется во временную папку в виде шаблона
4. Открывается сохраненный файл-шаблон
27 дек 17, 11:40    [21066002]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
Василий №2
Guest
svnvlad
#Name# имеется в виду в ячейках такие идентификаторы прописаны? И производится перебор ячеек внутри экселя на нахождение и замену этой ячейки на данные?

Ну да. У меня вставка данных только в одну строку ячеек, так что перебор простой.
27 дек 17, 18:15    [21067830]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24624
svnvlad
Василий №2
пропущено...

Да, я у себя так и делаю.
Только я прямо в ячейках размещаю подстановки типа #Name#, которые потом заменяются на соответствующее поле из набора данных

#Name# имеется в виду в ячейках такие идентификаторы прописаны? И производится перебор ячеек внутри экселя на нахождение и замену этой ячейки на данные?

Не нужно перебирать: у Range вместо координат можно указать строковое значение наименования.
27 дек 17, 18:50    [21067920]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24624
var app, a, w, ra, r: OleVariant;
begin
  app := CreateOleObject('Excel.Application');
  app.Application.EnableEvents := False;
  app.DisplayAlerts := false;
  app.WorkBooks.Open('C:\ARMS\templ.xlsx');
  w := app.WorkBooks[1];
  a := w.ActiveSheet;
  r := a.Range['DATA'];

Как-то так.
28 дек 17, 09:02    [21068772]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
sereginseregin
svnvlad,
выгрузка для Ehgrid с шапкой и итогами

Полубесплатный старый ActiveX компонент, Вначале рисуешь шаблон в Excel с ключевыми словами, затем запускаешь генерацию отчета. С ограничениями можно справиться, но не уверен что заработает в последних Excel

В исходниках проекта Ананас на С++ можно позаимствовать алгоритмы заполнения шаблонов Calc, по аналогии с предыдущим компонентом ActiveX


Скачал Afalina XL Report, изучил, но он как-то странно глючит. Первый запуск нормально, но выводит только одну строку данных с обрезанными данными. А последующие запуски выдает OLE-ошибку, пока не создашь новый такой же шаблон с нуля. Короче, не работает.

Попробую Tera XL Report.

Жалко, что такие хорошие компоненты, и канули в лету. А новых никто не делает, что странно!
29 дек 17, 10:16    [21071848]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
vavan
Member

Откуда: Казань
Сообщений: 3195
svnvlad, а flexcel не подошел? не уверен правда что он умеет в несколько строк выводить
29 дек 17, 10:18    [21071854]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
sereginseregin
Member

Откуда:
Сообщений: 170
svnvlad
Жалко, что такие хорошие компоненты, и канули в лету. А новых никто не делает, что странно!

Поэтому сооудили для себя в Calc по аналогии с Ананасом. Создаем шаблон в Calc. Распаковываем, Парсим, Генерим XML, затем упаковываем обратно, и открываем пользователю готовый отчет в Calc.
Какое-то время думал в Excel xlsx такое сделать, но там формат намудрили. Есть упрощенный Excel XML, который не упаковывается, но с ним есть тоже нюансы после открытия файла.
29 дек 17, 10:34    [21071907]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3604
sereginseregin
svnvlad
Жалко, что такие хорошие компоненты, и канули в лету. А новых никто не делает, что странно!

Поэтому сооудили для себя в Calc по аналогии с Ананасом. Создаем шаблон в Calc. Распаковываем, Парсим, Генерим XML, затем упаковываем обратно, и открываем пользователю готовый отчет в Calc.
Какое-то время думал в Excel xlsx такое сделать, но там формат намудрили. Есть упрощенный Excel XML, который не упаковывается, но с ним есть тоже нюансы после открытия файла.
в xml картинку не получится вставить, сразу всё на корню режет

svnvlad
Василий №2
пропущено...

Да, я у себя так и делаю.
Только я прямо в ячейках размещаю подстановки типа #Name#, которые потом заменяются на соответствующее поле из набора данных

#Name# имеется в виду в ячейках такие идентификаторы прописаны? И производится перебор ячеек внутри экселя на нахождение и замену этой ячейки на данные?
там отдельная коллекция есть со всеми Named полями

wadman
svnvlad
пропущено...

#Name# имеется в виду в ячейках такие идентификаторы прописаны? И производится перебор ячеек внутри экселя на нахождение и замену этой ячейки на данные?

Не нужно перебирать: у Range вместо координат можно указать строковое значение наименования.

плохо тем, что ячейку могут удалить, например она не нужна. Лучше забрать весь список полей и по нему заполнять что можно
29 дек 17, 11:13    [21072025]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
Comments
Guest
Программно - подсматривать в макрос - но зачем, шаблон с реперными точками вроде гибче.
#Name# имеется в виду в ячейках такие идентификаторы прописаны?
Можно в "примечание" записать. Потом пройтись по Sheet.Comments, получив нужные Text, Row, Column.
Потом удалить или повторно посмотреть Row, Column уже после сдвигов-вставок.
29 дек 17, 15:20    [21072965]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
svnvlad
Member

Откуда:
Сообщений: 1963
Использовал вот это:
http://blog.a7in.com/генератор-отчетов-excel-delphi/

Немного дописал исходный код, чтобы можно было размещать таблицы справа от других таблиц.
12 янв 18, 11:22    [21100567]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30818
svnvlad
Использовал вот это:
http://blog.a7in.com/генератор-отчетов-excel-delphi/

Немного дописал исходный код, чтобы можно было размещать таблицы справа от других таблиц.
Хорошая штука, но жутко медленная.

2-3 маленьких строки/сек это медленно.
12 янв 18, 12:51    [21101000]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
чччД
Guest
LSV
svnvlad
Использовал вот это:
http://blog.a7in.com/генератор-отчетов-excel-delphi/

Немного дописал исходный код, чтобы можно было размещать таблицы справа от других таблиц.
Хорошая штука, но жутко медленная.

2-3 маленьких строки/сек это медленно.

1. Непонятно, как ты добился таких тормозов.
2. Что мешает отказаться от OLE - доступа? Берешь любую библиотеку, работающую с файлом икселя "напрямую", немного медитируешь над кодом - и ощасте! Все быстро.
12 янв 18, 15:45    [21101979]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли быстрый способ программного написания отчетов Excel?  [new]
Vlad F
Member

Откуда:
Сообщений: 349
svnvlad,

"когда я на почте служил ямщиком", то эмпирическим способом вывел для себя лучший, имхо, на тот момент XLReport. И много чего с его помощью удалось удобно для пользователей, по отзывам, автоматизировать. Посмотрте, м.б. от него и сейчас еще что-то осталось.
12 янв 18, 23:58    [21103638]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить