Форум: "Начинающим";
Текущий архив: 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+" ñòðàíèöå"
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-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