|
Вопрос # 3 079/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Как в отчёт RaveReports записать данные из StringGrid ?
 |
Вопрос задал: TihiySap (статус: Посетитель)
Вопрос отправлен: 9 августа 2009, 23:24
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 19 августа 2009, 18:48; участников в обсуждении: 3.
|
Мережников Андрей (статус: Абитуриент), 11 августа 2009, 20:37 [#1]:
наверное проще экспортировать в Excel
|
|
TihiySap (статус: Посетитель), 12 августа 2009, 09:50 [#2]:
А если не хочется привязывать свою прогу к наличию на ПК MS Excel? А Rave Reports насколько знаю интегрируется в exe'шник программы и не требует своей установки... Как вариант - перевод в html с последующим просмотром в броузере. Но здесь другая проблема - html знаю, а вот как и куда вставить разметку в коде программы никак не соображу(
P.S. Если это поможет, вот данные о системе: Win XP sp3, Delphi 10 Lite v3.0
|
|
Вадим К (статус: Академик), 12 августа 2009, 10:28 [#3]:
как вставить разметку? да проще простого.
var sl:TStringList;
begin
//....
sl := TStringList.Create;
try
sl.Add('<html>');
sl.Add('<body'>);
finally
sl.free;
end;
дальше продолжать или идея понятна?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
TihiySap (статус: Посетитель), 14 августа 2009, 16:29 [#4]:
to Вадим К:
спасибо за идею, наконец осилил это "проще простого" 
вот что получилось:
procedure TFRnach.btPrintClick(Sender: TObject);
const
html:string='d:\test.html';
var sl:TStringList;
r,c: integer;
text,styleI,styleO: string;
begin
//StringGrid в html
sl := TStringList.Create;
try
sl.Add('<html>');
sl.Add('<body>');
sl.Add('<table border="' + IntToStr(1) + '"width="' +
IntToStr(tb.Width) + '"height="' + IntToStr(tb.Height) + '">');
for r := 0 to tb.RowCount - 1 do
begin
sl.Add('<tr height="15">');
for c := 0 to tb.ColCount - 1 do
begin
styleI := '';
styleO := '';
if fsbold in tb.Font.Style then
begin
styleI := styleI + '<b>';
styleO := styleO + '</b>';
end;
if fsitalic in tb.Font.Style then
begin
styleI := styleI + '<i>';
styleO := styleO + '</i>';
end;
if fsunderline in tb.Font.Style then
begin
styleI := styleI + '<u>';
styleO := styleO + '</u>';
end;
text := tb.Cells[c,r];
if Text = '' then Text := ' ';
sl.Add('<td width="' + IntToStr(tb.ColWidths[c]) +
'"height="' + IntToStr(tb.DefaultRowHeight) +
'"><font color="#' + IntToHex(tb.Font.Color, 6) +
'"face="' + tb.Font.Name + '">' + styleI +
Text + styleO + '</font></td>');
end;
sl.Add(' </tr>');
end;
sl.Add('</table>');
sl.Add('</body>');
sl.Add('</html>');
sl.SaveToFile('d:\test.html');
// Explore.LoadToFile ('d:\test.html');
ShellExecute(0,'open',pChar(html),NIL,NIL,SW_SHOWNORMAL);
finally
sl.free;
end;
end;
Смущает только ужасная высота строк, как её настроить?
|
|
Вадим К (статус: Академик), 14 августа 2009, 16:36 [#5]:
Что такое "ужасная высота строк"? Или имеется ввиду высота ячеек? ну выставляейте сколько надо. В чем проблема?
И второе. если кол-во текста будет большое (то есть счет пойдет на мегабайты и больше), то лучше писать либо сразу в файл, используя TFileStream или используя "строку в памяти" - TStringStream. При больших объемах данных можно получить хорошую производительность.
Плюс нашел одну ошибку в коде. если текст будет и курсив, и полужирный, то получим такую конструкцию
i u text /i /u (я угловые скобки убрал!)
а это нарушает правило, что хтмл теги должны быть вложеные, а пересечение вне закона. правда броузеры более-менее лояльно относяться к такому. Но переделать легко. Просто завершаюшие теги вместо
styleO := styleO + '';
пишите
styleO := '' + styleO;
Галочка "подтверждения прочтения" - вселенское зло.
|
|
TihiySap (статус: Посетитель), 19 августа 2009, 18:48 [#6]:
Кол-во будет такое: самая бальшая таблица - 11 колонок и строк 100-150.
В коде ещё ошибка была:
это if Text = '' then Text := ' ';
нужно переделать на это if Text = '' then Text := ' ';
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|