Delphi 2010 word 2010

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

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

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

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

Winsoft’s Direct Office is a nice third party solution which bypasses the middle-man – namely Word – to create, open, and save DOCX documents.

DOCX is a standardized file format. It can be read using Libre Office, SoftMaker’s TextMaker and on-line Google Docs.

Installation

Steps:

  1. Download the trial version
  2. Unzip doffice.zip
  3. Find Winsoft.DirectOffice.dll in .dofficeDelphi along with the corresponding licenses in dofficeLicenses

DirectOffice vs Word COM API: Less code

Using Direct Office, you can reduce the amount of steps, bloat and coding to access Word Documents. Take for example, a simple operation of opening a document:

Direct Office Microsoft Word COM API
Create Document Check if Word is Open or Not.
If Word is not open, launch Word.
Check if Document is Open or Not.
If Document is not Open, Open it.
Check if View is in correct mode (Print View, Draft View…)
If not in correct view, change it accordingly.
Append Page Insert Page

Using the Word COM API, this is at least 35 lines of code. This includes exception checks, querying Word, if Word Document is already opened or not.

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

30

31

32

33

34

35

36

37

38

39

40

41

42

43

uses

  ComObj,

  ActiveX,

  Word2000,

  ShellApi;

...

var

  MSWord: Variant;

  Doc_: variant;

begin

  try

    // Check if Word is already opened?

    MsWord := GetActiveOleObject(‘Word.Application’);

  except

    try

      MsWord := CreateOleObject(‘Word.Application’);

      MsWord.Visible := True;

    except

      Exception.Create(‘Error’);

    end;

  end;

  // Enumate… is Document already opened?

  var iNo, iCount: integer;

  var sFilename: string;

  var bExists: boolean;

  sFilename := ‘yourdoc.doc’;

  bExists := false;

  iCount := MsWord.Documents.Count_;

  for iNo := 1 to iCount do begin

    begin

      if MsWord.Documents(iNo).Path = sFilename then begin

        Doc_ := MsWord.Documents(iNo);

        bExists := true;

      end;

    end;

  end;

  if not bExists then begin

    Doc_ := MsWord.Documents;

    Doc_.Open(sFilename);

  end;

In DirectOffice, access to Word Documents is less than 4 lines of code on average.

var WordDocument: WordprocessingDocument;

begin

  WordDocument := CoWordprocessingDocumentClass.Create(‘yourdocument.docx’, WordprocessingDocumentType_Document);

end;

DirectOffice vs Word COM API: Speed

What if I told you, you could create and save Word Documents between 110% to 500% faster than using Word itself?

  for iNo := 1 to 10000 do

  begin

    para1 := Doc_.Content.Paragraphs.Add(EmptyParam);

    para1.Range.Text := ‘Hello World’;

    para1.Range.InsertParagraphAfter;

  end;

The equivalent in DirectOffice:

  // create body

    Body := CoBody.Create;

    Document.AppendChild(Body as _OpenXmlElement);

      // create paragraph

    Paragraph := CoDocumentFormat_OpenXml_Wordprocessing_Paragraph.Create;

    Body.AppendChild(Paragraph as _OpenXmlElement);

      // create run

    for iNo := 1 to 10000 do

    begin

      Run := CoDocumentFormat_OpenXml_Wordprocessing_Run.Create;

      Paragraph.AppendChild(Run as _OpenXmlElement);

      // create text

      Text := CoDocumentFormat_OpenXml_Wordprocessing_Text.Create;

      Text.Text := ‘Hello, world!’;

      Run.AppendChild(Text as _OpenXmlElement);

    end;

The estimated time to run the above code in Word for a lenghtly document, is ~ 3 minutes. If you were doing data-processing on a large document, it could possibly take upwards between 30 minutes to days.

The estimated time to run the above code in Direct Office is in seconds.

If your customer does not have Microsoft Word installed, or using a competing Word Processor, such as Google Docs or Libre Office, your applications built using DirectOffice can still function. Prior installation of Office or Word is not necessary.

Winsoft sells the full-version at the website, which can open Word, Excel and PowerPoint documents. Your customer’s time is important. Which solution will you choose?

  • Works with: Delphi, C++Builder, VCL
  • Works on: Windows 32-bit, Windows 64-bit, Web

