Delphi word текст в ячейку

Работа с таблицами в
документе MSWORD через Delphi.

Некоторые малоиспользуемые функции по работе с таблицами в
документе WORD

Выделение таблицы под номером 1:

WordApplication1.ActiveDocument.Tables.Item(1).Select;

Выделение ячейки
(строка 1 колонка 2) таблицы под номером 1:

WordApplication1.ActiveDocument.Tables.Item(1).Cell(1, 2).Select;

Выделение вложенной
таблицы № 1 в таблице под номером 1:

WordApplication1.ActiveDocument.Tables.Item(1).Tables.Item(1).Select;

Выделение
ячейки (строка 1 колонка 2) во вложенной таблицу № 1 в таблице под номером 1:

WordApplication1.ActiveDocument.Tables.Item(1).Tables.Item(1).Cell(1, 2).Select;

Переход в конец
набора текста в выделенной таблице

Var

Unit_, count_,
Extend_: OleVariant;

Unit_ := wdLine;

Extend_ := wdMove;

WordApplication1.Selection.EndKey(Unit_, Extend_);

WordApplication1.Selection.Font.Size := 4;  //
установка
размера шрифта

WordApplication1.Selection.TypeParagraph;  // следующий параграф

Запись текста в
выделенную ячейку:

WordApplication1.Selection.TypeText(Текст сообщения‘);

Вставка картинки в
выделенную ячейку:

WordApplication1.Selection.InlineShapes.AddPicture(‘C:1.jpg’, EmptyParam, EmptyParam,
EmptyParam);

WordApplication1.Selection.Collapse(EmptyParam);

Вставка следующей
вложенной таблицы в выделенную таблицу:

Var

Unit_, count_,
Extend_: OleVariant;

….

Unit_ := wdLine;

Extend_ := wdMove;

WordApplication1.Selection.EndKey(Unit_, Extend_); // Переход в
конец набора текста

WordApplication1.Selection.Font.Size := 4;

WordApplication1.Selection.TypeParagraph;

WordApplication1.Selection.PasteAsNestedTable;
// Вставка вложенной таблицы

Использую RAD Studio 10.1 Berlin.

Возникла вот такая задача:
Есть word документ в котором большое количество таблиц.
Нужно просмотреть документ от начала и до конца и при встрече таблицы прочитать данные из 1 столбца 1 строки. Если там написано «Таблица», тогда
Нужно прочитать данные 2 столбца, с 3 строки и до конца таблицы.

Как это можно сделать?
Понимаю, что задача большая — буду рад любым примерам кода.

Пример рабочего кода

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
wdApp, wdDocs, wdDoc : Variant;
file_name:string;
temp_string:AnsiString;
begin

file_name:=ExtractFilePath( Application.ExeName )+'test.doc';

//Пытаемся запустить MS Word и получить ссылку на объект Application.
//- Это корневой объект в объектной структуре MS Word.
try
wdApp := CreateOleObject('Word.Application');
except
ShowMessage('Не удалось запустить MS Word. Действие отменено.');
Exit;
end;
  
//Если требуется, делаем видимым окно MS Word.
wdApp.Visible := false;
//Ссылка на коллекцию документов.
wdDocs := wdApp.Documents;
//Попытка открыть выбранный файл и получить ссылку на объект документа.
wdDoc := wdDocs.Open(FileName:=file_name);

{	
CurTable:=ActiveDocument.Tables(1);
CurTable.Cell(10,20).Range.Text:=Text;
goto end_of_this;
}
	
//Читаем текст документа и записываем его в Мемо.
temp_string:=wdDoc.Range.Text;

//Закрываем MS Word.
wdApp.Quit;

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).

Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:

uses ComObj;
var Word: variant;
[...]
procedure CreateWord(const Visible: boolean);
begin
  Word:=CreateOleObject('Word.Application');
  Word.Visible:=Visible;
end;

Всё достаточно просто. Далее мы можем работать с объектом следующим образом:

  1. Создавать документ Word с нуля
  2. Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.

Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.

Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:

