Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение количество страниц в документе Word [D6, XP]


saNat ©   (2008-02-06 11:24:00) 

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

Подскажите, пожалуйста, по данному вопросу. Приложение "делает" выгрузку отчета в 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+' ñòðàíèöå'
  Else
    Buffer:=Buffer+' ñòðàíèöàõ';
 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-08 14:14:00) [1]

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

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


saNat   (2008-02-08 08:26:00) [2]

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


EvS   (2008-02-07 21:01:00) [3]

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

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


saNat   (2008-02-07 20:04:00) [4]

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


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

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

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

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


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

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


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

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


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

Хм...
Шаблон из себя представляет каркас таблицы (т.е. линии не рисуются). Первый лист - титульный. Далее собственно результаты работы приложения. Грубо говоря, на втором и последующих листах таблица из одного столбца. Сейчас шаблон представляет состоит из 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:29:00) [9]

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

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

:(


saNat   (2008-02-06 14:22:00) [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 13:16:00) [11]

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


easy   (2008-02-06 13:10:00) [12]


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

стр.
=)


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

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


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

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


easy   (2008-02-06 12:56:00) [15]

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


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

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


EvS   (2008-02-06 12:27:00) [17]

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


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


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

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

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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо