Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Вниз

Сложный отчет в формате RTF   Найти похожие ветки 

 
Opilki_Inside ©   (2004-05-26 18:06) [0]

Есть программа, она формирует отчет, который состоит скажем из 200 листов. Отчет содежрит в себе кучу разных таблиц (название талблицы, шапка, итого)...

Проблема такая: иногда название таблицы остается на одной странице, а содержимое улетает на другую, или графа "итого" переходит на следующию страницу...

Как этого избежать? Может кто сталкиволся с этим?

Причем надо сделать это всё с помощью компонентов с открытым кодом, или же вовсе руками на уровне тегов RTF...

Может можно как-то узновать на какой странице расположено то или иное слово? Например, с помощью вызова preview...

И вообще, куда копать?


 
Jeer ©   (2004-05-26 18:23) [1]

В сторону разработчика этой программы.


 
Opilki_Inside ©   (2004-05-27 18:12) [2]

блин! в этом вопрос и состит.. разработчик-то - Я !

Может кто подскажет, чем вы пользуитесь при создании отчетов?


 
KADAN ©   (2004-05-28 07:26) [3]

есть такой тег \page - перенос на следующую страницу (или "разрыв страницы" как его называет ворд)


 
Курдль ©   (2004-05-28 09:49) [4]


> Может можно как-то узновать на какой странице расположено
> то или иное слово?

Узновать это можно только подготовив графический образ отчета, причем с учетом того принтера, на котором предполагается печать отчета. Средствами RTF это сделать нельзя.
Но все это легко делается отчетными инструментами "...Report".
Можно еще управлять вордом через COM, но получать вразумительные данные от него гораздо сложнее, чем передавать. Однако чуть более умные люди таблицы делают на Ёкселе.


 
Opilki_inside   (2004-05-30 17:46) [5]

есть такой тег \page - перенос на следующую страницу (или "разрыв страницы" как его называет ворд)

Я в курсе, только как мне узнать когда нужно на следующую страницу переносить, а когда не надо?

Можно еще управлять вордом через COM, но получать вразумительные данные от него гораздо сложнее, чем передавать. Однако чуть более умные люди таблицы делают на Ёкселе.

Не, такое не подойдет... Всё работает под Windows TSE, а клиентские машины на Линуксах... "Ёксель" и MS Word использовать нельзя...

Просто я думал, может в RTF есть какой-нибудь тег который делает так, что бы выделенные слова могли находиться только на одной странице... или что-то в этом духе...


 
YurikGl ©   (2004-05-30 20:07) [6]

Не знаю, поможет ли, но я приведу код формирования документа, где формируются таблицы. Причем, название таблицы не отрывается от самой таблицы, а сама таблица не разрывается, если есть возможность. Ключевые строчки я выделил.
Проверено 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-31 22:15) [7]

Я идею понял. Только у меня код немного подклюкивает, красный фонарь иногда вылетает....
Можно немного поподробнее?


 
YurikGL ©   (2004-05-31 22:17) [8]

Что именно?

Где красный фонарь вылетает?


 
Opilki_Inside ©   (2004-06-01 10:36) [9]

Спасибо огромное! Всё заработало!
Даже после конвертации в RTF, таблица отображется так как я хотел, осталось только найти какие теги за что отвечают, а это уже дело времени!

Еще раз спасибо!



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.034 c
1-1087279731
Olsher
2004-06-15 10:08
2004.06.27
Как выяснить, работает ли программа или уже завершилась?


1-1086763480
pasha_golub
2004-06-09 10:44
2004.06.27
Производительность (оптимизация) функции


1-1086674913
MakNik
2004-06-08 10:08
2004.06.27
Oкругление


3-1085639743
lightix
2004-05-27 10:35
2004.06.27
Вызов хранимой процедуры в ODAC


6-1083507240
karls
2004-05-02 18:14
2004.06.27
tserversocket и tclientsocket? Как подключаться по инету...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский