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

Вниз

Чтение количество страниц в документе Word   Найти похожие ветки 

 
saNat   (2008-02-06 11:24) [0]

Доброго времени суток, Мастера :о)

Подскажите, пожалуйста, по данному вопросу. Приложение "делает" выгрузку отчета в Word. Для этого создан шаблон, например, из 2-страниц. За счет выгружаемых данных, объем документа возрастает, например до 3-страниц. На титульном листе нужно указать количество страниц отчета.
Сейчас делаю так:

Function TProjectData.ExportCharge(Path:String):Boolean;
Var
 ExportSource                                          :Variant;
 MySection                                             :Variant;
 SelectionStart                                        :Integer;
 SelectionEnd                                          :Integer;
 Buffer                                                :String;
Begin
Result:=True;
Try
 ExportSource:=CreateOleObject("Word.Application");
 ExportSource.Documents.Add(ExtractFilePath(ParamStr(0))+"\Report.dot");
 //Так заполняем обязательные поля
 ExportSource.Selection.Find.Text:="###Наименование организации###";
 ExportSource.Selection.Find.Replacement.Text:=Value_CompanyName;
 ExportSource.Selection.Find.Execute(Replace:=2);
 //Так заполняю поля в зависимости от наличия или отсутствия (-1) значения
 If Value_N<>-1
  Then
   Begin
    ExportSource.Selection.Find.Text:="###КПГ###";
    ExportSource.Selection.Find.Replacement.Text:="";
    ExportSource.Selection.Find.Execute(Replace:=2);
    ExportSource.Selection.Find.Text:="###КПГЗначение###";
    ExportSource.Selection.Find.Replacement.Text:=IntToStr(Value_N);
    ExportSource.Selection.Find.Execute(Replace:=2);
   End
  Else
   Begin
    ExportSource.Selection.Start:=0;
    ExportSource.Selection.End:=0;
    ExportSource.Selection.Find.Forward:=True;
    ExportSource.Selection.Find.Text:="###КПГ###";
    SelectionStart:=ExportSource.Selection.Start;
    ExportSource.Selection.Find.Execute;
    ExportSource.Selection.Start:=0;
    ExportSource.Selection.End:=0;
    ExportSource.Selection.Find.Forward:=True;
    ExportSource.Selection.Find.Text:="###КПГЗначение###";
    ExportSource.Selection.Find.Execute;
    SelectionEnd:=ExportSource.Selection.End;
    ExportSource.Selection.Start:=SelectionStart;
    ExportSource.Selection.Start:=SelectionEnd;
    ExportSource.Selection.Delete;
    ExportSource.Selection.Rows.Delete;
   End;
 //Снова обязательное поле
 ExportSource.Selection.Find.Text:="###ЕИЗначение###";
 ExportSource.Selection.Find.Replacement.Text:=Value_Units;
 ExportSource.Selection.Find.Execute(Replace:=2);
 //Выполняем нумерацию страниц
 ExportSource.Selection.Start:=0;
 ExportSource.Selection.End:=0;
 MySection:=ExportSource.ActiveDocument.Range.Sections.Item(1);
 MySection.Headers.Item(1).PageNumbers.Add(PageNumberAlignment:=2,FirstPage:=Fals e);
 //Заполняем поле "Количество страниц..."
 Buffer:=ExportSource.ActiveDocument.BuiltInDocumentProperties[$0000000E].Value;
 If Copy(Buffer,Length(Buffer),1)="1"
  Then
    Buffer:=Buffer+" &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#229;"
  Else
    Buffer:=Buffer+" &#241;&#242;&#240;&#224;&#237;&#232;&#246;&#224;&#245;";
 ExportSource.Selection.Find.Text:="###КСЗначение###";
 ExportSource.Selection.Find.Replacement.Text:=Buffer;
 ExportSource.Selection.Find.Execute(Replace:=2);
 //Сохранение документа
 If Path<>""
  Then
    ExportSource.ActiveDocument.SaveAs(Path);
 //Закрываем документ
 ExportSource.ActiveDocument.Close(False);
 //Закрываем MS Word
 ExportSource.Quit;
Except
 Result:=False;
End;
ExportSource:=UnAssigned;
End;

В данном случае нумерация страниц осуществляется, но количесвто страниц указывается неверно. Я где-то неправ?

С уважением, ЕВА.


 
saNat   (2008-02-06 11:27) [1]

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


 
saNat   (2008-02-06 12:24) [2]

Нашел что можно читать свойство Information(wdNumberOfPagesInDocument);

Buffer:=ExportSource.Range.Information(4{wdNumberOfPagesInDocument});

