Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > 32-битные компиляторы > Создание отчета в *.odt


Автор: alexsa 13.07.11, 18:31
Скажу сразу, я программист не профессионал, скорее - любитель.
Пишу редко, по необходимости. Есть задача - нахожу решение, насколько оно правильное, не знаю, главное все работает. Это я написал, чтобы сильно не плевались, если кому не понравится - пишу для тех, кому может пригодится.
Итак, есть задача вывести в документ Опенофиса результат работы программы, т.е. отчет, в котором может быть как текст, так и таблицы StringGrid или DbGrid.
Читал на форумах разные решения. Скажу, что ответы находил, но для меня сложные и трудоемкие.
Для себя нашел решение такое. Чем и хочу поделиться.
В компоненте Memo формируем html документ со всеми делами. В разделе <body></body> вставляем заголовки с наших label-ов, Edit-ов, формируем таблицу и считываем туда данные с наших таблиц.
Когда html текст в Memo готов, сохраняем его в файл с расширением *.odt. И все.
Должно получится примерно такое:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Zag:='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
         Memo1.Lines.Add(Zag);
         Memo1.Lines.Add('<html>');
         Memo1.Lines.Add('<head>');
         Memo1.Lines.Add('<title>'+Label1.Caption+'</title>');
         Memo1.Lines.Add('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">');
         Memo1.Lines.Add('</head>');
         Memo1.Lines.Add('<body>');
         Memo1.Lines.Add('<p><h2><em><div align="center">'+Label1.Caption+'</div></em></h2></p>');
         Memo1.Lines.Add('<TABLE width="100%" border="2"><TR>');
         for i:=0 to ColC-2 do
         begin
             q:=strGrOtchet.Columns.Items[i].Width*100 div strGrOtchet.Width;
             Memo1.Lines.Add('<TD align="center" width="'+IntToStr(q)+'%">'+strGrOtchet.Columns.Items[i].Title.Caption+'</TD>');
         end;
         Memo1.Lines.Add('</TR>');
         for j:=1 to RowC-1 do
         begin
             Memo1.Lines.Add('<TR>');
             for i:=1 to ColC-1 do
             begin
                 q:=strGrOtchet.Columns.Items[i-1].Width*100 div strGrOtchet.Width;
                 Memo1.Lines.Add('<TD align="right" width="'+IntToStr(q)+'%">'+strGrOtchet.Cells[i,j]+'</TD>');
             end;
             Memo1.Lines.Add('</TR>');
         end;
         Memo1.Lines.Add('</body>');
         Memo1.Lines.Add('</html>');

Это простой отчет и для примера сгодится. Опенофис его открывает и все там красиво.
Не знаю кому как, а для меня этот вариант вполне приемлемый.

Автор: raxp 13.07.11, 18:54
вот только *.odt в названии темы излишен, с тем же успехом можно создавать отчет в XML и получить еще большую поддержку сторонних приложений.

Да, конечно можно и не читать "[URL=http://www.delphisources.ru/pages/articles/2007_year/art_14_05_07/art_14_05_07_1.html]Первые шаги в автоматизации OpenOffice.Calc
и OpenOffice.Writer под Delphi[/URL]"

Автор: alexsa 13.07.11, 19:06
Цитата raxp @
Да, конечно можно и не читать "[URL=http://www.delphisources.ru/pages/articles/2007_year/art_14_05_07/art_14_05_07_1.html]Первые шаги в автоматизации OpenOffice.Calc
и OpenOffice.Writer под Delphi[/URL]"

Чтож, может быть кому-то удобнее делать так как описано в названной статье, мне проще было сделать так как я сделал.
Сейчас ОС у меня Ubuntu и потому использую Лазарус.
Цитата
"...Сразу оговорюсь, что мы разрабатываем приложение под ОС Windows..."

Цитата из названной статьи.
Когда стоял Windows, работал в Delphi и формировал отчет сразу в Microsoft Word.

Автор: volvo877 14.07.11, 08:33
Цитата alexsa @
мне проще было сделать так как я сделал
В чем был смысл создания поста? Сделал так, как твоей левой пятке захотелось, вместо того, чтобы поискать в Гугле, скажем, LazReport и не изобретать велосипед. Зачем выкладывать-то? Чтоб и другие тоже начали заниматься велосипедостроением, причем некорректным и ненужным?

Цитата alexsa @
Итак, есть задача вывести в документ Опенофиса результат работы программы, т.е. отчет, в котором может быть как текст, так и таблицы StringGrid или DbGrid.
Ложь. С DBGrid все не так просто. У тебя запросто начнутся проблемы с определением количества записей, да и обратиться к Cell на DbGrid-е ты тоже не сможешь. По той простой причине, что нет там этого свойства. Не надо приукрашивать возможности своей поделки. Чтобы заставить ее работать с DbGrid-ом тебе ее придется переписать чуть менее, чем полностью.

Автор: alexsa 14.07.11, 08:46
Цитата volvo877 @
... вместо того, чтобы поискать в Гугле, скажем, LazReport и не изобретать велосипед.

В простых отчетах так проще, чем в LazReport, хотя действительно, с DBGrid так не получится. А выложил действительно для того, чтобы у кого есть с этим проблема, мог ее решить. Ведь главная цель - получить документ и возможно малой кровью. Я считаю, что это самый простой вариант.

Добавлено
Кстати, если Вы, как модератор, считаете этот пост ненужным, можете его удалить. Спасибо.

Автор: raxp 14.07.11, 14:00
намек про XML не сработал :P

Автор: alexsa 14.07.11, 17:24
Цитата raxp @
намек про XML не сработал :P

Намек-то я понял, но переделывать смысла нет. Да и просто все, как три копейки.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)