我假设您主要是问如何找到表格,而不是事后如何更改表格的内容。如何执行此操作取决于您要用于查找感兴趣表的标准。
从表面上看,您应该能够使用 MS Word 的 Selection 对象的 Goto 方法导航到给定的表格。但是,由于 Goto 未找到正确的表,因此在检测操作何时失败时存在问题(请参阅此答案的末尾)。
如果感兴趣的表格在文档中以识别文本标签开头,您可以简单地搜索标签,如果找到,则从该标签向前导航,例如在标签“Table3”之后找到表格的示例:
procedure TForm1.Button4Click(Sender: TObject);
var
AFileName : String;
MSWord,
Document : OleVariant;
Found : WordBool;
begin
AFileName := 'd:\aaad7\officeauto\Tables.Docx';
MSWord := CreateOleObject('Word.Application');
MSWord.Visible := True;
Document := MSWord.Documents.Open(AFileName);
MSWord.Selection.Find.Text :='Table3';
Found := MSWord.Selection.Find.Execute;
if Found then begin
MSWord.Selection.MoveDown( Unit:=wdLine, Count:=1);
end;
end;
正如所写,“if Found ...”块只是将光标放在表格第一个单元格的第一个字符上。进入表格后,您可以随意更改其内容。
如果您想了解如何在表格单元格中插入图像,请转到 Word 功能区上的“开发人员”选项卡,录制一个执行您想要的宏,然后使用 编辑从 Macros 弹出窗口中查看它 - 通常很容易将其剪切并粘贴到 Delphi 中并将其编辑为等效的 Delphi 代码。查找所需表格的其他方法也是如此 - 记录一个宏然后翻译它。
要在文档中查找第 N 个表并将光标放在其左上角的单元格中,您可以这样做:
procedure TForm1.Button2Click(Sender: TObject);
var
AFileName : String;
MSWord,
Document,
Tables,
Table : OleVariant;
TableNo : Integer;
begin
AFileName := 'd:\aaad7\officeauto\Tables.Docx';
MSWord := CreateOleObject('Word.Application');
MSWord.Visible := True;
Document := MSWord.Documents.Open(AFileName);
TableNo := 3;
Tables := Document.Tables;
if TableNo <= Tables.Count then begin
Table := Tables.Item(TableNo);
Table.Select;
MSWord.Selection.MoveLeft( Unit:=wdCharacter, Count:=1);
end;
end;
顺便说一句,在 Word 的“查找”对话框中,在 Goto 选项卡上,Go to what 列表框中有 Table 条目。您可以使用类似的代码在代码中调用它
MSWord.Selection.GoTo(What:= wdGoToTable, Which:=wdGoToFirst, Count:=3);
它的问题是如何检查代码是否成功。与返回 WordBool 的 Find 不同,Goto 返回 Range 对象。如果您尝试使用它转到仅包含 2 个表的文档中的第 10 个表,则不会引发错误,但返回的范围是文档中的最后一个表。我还没有找到一种方法来从返回的 Range 中检查 Goto 是否成功,而无需检查与表相关联的一些文本,这些文本可能首先使用 Find 找到。当然,如果保证文档包含您要查找的表格,那么 Goto 的这个问题可能不必担心。