[...]
Word.Documents.Add
[...]

и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:

[...]
Word.Documents.Add(TamplatePath:string);
[...]

Чтобы получить список всех открытых в данный момент документов Word можно воспользоваться следующим листингом:

[...]
var List: TStringList;
    i: integer;
begin
  List:=TStringList.Create;
  for i:=1 to Word.Documents.Count do
    List.Add(Word.Documents.Item(i).Name);
end;
[...]

Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:

Word.Documents.Item(index).Activate

где index — номер документа в коллекции.

Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.

Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:

[...]
Word.ActiveDocument.Range.InsertBefore('Hello World');
Word.ActiveDocument.Range.InsertAfter('текст после Hello World');
Word.ActiveDocument.Range.InsertAfter('окончание строки в документа');
[...]

При выполнении этих трех операции Range содержал весь документ.

Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:

var MyRange: variant;
begin
  MyRange:=WordActiveDocument.Range(50,100);
  MyRange.InsertBefore('Привет');//всё, что было после 50-го символа сдвинулось вправо
end;

Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:

[...]
ShowMessage(Word.ActiveDocument.Range.Text) //весь текст в документе
[...]

Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.

Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.

[...]
  ShowMessage(Word.ActiveDocument.Words.Item(Word.ActiveDocument.Words.Count).Text)
[...]

В данном случае я вывел на экран последнее слово в документе.

Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.

2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.

Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:

var FilePath: string;
[...]
  Word.Documents.Open(FilePath)
[...]

Метод Open можно вызывать с несколькими аргументами:

  • FileName: string — путь и имя файла;
  • ConfirmConversions: boolean — False — не открывать диалоговое окно «Преобразование файла» при открытии файла, формат которого не соответствует формату Word (doc или docx)
  • ReadOnly:boolean — True — открыть документ в режиме «Только для чтения»
  • AddToRecentFiles: boolean — True, чтобы добавить документ в список недавно открытых документов.
  • PasswordDocument: string — пароль для открытия документа
  • PasswordTemplate: string — пароль для открытия шаблона
  • Revert : boolean — True, чтобы вернуться к сохраненному документу, если этот документ открывается повторно.
  • WritePasswordDocument: string — пароль для сохранения измененного документа в файле
  • WritePasswordTemplate:string — пароль для сохранения изменений в шаблоне
  • Format:integer — формат открываемого документа.

Обязательным параметром метода Open является только FileName, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:

[...]
  Word.Documents.Open(FileName:=FilePath, ReadOnly:=true)
[...]

В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.

Что касается последнего аргумента — Format, то он может принимать  целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.

Теперь, когда документ открыт его необходимо преобразовать. Обычно я делаю следующим образом: в тех местах документа, в которые необходимо вставить текст я расставляю либо закладки, либо простые строки текста, например, обрамленные символом $ или #. И затем просто выполняю поиск и замену подстрок следующим образом:

function FindAndReplace(const FindText,ReplaceText:string):boolean;
  const wdReplaceAll = 2;
begin
  Word.Selection.Find.MatchSoundsLike := False;
  Word.Selection.Find.MatchAllWordForms := False;
  Word.Selection.Find.MatchWholeWord := False;
  Word.Selection.Find.Format := False;
  Word.Selection.Find.Forward := True;
  Word.Selection.Find.ClearFormatting;
  Word.Selection.Find.Text:=FindText;
  Word.Selection.Find.Replacement.Text:=ReplaceText;
  FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll);
end;

Приведенная выше функция позволяет провести поиск и замену текстового фрагмента во всём документе. Для того, чтобы ограничить возможности пользователя при работе с шаблоном документа я обычно ставлю на необработанный файл пароль, а после обработки — пароль снимаю и сохраняю документ с другим названием в необходимую директорию.

Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? :) Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet :)

3.1
8
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Like this post? Please share to your friends:
  • Delphi word таблицы работа
  • Delphi word таблица выравнивание
  • Delphi word таблица в таблице
  • Delphi word сохранить как
  • Delphi word создание таблицы