【问题标题】:How to find a table in word and update values in the table using delphi如何使用delphi在word中查找表并更新表中的值
【发布时间】:2015-12-01 13:56:40
【问题描述】:

我是使用 Delphi 进行 Ole 单词自动化的新手。我有一个示例文档,里面有很多表格。我可以通过在 word 中查找形状并在其中插入值来插入图像。但是我无法找到一个特定的表并使用 delphi 将一些值更新到其中。有办法吗?谢谢 !

【问题讨论】:

  • 我敢肯定有很多例子只是一个网络搜索就可以了
  • 感谢您的回复,但不幸的是,我发现的所有这些都是创建一个新表并填写它们,而不是找到现有表并更新它们
  • 看看 Deborah Pate 的自动化页面,尤其是 the one for Word tables

标签: delphi ms-word ole


【解决方案1】:

我假设您主要是问如何找到表格,而不是事后如何更改表格的内容。如何执行此操作取决于您要用于查找感兴趣表的标准。

从表面上看,您应该能够使用 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 的这个问题可能不必担心。

【讨论】:

    【解决方案2】:

    可能是这样的:

    Word.ActiveDocument.Tables.Item( 1 ).Cell( 1, 1 ).Range.Text := 'some text';

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多