MS Word Automation in Delphi
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.
Units required to use for MS-Word automation
Word2000, Office2000
Declare variables before writing codes
var
sFile : String;
word1 : TWordApplication;
doc1 : WordDocument;
section1 : Section;
para1 : Paragraph;
range1 : WordRange;
table1 : Table;
shape1 : Word2000.Shape;
comment1 : Comment;
iLeft, iTop : Single;
1. Create a New document
begin
try
word1 := TWordApplication.Create(Self);
word1.Connect;
word1.Visible := True;
word1.Caption := 'New Document';
word1.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
finally
word1.Disconnect;
word1.Free;
end;
end;
2. Open existing document
begin
try
word1 := TWordApplication.Create(Self);
word1.Connect;
word1.Visible := True;
sFile := ExtractFilePath(Application.ExeName)+'WordTest1.docx';
word1.Documents.Open(sFile, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Finally
word1.Disconnect;
word1.Free;
end;
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:\Test\test1.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 := 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//
// 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.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
32. Insert header and footer
section1 := doc1.Sections.Add(EmptyParam, EmptyParam);
with section1.Headers.Item(wdHeaderFooterPrimary) do
begin
Range.Text := 'Document Header';
Range.ParagraphFormat.Alignment := wdAlignParagraphCenter;
Range.Font.Bold := 1;
Range.Font.Color := wdColorRed;
PageNumbers.Add(wdAlignPageNumberRight, 1);
end;
with section1.Footers.Item(wdHeaderFooterPrimary) do
begin
Range.Text := 'Document Footer';
Range.ParagraphFormat.Alignment := wdAlignParagraphCenter;
Range.Font.Bold := 1;
Range.Font.Color := wdColorBlue;
end;
33. Selection and range
Range1 := doc1.Range(0,7);
Range1.Select;
Range1 := doc1.Range(doc1.Content.Start, doc1.Content.End);
Range1.Select;
Doc1.Content.Select;
34. Move to specific character, line , table, paragraph etc.
//wdCharacter, wdWord, wdSentence, wdParagraph, wdCell, wdColumn, wdRow, wdTable//
range1 := doc1.Range(1, 7);
range1.Move(wdCharacter, 5); //will move 5 char//
range1.MoveStart(wdCharacter, 7);
range1.MoveEnd(wdCharacter, 7);
35. Select specific line
Sectence1 := doc1.Sentences.Item(3);
range1.Select;
Range1 := doc1.Range(0,7);
Range1.Select;
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;
40. Print and printpreview
doc1.PrintOut(EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam );
This comment has been removed by the author.
ReplyDeleteHi there Jitendra... this is great. I was specifically looking for how to programmatically remove a shape using delphi. I did record a macro on msword and got this:
ReplyDeleteSub RemoveShape()
'
' RemoveShape Macro
'
'
ActiveDocument.Shapes("Picture 2").Select
Selection.ShapeRange.Delete
ActiveDocument.Save
End Sub
But my attempts to translate this to delphi have failed. Can you show me where I am wrong?
...
WordFile := WordApplication.Documents.Open(WordFileName);
...
WordFile.Shapes('Picture 2').Select;
WordFile.Selection.ShapeRange.Delete;
I get "shape/selection not supported by automation object" error on both lines.
BTW I'm trying to update logo on about 200 word documents from old to new logo on the headers
DeleteAWS Cloud Computing
ReplyDelete