![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение количество страниц в документе 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]Возможно требуется добавить, что "поля" в шаблоне организованы таблицей без отрисовки границ.