Если «до конца» = «До самого конца»:
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 |
|||||||
мне нужно чтоб программа работала уже в готовом открытом приложении , а не создавала сама Тогда понадобится не запускать новый экземпляр MS Word, а подключиться к уже запущенному экземпляру. В этом случае надо заменить вызов CreateOleObject() на GetActiveOleObject().
Здесь происходит попытка подключения к уже запущенному экземпляру MS Word. Затем, выполняется подключение к первому из уже открытых документов. Если все эти шаги успешны, то выполняется поиск текста. Ещё можно сделать так. Подключаемся к запущенному экземпляру MS Word. Потом, среди открытых документов ищем тот, чьё имя файла совпадает с заданным и выполняем поиск в этом документе. Имя файла пускай будет выбираться через OpenDialog.
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;
Всё достаточно просто. Далее мы можем работать с объектом следующим образом:
- Создавать документ Word с нуля
- Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.
Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.
Чтобы создать новый документ необходимо выполнить метод 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
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.