Head over and check out the full WINSOFT Direct Office library for Delphi and C++Builder

Like what you see? You can get Direct Office and over 100 other fantastic WinSoft components with our Enterprise Component Pack. For a limited time, when you purchase RAD Studio Enterprise or Architect Edition at special Upgrade Pricing, you will also get this package of third-party software worth over $13,000, including the full WinSoft Component Library, at NO EXTRA COST! Step up to RAD Studio 10.4 today!

  • Remove From My Forums
  • Question

  •      Open word 2010 from another application but do not save.

          I want to open Word 2010 from Delphi. How can I bring it up and get it out of the taskbar?

Answers

  • Welcome to the Microsoft Office for IT Professionals Word forum.

    Please note this forum is for general questions and feedback related to Word as they pertain to the IT Pro community. For your question, I’d suggest you either choose a Delphi specific forum or forums for developers.

    BTW, I found the following method, hope it will help:

    There are 2 ways to do this; #1: Import Word’s dll as a type library, #2: use Word as an OLE Object.

    #1: Import Word’s dll as a type library; Advantages: You get code completion so you press the period and you see all of the properties and methods available to you. Disadvantages: If a method has 20 optional parameters that you don’t want to use you still have
    to include them.

    Go to «Project», «Import Type Library», scroll down till you see «Microsoft Word…» and click «Create Unit». It will create object pascal code which is a translation of the dll’s interfaces. Some times it goofs up and uses a reserved word like «Word» for Microsoft
    Word and you have to just do a replace to a non reserved word, like «MsWord». Then include the newly created unit’s name «Word_TLB» in your uses clause to use it. Then your code looks like this:

    uses
      Word_TLB, Variants;
    var
      clsWordApplication : Word_TLB.WordApplication;
    begin
      clsWordApplication := Word_TLB.CoWordApplication.Create;
      clsWordApplication.Visible := True
      (some more code)
      clsWordApplication := Nil;
    end;

    #2: use Word as an OLE Object. Advantages: You don’t have to include optional paremeters. Disadvantages: No code completion.

    You code looks like this:
    uses
      Variants;
    var
      clsWordApp : Variant;
    begin
      clsWordApp := CreateOleObject(‘Word.Application’);
      clsWordApp.Visible := True;
      clsWordApp := Nil;
    end;

    Quote from
    Mike U in the following page:

    http://answers.yahoo.com/question/index?qid=20091023063914AA1rIkg


    Max Meng
    TechNet Community Support

    • Edited by

      Thursday, December 20, 2012 3:18 AM

    • Marked as answer by
      Max Meng
      Monday, December 24, 2012 8:36 AM

I’m trying to save a Word 97-2003 document (.doc) using Delphi 6 and Word 2010.

Before Word 2010 everything worked fine with

WordDoc.SaveAs(FileName := FileName, FileFormat := wdFormatDocument);

where FileName := 'c:doc.doc'

Now, Word 2010 presents an Save Dialog and I’m not sure why.
I’ve tried the new SaveAs2 method

WordDoc.SaveAs2(FileName := FileName, FileFormat := wdFormatDocument, CompatibilityMode:= wdWord2003);

but with the same result.

Oddly,

WordDoc.SaveAs2(FileName := FileName, FileFormat := wdFormatDocumentDefault, CompatibilityMode:= wdWord2003);

works fine, without the Save As dialog, but the saved file has Word 2010 format and .doc extension, which will confuse old Word versions.

So, any ideas how I can save a file in old document Word format using Word 2010 without Save As dialog popping up?

5 минут назад, wamaco сказал:

Можно с MS офисом работать через ADO!

Работает даже без установленного офиса!

Делал такое…

Хахахаа, это как без установленного??? Это на ADO)). Технология автоматизации подразумевает установленный офис, так так файл, допустим doc, делается самим движком  MS word. Программа дает команда, открыть ворд, сделать пустой файл, свтавить строку и тд. И куда буду передаваться команды без ворда? Прога просто скажет, что у тебя на зарегистрирован класс (не помню какой).

Да поправьте меня, гуру, если я не прав?!


Изменено 10 марта, 2017 пользователем Vitaldj

Like this post? Please share to your friends:
  • Delete table from excel
  • Delete symbol in excel
  • Delete space from excel
  • Delete rows in excel with vba
  • Delete rows from table word