![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сложный отчет в формате RTF [D6, D7]
Opilki_Inside © (2004-05-26 18:06:00)Есть программа, она формирует отчет, который состоит скажем из 200 листов. Отчет содежрит в себе кучу разных таблиц (название талблицы, шапка, итого)...
Проблема такая: иногда название таблицы остается на одной странице, а содержимое улетает на другую, или графа "итого" переходит на следующию страницу...
Как этого избежать? Может кто сталкиволся с этим?
Причем надо сделать это всё с помощью компонентов с открытым кодом, или же вовсе руками на уровне тегов RTF...
Может можно как-то узновать на какой странице расположено то или иное слово? Например, с помощью вызова preview...
И вообще, куда копать?
Opilki_Inside (2004-06-01 10:36:00) [1]Спасибо огромное! Всё заработало!
Даже после конвертации в RTF, таблица отображется так как я хотел, осталось только найти какие теги за что отвечают, а это уже дело времени!
Еще раз спасибо!
YurikGL (2004-05-31 22:17:00) [2]Что именно?
Где красный фонарь вылетает?
Opilki_Inside (2004-05-31 22:15:00) [3]Я идею понял. Только у меня код немного подклюкивает, красный фонарь иногда вылетает....
Можно немного поподробнее?
YurikGl (2004-05-30 20:07:00) [4]Не знаю, поможет ли, но я приведу код формирования документа, где формируются таблицы. Причем, название таблицы не отрывается от самой таблицы, а сама таблица не разрывается, если есть возможность. Ключевые строчки я выделил.
Проверено Word2000, WordXP.
Используются компоненты от Office2000
Надеюсь ничего не забуду икодотобразится корректно
W1.Connect;
W1.Visible:=true;
par:=1;
tabl:=0;
inc(par);
W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(заголовок+#13);
W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
W1.Selection.Font:=WF1.Duplicate;
W1.Selection.ParagraphFormat.KeepWithNext:=-1;
W1.Selection.ParagraphFormat.SpaceAfter:=14;
inc(par);
inc(tabl);
DSwap.First;
W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter('Столбец1'+#9+'Столбец2'+#9+'Ðåäàê 246;èÿ'+#9+'Íàèìåíîâàíèå'+#9+'Êîë 232;÷åñòâî');
W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
W1.Selection.Font:=WF2.Duplicate;
W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
par:=par+6;
if DSwap.RecordCount>0 then begin
Repeat
if DSwap.Fields[0].value=null then st:=''
else st:=DSwap.Fields[0].value;
if DSwap.Fields[2].value=null then st:=st+#9+''
else st:=st+#9+DSwap.Fields[2].value;
if DSwap.Fields[3].value=null then st:=st+#9+''
else st:=st+#9+DSwap.Fields[3].value;
if DSwap.Fields[4].value=null then st:=st+#9+''
else st:=st+#9+DSwap.Fields[4].value;
if DSwap.Fields[5].value=null then st:=st+#9+''
else st:=st+#9+IntToStr(DSwap.Fields[5].value);
W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(ConvertString(st)+#13);
W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
W1.Selection.Font:=WF3.Duplicate;
W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
par:=par+6;
DSwap.Next;
until DSwap.Eof;
end else begin
W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(''+#9+''+#9+''+#9+''+#9+''); //Если записей в таблице нет - добавляем пустую строку
W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
W1.Selection.Font:=WF3.Duplicate;
W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
par:=par+6
end;
W1.ActiveDocument.Tables.Item(tabl).Columns.Item(1).Width:=round(1.76*100000/3527);
W1.ActiveDocument.Tables.Item(tabl).Columns.Item(2).Width:=round(3.53*100000/3527);
W1.ActiveDocument.Tables.Item(tabl).Columns.Item(3).Width:=round(2.47*100000/3527);
W1.ActiveDocument.Tables.Item(tabl).Columns.Item(4).Width:=round(5.68*100000/3527);
W1.ActiveDocument.Tables.Item(tabl).Columns.Item(5).Width:=round(2.25*100000/3527);
TableLineSet;//Процедурка, которая прорисовывает все границы таблицы
W1.ActiveDocument.Tables.Item(tabl).Columns.Item(3).Select;
W1.Selection.ParagraphFormat.Alignment:=wdAlignPageNumberCenter;
W1.ActiveDocument.Tables.Item(tabl).Columns.Item(5).Select;
W1.Selection.ParagraphFormat.Alignment:=wdAlignPageNumberCenter;
W1.Selection.ParagraphFormat.KeepWithNext:=-1;
Opilki_inside (2004-05-30 17:46:00) [5]есть такой тег \page - перенос на следующую страницу (или "разрыв страницы" как его называет ворд)
Я в курсе, только как мне узнать когда нужно на следующую страницу переносить, а когда не надо?
Можно еще управлять вордом через COM, но получать вразумительные данные от него гораздо сложнее, чем передавать. Однако чуть более умные люди таблицы делают на Ёкселе.
Не, такое не подойдет... Всё работает под Windows TSE, а клиентские машины на Линуксах... "Ёксель" и MS Word использовать нельзя...
Просто я думал, может в RTF есть какой-нибудь тег который делает так, что бы выделенные слова могли находиться только на одной странице... или что-то в этом духе...
Курдль (2004-05-28 09:49:00) [6]
> Может можно как-то узновать на какой странице расположено
> то или иное слово?
Узновать это можно только подготовив графическийобраз отчета, причем с учетом того принтера, на котором предполагается печать отчета. Средствами RTF это сделать нельзя.
Но все это легко делается отчетными инструментами "...Report".
Можно еще управлять вордом через COM, но получать вразумительные данные от него гораздо сложнее, чем передавать. Однако чуть более умные люди таблицы делают на Ёкселе.
KADAN (2004-05-28 07:26:00) [7]есть такой тег \page - перенос на следующую страницу (или "разрыв страницы" как его называет ворд)
Opilki_Inside (2004-05-27 18:12:00) [8]блин! в этом вопрос и состит.. разработчик-то - Я !
Может кто подскажет, чем вы пользуитесь при создании отчетов?
Jeer (2004-05-26 18:23:00) [9]В сторону разработчика этой программы.