Delphi xml в word

In this CodeRage session, you can find out how to do these tasks:

  • Overview of OpenXml files
  • Getting the file properties
  • Creating a simple Word file
  • Creating a complex Word file

XML files are ZIP files with a special format. If we open a file, for example, a Word document file with the help of a Zip Manager, you can see that file is really a zip file with an XML file in it. In the XML files, you can find out styles, fonts, and other settings of the Word file itself.

So how we can manage and process these files with the help of our Delphi application then? This is so easy for us because we have great Delphi that has the TZipFile & the TZipHeader classes. Moreover, to read XML files and iterating over XML nodes you can use the TXMLDocument and IXMLNode interface to fetch node element, node data, and node text.

Be sure to watch the session to learn more about the opening XML files and creating Word files!

  • IXMLNode Interface
  • TXMLDocument use case (Delphi)

Z3oM

250 / 71 / 18

Регистрация: 10.04.2010

Сообщений: 532

Записей в блоге: 3

1

01.08.2011, 09:00. Показов 9380. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Доброго времени суток дорогие форумчане! У меня к вам вопрос, с XML работать решил первый раз задача такая как вытащить необходимые данные из XML какие компоненты использовать и какие переменные объявлять? если присутствует такая строка

XML
1
<String id="POPUP_NAME_INVALID">Это имя некорректно. Пожалуйста, введите другое имя.</String>

Нужно вытащить только фразу на русском языке!

Буду очень признателен и благодарен!



0



2981 / 2169 / 502

Регистрация: 11.09.2009

Сообщений: 8,086

01.08.2011, 22:19

2

Z3oM, если тупо, не разбирая значения тегов — вытягиваете текст в строчку (или массив) и посимвольно из него копируете. Встретится «<» — пропускаете символы, пока не встретится «>».
Но в результате останется и текст на латинице. А вот как кириллицу от литиницы отличать — способов много и разных. Если опять же тупо — то по коду символа.
Ну, а если совсем грамотно — то надо разбирать значения тегов, чтобы определять, где действительно текст, а где, например, коментарии. Разбирать текст на слова и определять язык для слова…
В общем, тут нет предела совершенству.



0



Z3oM

250 / 71 / 18

Регистрация: 10.04.2010

Сообщений: 532

Записей в блоге: 3

02.08.2011, 13:17

 [ТС]

3

Я не прошу совершенства =) Есть же какие то библиотеки которые можно подключать или классы! Которые определяют XML я в тырнете видел но толком ничего не понял! Если тупо работать со строкой то это не грамотно! Ведь мне потом нужно будет собрать эту строку обратно =) Спасибо конечно же за ответ но это не то чего я ожидал =)

Добавлено через 6 часов 25 минут
Задам вопрос немного иначе =) Как использовать XML Document Object Model какие библиотеки подключать? Или этот способ не подойдет для того чтобы вытащить строки из XML документа?

Добавлено через 1 час 7 минут
Нашел метод извлечения =) Одно НО! Вот как я эту сделал!

Delphi
1
2
    StringAll:=VarToStr(XMLDocument1.DocumentElement.ChildValues['String']);
    Memo1.Lines.Add(StringAll);

Но проблема в следующем!
Не знаю свойства XMLDocument. Как перечислить все поля присутствующие в файле XML??

если их допустим 300? строк такого вида?

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
    <String id="YES">Да</String>
    <String id="NO">Нет</String>
    <String id="OK">OK</String>
    <String id="RESUME">Продолжить</String>
    <String id="HELP">Помощь</String>
    <String id="BACK">Назад</String>
    <String id="MAIN_MENU">Главное Меню</String>
    <String id="OPTIONS">Опции</String>
    <String id="ACCEPT">Принять</String>
    <String id="CANCEL">Отмена</String>
    <String id="NEW_PLAYER">Новый игрок</String>
    <String id="EDIT_NAME">Изменить имя</String>
    <String id="DELETE_PLAYER">Удалить игрока</String>

Буду ждать! Жду, Надеюсь, Верю =)



0



Петррр

6259 / 3560 / 898

Регистрация: 28.10.2010

Сообщений: 5,926

02.08.2011, 15:13

4

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  xmlDocument: TXMLDocument;
  mainNode: IXMLNode;
  nodes: IXMLNodeList;
  i: Integer;
  memo: TMemo;
begin
memo := TMemo.Create(Owner);
memo.Parent := Form1;
memo.Left := 10;
memo.Top := 10;
xmlDocument := TXMLDocument.Create(Owner);
xmlDocument.LoadFromFile('C:1.xml');
xmlDocument.Active := True;
mainNode := xmlDocument.DocumentElement;
nodes := mainNode.ChildNodes;
For i := 0 To nodes.Count -1 Do
  memo.Lines.Add(nodes.Get(i).NodeValue);
xmlDocument.Active :=False;
end;
XML
1
2
3
4
<?xml version="1.0" encoding="utf-8" ?>
<tags>
  <String id="POPUP_NAME_INVALID">Это имя некорректно. Пожалуйста, введите другое имя.</String>
</tags>

Добавлено через 1 час 46 минут

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const
  fileName = 'C:1.xml';
var
  xmlDocument: TXMLDocument;
  mainNode: IXMLNode;
  nodes: IXMLNodeList;
  i: Integer;
  memo: TMemo;
begin
memo := TMemo.Create(Owner);
memo.ScrollBars := ssVertical;
memo.Parent := Form1;
memo.Left := 10;
memo.Top := 10;
xmlDocument := TXMLDocument.Create(Owner);
xmlDocument.LoadFromFile(fileName);
xmlDocument.Active := True;
mainNode := xmlDocument.DocumentElement;
nodes := mainNode.ChildNodes;
{  В цикле читаем все значения и выводим   }
For i := 0 To nodes.Count -1 Do
  memo.Lines.Add(nodes.Get(i).NodeValue);
{  В цикле изменяем все значения}
For i := 0 To nodes.Count - 1 do
  nodes.Get(i).NodeValue := IntToStr(Random(9));
{  Сохраняем изменения   }
xmlDocument.SaveToFile(fileName);
xmlDocument.Active :=False;
end;



2



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

Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из 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 создание таблицы