говорит что у Range() нет такого метода :(


 
EvS ©   (2008-02-06 12:27) [3]

> В данном случае нумерация страниц осуществляется, но количесвто
> страниц указывается неверно


И насколько неверно?


 
saNat   (2008-02-06 12:28) [4]

На данный момент в шаблоне 2 страницы. После выгрузки имеем 3, но выводит значение "2"


 
easy ©   (2008-02-06 12:56) [5]

Вставка -> Поле -> Категории -> О документе -> NumPages -> OK
После всех заполнений -
ExportSource.ActiveDocument.Fields.Update;


 
saNat   (2008-02-06 12:58) [6]

Не до конца понял. Счас попробую. Спасибо большое.


 
saNat   (2008-02-06 13:03) [7]

Гм... В принципе то что искал - спасибо. Только возникает момент - после значения нужно вставить "странице/ах". Я правильно понимаю, что бы не читать значение поля из документа можно "внутри" обратиться к полю и прочитать значение?


 
easy ©   (2008-02-06 13:10) [8]


> "странице/ах"

стр.
=)


 
saNat   (2008-02-06 13:16) [9]

;) так заказчица хочет


 
saNat   (2008-02-06 14:22) [10]

Гм... Подскажите, пожалуйста, почему ниже приведенный код работает "не так как хочется".

 //Обновляю поле подстановки
 ExportSource.ActiveDocument.Fields.Update;
 //Выполняю нумерацию страниц
 ExportSource.Selection.Start:=0;
 ExportSource.Selection.End:=0;
 MySection:=ExportSource.ActiveDocument.Range.Sections.Item(1);
 MySection.Headers.Item(1).PageNumbers.Add(PageNumberAlignment:=2,FirstPage:=Fals e);
 //Заполняю подстановку "Отчет выполнен на...."
 Buffer:=IntToStr(ExportSource.ActiveDocument.Fields.Item(1).Result);
 If (Copy(Buffer,Length(Buffer),1)="1")And(StrToInt(Buffer)<>11)
  Then
    Buffer:=" странице ["+Buffer+"]"
  Else
    Buffer:=" страницах ["+Buffer+"]";
 ExportSource.Selection.Find.Text:="###Подстановка###";
 ExportSource.Selection.Find.Replacement.Text:=Buffer;
 ExportSource.Selection.Find.Execute(Replace:=2);


В квадратных скобочках я вывожу значение поля подстановки для контроля. Получаю результаты:

Отчет выполнен на 3 страницах [2]
Отчет выполнен на 2 страницах [2]


Почему оно так?


 
saNat   (2008-02-06 14:29) [11]

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

Отчет выполнен на 4 страницах [3]

:(


 
saNat   (2008-02-06 14:46) [12]

Хм...
Шаблон из себя представляет каркас таблицы (т.е. линии не рисуются). Первый лист - титульный. Далее собственно результаты работы приложения. Грубо говоря, на втором и последующих листах таблица из одного столбца. Сейчас шаблон представляет состоит из 21 страницы. В последней ячейке записано слово test. Запускаю формирование отчета. В методе такой код:

...
//Обновляю поле подстановки
ExportSource.ActiveDocument.Fields.Update;
//Выполняю нумерацию страниц
ExportSource.Selection.Start:=0;
ExportSource.Selection.End:=0;
MySection:=ExportSource.ActiveDocument.Range.Sections.Item(1);
MySection.Headers.Item(1).PageNumbers.Add(PageNumberAlignment:=2,FirstPage:=Fals e);
//Сохранение документа
If Path<>""
 Then
   ExportSource.ActiveDocument.SaveAs(Path);
//Закрываем документ
ExportSource.ActiveDocument.Close(False);
//Закрываем MS Word
ExportSource.Quit;
...


В итоге получаю:

Расчёт выполнен на 3


Что-то вообще не так...


 
saNat   (2008-02-06 14:47) [13]

Забыл сказать, если открыть сгенерированный документ, и щелкнуть по полю, выбрать "Обновить поле", то оно становится равным 21.


 
saNat   (2008-02-06 15:34) [14]

Отчет весь доделал. Вот только с нумерацией этот косяк остался. :(
Подскажите, пожалуйста.


 
saNat   (2008-02-07 00:13) [15]

Доброго времени суток, Мастера (:

Может быть у кого-нибудь из Вас есть идея как поправить проблему?

С уважением, ЕВА


 
saNat ©   (2008-02-07 20:04) [16]

Тема для меня по-прежнему актуальна....


 
EvS ©   (2008-02-07 21:01) [17]

По идее должно работать:

 Buffer:=IntToStr(ExportSource.ActiveDocument.Range.ComputeStatistics($00000002)) ;


 
saNat ©   (2008-02-08 08:26) [18]

Спасибо (: Счас попробую этот вариант...


 
saNat ©   (2008-02-08 14:14) [19]

Помогло (: Большое Вам спасибо.

С уважением, ЕВА.



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

Форум: "Начинающим";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.047 c
2-1202528961
Dmitry S
2008-02-09 06:49
2008.03.02
освобождение памяти дин. массива


6-1181665096
nali
2007-06-12 20:18
2008.03.02
мультипатийный формат http запроса на сервер


2-1201952182
karablik
2008-02-02 14:36
2008.03.02
WMA getMarker


15-1201198455
Embargo
2008-01-24 21:14
2008.03.02
Дайте линк


2-1202376747
Dark
2008-02-07 12:32
2008.03.02
Rus>Eng





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский