Selection words word delphi

Если «до конца» = «До самого конца»:

Procedure SelectFromPositionToEnd(startPosition: integer);
begin
  W.Selection.Start := startPosition;
  W.Selection.End   := W.ActiveDocument.Characters.Count; // последний символ в документе
end;

Если «до конца» = «До конца предложения»:

Procedure SelectFromPositionToEdnOfSentence(startPosition: integer);
const
  WdSentence = 3; //значение для перехода к следующему предложению
begin
  w.Selection.Start := startPosition; //поставили сюда курсор
  w.Selection.Move(WdSentence, 1);    //передвинули до следующего предложения
  w.Selection.Start := startPosition; //растянули выделение до начального символа
end;

Если «до конца» = «До конца строки», то тоже что и во втором случае, только заменить первый параметр в Move
с

WdSentence

на

Wdline = 5 //значение для перехода к следующей линии (строке)

Mawrat

13094 / 5875 / 1706

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

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

01.09.2013, 05:11

6

Цитата
Сообщение от vuasya
Посмотреть сообщение

мне нужно чтоб программа работала уже в готовом открытом приложении , а не создавала сама

Тогда понадобится не запускать новый экземпляр MS Word, а подключиться к уже запущенному экземпляру. В этом случае надо заменить вызов CreateOleObject() на GetActiveOleObject().
Полностью код будет выглядеть так:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
uses
  ComObj;
 
{Пояснение по поиску.
Объект wdFind связан с диапазоном wdRng. При каждом вызове wdFind.Execute
поиск продолжается в том диапазоне, который определял wdRng до первого
вызова wdFind.Execute. Т. е., поиск выполняется в одном и том же диапазоне.
Но сам объект wdRng изменяется при каждом обнаружении искомого текста - он
становится равным диапазону, который охватывает этот найденный текст.}
 
{Функция ищет заданный текст aSearchText в документе MS Word aWdDoc и возвращает
ссылку на диапазон, который охватывает найденный текст.}
function FindInDoc(const aWdDoc : Variant; const aSearchText : String) : Variant;
const
  wdFindStop = 0; //Завершить поиск при достижении границы диапазона.
var
  wdRng, wdFind : Variant;
begin
  VarClear(Result);
  //Диапазон, охватывающий всё содержимое документа.
  wdRng := aWdDoc.Content;
 
  //Настройка поиска.
  wdFind := wdRng.Find;
  //wdFind.ClearFormatting;
  wdFind.Text := aSearchText;
  //True - поиск вести от начала - к концу диапазона.
  wdFind.Forward := True;
  //wdFindStop - завершить поиск при достижении границы диапазона.
  //wdFind.Wrap := wdFindStop;
 
  //Поиск текста.
  if wdFind.Execute then Result := wdRng;
end;
 
//Поиск заданного текста в документе MS Word.
procedure TForm1.Button1Click(Sender: TObject);
var
  wdApp, wdDocs, wdDoc, wdRng : Variant;
  SearchText : string;
begin
  //Искомый текст.
  SearchText := Edit1.Text;
  if SearchText = '' then begin
    MessageBox(0, 'Искомый текст не задан. Действие отменено.'
      ,'Искомый текст не задан', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
  
  //Запуск MS Word и подключение к его корневому объекту.
  try
    wdApp := GetActiveOleObject('Word.Application');
  except
    MessageBox(0, 'Нет запущенных экземпляров MS Word. Действие отменено.',
      'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Подключаемся к коллекции документов.
  wdDocs := wdApp.Documents;
  //Проверяем - есть ли хотя бы один открытый документ.
  if wdDocs.Count = 0 then begin
    MessageBox(0, 'Нет ни одного открытого документа. Действие отменено.'
      ,'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //Подключаемся к первому документу в коллекции.
  wdDoc := wdDocs.Item(1);
  //Поиск заданного текста.
  wdRng := FindInDoc(wdDoc, SearchText);
  if VarIsClear(wdRng) then begin
    ShowMessage('Текст НЕ найден.');
    Exit;
  end;
 
  ShowMessage('Текст найден.');
 
  //Выделяем найденный текст.
  wdRng.Select;
  //Прокручиваем содержимое документа (в первом окне) таким образом, чтобы стал
  //видимым участок с найденным текстом.
  wdDoc.Windows.Item(1).ScrollIntoView(wdRng);
 
  //Можно выполнить какие-нибудь действия с найденным текстом.
  //Например, пометим найденный текст жирным красным шрифтом.
  //wdRng.Font.Bold := True;
  //wdRng.Font.Color := RGB(255, 100, 100);
end;
 
end.

Здесь происходит попытка подключения к уже запущенному экземпляру MS Word. Затем, выполняется подключение к первому из уже открытых документов. Если все эти шаги успешны, то выполняется поиск текста.

Ещё можно сделать так. Подключаемся к запущенному экземпляру MS Word. Потом, среди открытых документов ищем тот, чьё имя файла совпадает с заданным и выполняем поиск в этом документе. Имя файла пускай будет выбираться через OpenDialog.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
implementation
 
{$R *.dfm}
 
uses
  ComObj;
 
{Пояснение по поиску.
Объект wdFind связан с диапазоном wdRng. При каждом вызове wdFind.Execute
поиск продолжается в том диапазоне, который определял wdRng до первого
вызова wdFind.Execute. Т. е., поиск выполняется в одном и том же диапазоне.
Но сам объект wdRng изменяется при каждом обнаружении искомого текста - он
становится равным диапазону, который охватывает этот найденный текст.}
 
{Функция ищет заданный текст aSearchText в документе MS Word aWdDoc и возвращает
ссылку на диапазон, который охватывает найденный текст.}
function FindInDoc(const aWdDoc : Variant; const aSearchText : String) : Variant;
const
  wdFindStop = 0; //Завершить поиск при достижении границы диапазона.
var
  wdRng, wdFind : Variant;
begin
  VarClear(Result);
  //Диапазон, охватывающий всё содержимое документа.
  wdRng := aWdDoc.Content;
 
  //Настройка поиска.
  wdFind := wdRng.Find;
  //wdFind.ClearFormatting;
  wdFind.Text := aSearchText;
  //True - поиск вести от начала - к концу диапазона.
  wdFind.Forward := True;
  //wdFindStop - завершить поиск при достижении границы диапазона.
  //wdFind.Wrap := wdFindStop;
 
  //Поиск текста.
  if wdFind.Execute then Result := wdRng;
end;
 
//Поиск заданного текста в документе MS Word.
procedure TForm1.Button1Click(Sender: TObject);
var
  wdApp, wdDocs, wdDoc, wdRng : Variant;
  SearchText : string;
  i : Integer;
  Od : TOpenDialog;
begin
  //Искомый текст.
  SearchText := Edit1.Text;
  if SearchText = '' then begin
    MessageBox(0, 'Искомый текст не задан. Действие отменено.'
      ,'Искомый текст не задан', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
  //Выбор имени файла.
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
      ,'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  //Попытка подключиться к уже запущенному экземпляру MS Word.
  try
    wdApp := GetActiveOleObject('Word.Application');
  except
    MessageBox(0, 'Нет запущенных экземпляров MS Word. Действие отменено.',
      'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Подключаемся к коллекции документов.
  wdDocs := wdApp.Documents;
  //Ищем документ по имени файла.
  VarClear(wdDoc);
  for i := 1 to wdDocs.Count do
    if wdDocs.Item(i).FullName = Od.FileName then begin
      wdDoc := wdDocs.Item(i);
      Break;
    end;
  if VarIsClear(wdDoc) then begin
    MessageBox(0, 'Документ не является открытым в настоящее время. Действие отменено.'
      ,'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //Поиск заданного текста.
  wdRng := FindInDoc(wdDoc, SearchText);
  if VarIsClear(wdRng) then begin
    ShowMessage('Текст НЕ найден.');
    Exit;
  end;
 
  ShowMessage('Текст найден.');
 
  //Выделяем найденный текст.
  wdRng.Select;
  //Прокручиваем содержимое документа (в первом окне) таким образом, чтобы стал
  //видимым участок с найденным текстом.
  wdDoc.Windows.Item(1).ScrollIntoView(wdRng);
 
  //Можно выполнить какие-нибудь действия с найденным текстом.
  //Например, пометим найденный текст жирным красным шрифтом.
  //wdRng.Font.Bold := True;
  //wdRng.Font.Color := RGB(255, 100, 100);
end;
 
end.



1



Если «до конца» = «До самого конца»:

Procedure SelectFromPositionToEnd(startPosition: integer);
begin
  W.Selection.Start := startPosition;
  W.Selection.End   := W.ActiveDocument.Characters.Count; // последний символ в документе
end;

Если «до конца» = «До конца предложения»:

Procedure SelectFromPositionToEdnOfSentence(startPosition: integer);
const
  WdSentence = 3; //значение для перехода к следующему предложению
begin
  w.Selection.Start := startPosition; //поставили сюда курсор
  w.Selection.Move(WdSentence, 1);    //передвинули до следующего предложения
  w.Selection.Start := startPosition; //растянули выделение до начального символа
end;

Если «до конца» = «До конца строки», то тоже что и во втором случае, только заменить первый параметр в Move
с

WdSentence

на

Wdline = 5 //значение для перехода к следующей линии (строке)

Techniques to control MS-Word from a Delphi application are discussed in this blog. As a demonstration, I have added different codes which allows to use Word to create tables, to format strings, to create paragraphs and to insert different objects like images, shapes, word arts etc. Finding a PC that does not have MS-Word installed may prove a difficult task: The word processor from Microsoft is ubiquitous. It therefore makes sense to use it whenever it is necessary to create beautiful output from a program. Delphi makes it actually very easy: The language support for Variants as references to OLE automation servers and the support for COM interfaces make steering MS-Word (or indeed Excel or MS-Access) quite easy.

Controlling MS-Word is done through its COM interface: Through Delphi’s OLE mechanism, an OLE reference is obtained to the MS-Word application, and then the various commands exposed by the MS-Word interface can be used to let MS-Word do virtually anything that is needed. The same can be done with Excel and other members of the MS-Office suite.

1. Create a New document

3. Turn auto on/off Spelling grammar check during create for performance

    word1.Options.CheckSpellingAsYouType := False;

    word1.Options.CheckGrammarAsYouType := False;

4. Do spelling and grammar check

word1.CheckSpelling(doc1.Content.Text);

    ShowMessage(IntToStr( doc1.SpellingErrors.Count));

    word1.CheckGrammar(doc1.Content.Text);

    ShowMessage(IntToStr( doc1.GrammaticalErrors.Count));

5. Add a new document

  doc1 := word1.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);

  doc1.Content.Text := ‘test’;  //Edit Document//

  Doc1.Save;   //Save Document//

6. Add a paragraph or a line with fonr format, paragraph format

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

    with para1.Range do

    begin

      Text := ‘Word Automation in Delphi’;

      Font.Size := 16;

      Font.Bold := 1;

      Font.Underline := 1;

      Font.Color := wdColorRed;

      ParagraphFormat.Alignment := wdAlignParagraphCenter;

    end;

    para1.Range.InsertParagraphAfter;

7. Paragraph with back groundcolor and selection color

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

    with para1.Range do

    begin

      Text := ‘Line with fotn, back ground color ‘;

      Font.Name := ‘Verdana’;

      Font.Size := 11;

      Font.Italic := 1;

      Shading.BackgroundPatternColor := wdColorYellow;

      MoveStart(wdCharacter, 83);

      Font.StrikeThrough := 1;

      Font.Color := wdColorRed;

      Shading.BackgroundPatternColor := wdColorSkyBlue;

      ParagraphFormat.Alignment := wdAlignParagraphRight;

    end;

    para1.Range.InsertParagraphAfter;

8. Insert picture

para1.Range.InlineShapes.AddPicture(‘C:Testtest1.png’, False, True, EmptyParam);

    para1.Range.InsertParagraphAfter;

9. Insert word art

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage];

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    doc1.Shapes.AddTextEffect(msoTextEffect29, ‘Auto Word Art’, ‘Algerian’, 20, 0, 0, iLeft, iTop,EmptyParam);

    para1.Range.InsertParagraphAfter;

10. Insert text box

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage];

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddTextbox(msoTextOrientationHorizontal, iLeft, iTop, 180, 40, EmptyParam);

    shape1.TextFrame.TextRange.Text := ‘Enter Your Address Here’;

    shape1.TextFrame.TextRange.Font.Bold := 1;

    shape1.TextFrame.TextRange.Font.Color := wdColorBlue;

    para1.Range.InsertParagraphAfter;

11. Insert line shape

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage];

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddLine(iLeft, iTop, iLeft+300, iTop, EmptyParam);

    shape1.Line.ForeColor.RGB := wdColorPink;

    shape1.Line.Weight := 2;

    shape1.Line.DashStyle := msoLineDashDot;

    para1.Range.InsertParagraphAfter;

12. Insert line with style

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage];

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddLine(iLeft, iTop, iLeft+300, iTop, EmptyParam);

    shape1.Line.Style := msoLineThinThick;

    shape1.Line.Weight := 5;

    para1.Range.InsertParagraphAfter;

13. Insert line with color and pattern

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage];

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddLine(iLeft, iTop, iLeft+300, iTop, EmptyParam);

    shape1.Line.Pattern := msoPatternOutlinedDiamond;

    shape1.Line.Weight := 5;

    shape1.Line.ForeColor.RGB := wdColorRed;

    shape1.Line.BackColor.RGB := wdColorLightGreen;

14. Insert line with arrow

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage];

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddLine(iLeft, iTop, iLeft+300, iTop, EmptyParam);

    shape1.Line.Weight := 5;

    shape1.Line.ForeColor.RGB := wdColorPink;

    shape1.Line.BeginArrowheadStyle :=  msoArrowheadStealth;

    shape1.Line.BeginArrowheadLength :=  msoArrowheadLengthMedium;

    shape1.Line.BeginArrowheadWidth :=  msoArrowheadWide;

15. Insert Line with different arrow style

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage];

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddLine(iLeft, iTop, iLeft+300, iTop, EmptyParam);

    shape1.Line.Weight := 5;

    shape1.Line.ForeColor.RGB := wdColorYellow;

    shape1.Line.EndArrowheadStyle :=  msoArrowheadStealth;

    shape1.Line.EndArrowheadLength :=  msoArrowheadLengthMedium;

    shape1.Line.EndArrowheadWidth :=  msoArrowheadWide;

    shape1.Line.BeginArrowheadStyle :=  msoArrowheadDiamond;

    shape1.Line.BeginArrowheadLength :=  msoArrowheadLengthMedium;

    shape1.Line.BeginArrowheadWidth :=  msoArrowheadWide;

16. Insert arrow shape

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage] ;

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddShape(msoShapeUpArrow, iLeft, iTop, 100, 100, EmptyParam);

    shape1.Fill.PresetTextured(msoTextureWaterDroplets);

17. Insert smiley face

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage]  + 120;

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddShape(msoShapeSmileyFace, iLeft, iTop, 100, 100, EmptyParam);

    shape1.Fill.ForeColor.RGB := wdColorYellow;

    shape1.Fill.BackColor.RGB := wdColorRed;

    shape1.Fill.TwoColorGradient(msoGradientHorizontal, 1);//variant 1-3//

18. Insert shape oval

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage] + 240;

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage];

    Shape1 := doc1.Shapes.AddShape(msoShapeOval, iLeft, iTop, 100, 100, EmptyParam);

    shape1.Fill.PresetGradient(msoGradientFromCenter, 3, msoGradientHorizon);

19. Insert shape sun

iLeft := para1.Range.Information[wdHorizontalPositionRelativeToPage] + 360;

    iTop := para1.Range.Information[wdVerticalPositionRelativeToPage] ;

    Shape1 := doc1.Shapes.AddShape(msoShapeSun, iLeft, iTop, 100, 100, EmptyParam);

    shape1.TextFrame.TextRange.Text := ‘Sun’;

    shape1.TextFrame.TextRange.Font.Bold := 1;

    shape1.TextFrame.TextRange.Font.Color := wdColorWhite;

    shape1.Fill.ForeColor.RGB := wdColorRed;

    shape1.Fill.BackColor.RGB := wdColorOrange;

20. Insert superscript character 

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

    with para1.Range do

    begin

      Text := ’10th Standard’;

      MoveStart(wdCharacter, 2); // from start to 2 character. 0 based index

      MoveEnd(wdCharacter, -9);  // from end to 9 character. 0 based index

      Font.Superscript := 1;

    end;

21. Insert subscript character 

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

    with para1.Range do

    begin

      Text := ‘H2O is formula of water’;

      MoveStart(wdCharacter, 1); // from start to 1 character.0 based index

      MoveEnd(wdCharacter, -21);  // from end to 21 character. 0 based index

      Font.Subscript := 1;

    end;

22. Insert paragraph with format and border

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

    with para1.Range do

    begin

      Text := DupeString(‘Paragraph with Align=Justify; BGColor, Space and border. ‘, 5);

      ParagraphFormat.Alignment := wdAlignParagraphJustify;

      ParagraphFormat.Shading.BackgroundPatternColor := wdColorLightOrange;

      ParagraphFormat.Space2;

      ParagraphFormat.Borders.Enable := 1;

    end;

    para1.Range.InsertParagraphAfter;

23. Removed border from paragraph

ParagraphFormat.Borders.Enable := 0;

24. Paragraph first line indent

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

    with para1.Range do

    begin

      Text := DupeString(‘Paragraph with Align=Left; First Line Indent , BGColor, Space and border. ‘, 5);

      ParagraphFormat.Alignment := wdAlignParagraphLeft;

      ParagraphFormat.Shading.BackgroundPatternColor := wdColorLightGreen;

      ParagraphFormat.Space2;

      ParagraphFormat.FirstLineIndent := 20;

      ParagraphFormat.Borders.Enable := 1;

    end;

25. Insert bullet list

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

    with para1.Range do

    begin

      Text := ‘INDIA’+#13+’PAKISTAN’+#13+’CHINA’+#13+’BANGLADESH’+#13+’SRILANKA’;

      ListFormat.ApplyBulletDefaultOld;

      Shading.BackgroundPatternColor := wdColorLightTurquoise;

    end;

    para1.Range.InsertParagraphAfter;

26. Insert numbered list

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

    with para1.Range do

    begin

      Text := ‘MATH’+#13+’PHYSICS’+#13+’CHEMISTRY’+#13+’BOTANY’+#13+’ZOOLOGY’;

      ListFormat.ApplyNumberDefaultOld;

      Shading.BackgroundPatternColor := wdColorLightGreen;

    end;

    para1.Range.InsertParagraphAfter;

27. Insert outlined number format

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

    with para1.Range do

    begin

      Text := ‘LION’+#13+’TIGER’+#13+’ELEPHANT’+#13+’CHEETAH’;

      ListFormat.ApplyOutlineNumberDefaultOld;

      Shading.BackgroundPatternColor := wdColorLightYellow;

    end;

    para1.Range.InsertParagraphAfter;

28. Insert multi level number list

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

    with para1.Range do

    begin

      Text := ‘INDIA’;

      ListFormat.ApplyNumberDefaultOld;

      Font.Color := wdColorBlue;

    end;

    para1.Range.InsertParagraphAfter;

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

    with para1.Range do

    begin

      Text := ‘NEW DELHI’+#13+’BOMBAY’+#13+’CHENNAI’;

      ListFormat.ListIndent;

      Font.Color := wdColorRed;

    end;

    para1.Range.InsertParagraphAfter;

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

    with para1.Range do

    begin

      Text := ‘PAKISTAN’;

      ListFormat.ListOutdent;

      Font.Color := wdColorViolet;

    end;

    para1.Range.InsertParagraphAfter;

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

    with para1.Range do

    begin

      Text := ‘KARACHI’;

      ListFormat.ListIndent;

      Font.Color := wdColorIndigo;

    end;

    para1.Range.InsertParagraphAfter;

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

    with para1.Range do

    begin

      Text := ‘BANGLADESH’;

      ListFormat.ListOutdent;

      Font.Color := wdColorBrown;

    end;

    para1.Range.InsertParagraphAfter;

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

    with para1.Range do

    begin

      Text := ‘DHAKA’;

      ListFormat.ListIndent;

      Font.Color := wdColorLime;

    end;

    para1.Range.InsertParagraphAfter;

29. Remove bullet and numbered format

ListFormat.RemoveNumbers(wdNumberParagraph);

30. Insert symbol

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

    with para1.Range do

    begin

      para1.Range.InsertBefore(‘Symbol’);

      InsertSymbol(87, ‘Symbol’, EmptyParam, EmptyParam);

      InsertSymbol(166, ‘Webdings’, EmptyParam, EmptyParam);

      InsertSymbol(253, ‘Wingdings’, EmptyParam, EmptyParam);

      InsertSymbol(254, ‘Wingdings’, EmptyParam, EmptyParam);

    end;

    para1.Range.InsertParagraphAfter;

31. Insert table with format and merged cell

    // a table of 5 rows and 5 columns//
    table1 := doc1.Content.Tables.Add(para1.Range, 5, 5, EmptyParam, EmptyParam );

    table1.Borders.Enable := 1;

    table1.Columns.Item(1).Width := word1.InchesToPoints(0.5);

    table1.Columns.Item(2).Width := word1.InchesToPoints(2);

    table1.Columns.Item(3).Width := word1.InchesToPoints(3);

    table1.Columns.Item(4).Width := word1.InchesToPoints(0.5);

    table1.Columns.Item(5).Width := word1.InchesToPoints(0.5);

    table1.Columns.Item(4).Shading.BackgroundPatternColor := wdColorYellow;

    table1.Columns.Item(5).Shading.BackgroundPatternColor := wdColorYellow;
    // table headers//

    table1.Cell(1, 1).Range.Text := ‘Sr. No’;

    table1.Cell(1, 2).Range.Text := ‘Name’;

    table1.Cell(1, 3).Range.Text := ‘Address’;

    table1.Rows.Item(1).Range.Font.Bold := 1;

    table1.Rows.Item(1).Range.Font.Color := wdColorBlue;

    table1.Rows.Item(1).Range.Shading.BackgroundPatternColor := wdColorGray125;
table1.Rows.Item(1).Cells.Item(4).Merge(table1.Rows.Item(1).Cells.Item(5));

    table1.Cell(1, 4).Range.Text := ‘Marks’;

    table1.Cell(1, 4).Range.ParagraphFormat.Alignment := wdAlignParagraphCenter;

    //data filling//    

    table1.Cell(2, 1).Range.Text := ‘1’;

    table1.Cell(2, 2).Range.Text := ‘RAJ’;

    table1.Cell(2, 3).Range.Text := ‘DELHI’;

    table1.Cell(2, 4).Range.Text := ’40’;

    table1.Cell(2, 5).Range.Text := ’50’;

    table1.Rows.Item(2).Range.Font.Color := wdColorRed;

    table1.Cell(3, 1).Range.Text := ‘2’;

    table1.Cell(3, 2).Range.Text := ‘KAMAL’;

    table1.Cell(3, 3).Range.Text := ‘BOMBAY’;

    table1.Cell(3, 4).Range.Text := ’67’;

    table1.Cell(3, 5).Range.Text := ’95’;

    table1.Rows.Item(3).Range.Font.Color := wdColorRed;

    table1.Cell(4, 1).Range.Text := ‘3’;

    table1.Cell(4, 2).Range.Text := ‘SARIF’;

    table1.Cell(4, 3).Range.Text := ‘SRINAGAR’;

    table1.Cell(4, 4).Range.Text := ’94’;

    table1.Cell(4, 5).Range.Text := ’24’;

    table1.Rows.Item(4).Range.Font.Color := wdColorRed;

    table1.Cell(5, 1).Range.Text := ‘4’;

    table1.Cell(5, 2).Range.Text := ‘MITHESH’;

    table1.Cell(5, 3).Range.Text := ‘VARANASI’;

    table1.Cell(5, 4).Range.Text := ’46’;

    table1.Cell(5, 5).Range.Text := ’45’;

    table1.Rows.Item(5).Range.Font.Color := wdColorRed;


32. Insert header and footer

33. Selection and range

34. Move to specific character, line , table, paragraph etc.

//wdCharacter, wdWord, wdSentence, wdParagraph, wdCell, wdColumn, wdRow, wdTable//

35. Select specific line

36. Cut, copy, paste

    para1.Range.Cut;

    para1.Range.Copy;

    para1.Range.Paste;

37. Find a word

    word1.Selection.Find.Text := ‘some’;

    word1.Selection.Find.ClearFormatting;

    word1.Selection.Find.Forward := True;

    word1.Selection.Find.Wrap := wdFindContinue;

    word1.Selection.Find.MatchWholeWord := True;

    if word1.Selection.Find.Execute(EmptyParam,EmptyParam, EmptyParam,

                EmptyParam, EmptyParam, EmptyParam, EmptyParam,

                EmptyParam, EmptyParam, EmptyParam , EmptyParam,

                EmptyParam, EmptyParam, EmptyParam, EmptyParam) then

    ShowMessage(‘yes’);

38. Find and replace

    word1.Selection.Find.Text := ‘some’;

    word1.Selection.Find.ClearFormatting;

    word1.Selection.Find.Forward := True;

    word1.Selection.Find.Wrap := wdFindContinue;

    word1.Selection.Find.MatchWholeWord := True;

    word1.Selection.Find.Replacement.Text := ‘test1’;

    word1.Selection.Find.Replacement.ClearFormatting;

    word1.Selection.Find.Replacement.Highlight := 1;

    word1.Selection.Find.Execute(EmptyParam,EmptyParam, EmptyParam,

                EmptyParam, EmptyParam, EmptyParam, EmptyParam,

                EmptyParam, EmptyParam, EmptyParam , wdReplaceAll,

                EmptyParam, EmptyParam, EmptyParam, EmptyParam);

39. Print Preview

    doc1.PrintPreview;

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

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

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

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

Понравилась статья? Поделить с друзьями:
  • Selection vba excel описание
  • Selection typetext vba word
  • Selection range word vba
  • Selection pastespecial vba excel
  • Selection moveright vba word