如何使用 Delphi XE7 从 Word 2013 的文本域和表单域中获取文本?

How do I get the text from text- and formfields in Word 2013 with Delphi XE7?

我构建了一个小程序来读取带有 Delphi 的 .docx 中的所有文本。它适用于普通文本和快速部分,但我在论坛和教程中找到的 none 解决方案适用于我的文本字段或表单字段。我使用的是 Word 2013 和 Delphi XE7,我的文档有 2 个表单域,一个名为 "Name",另一个 "Author",和一个文本域。

这是我的代码:

    procedure TForm1.Button1Click(Sender: TObject);
    var i: integer;
    begin
      WordApplication1.Disconnect;
      WordDocument1.Disconnect;
      try
        WordApplication1.Connect;
        WordApplication1.Visible := true;
        WordDocument1.ConnectTo(WordApplication1.Documents.Open(
          'C:\homelaufwerk\Documents\Embarcadero\Studio\Projekte\Word test\testDoc.docx',
          EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
          EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam));
        memo1.Clear;
        memo1.Text := '';

        for I := 1 to WordDocument1.Paragraphs.Count do
        begin
          memo1.Text := memo1.Text + WordDocument1.Paragraphs.Item(i).Range.Text + #13#10;
        end;

        memo1.Text := memo1.Text + WordApplication1.ActiveDocument.FormFields.Item('Author').Result;
        memo1.Text := memo1.Text + WordApplication1.ActiveDocument.FormFields.Item('Name').Result;

        for I := 1 to WordApplication1.ActiveDocument.Fields.Count do
        begin
          memo1.Text := memo1.Text + WordApplication1.ActiveDocument.Fields.Item(1).Result;
        end;

        WordDocument1.Close;

      except
        ShowMessage('Microsoft Word couldn''t start.');
      end;
    end;

我也为文本字段试过这个:

    WordDocument1.Fields.Item(1).Select;
    memo1.Text := memo1.Text + WordApplication1.Selection.Text;

并且在每个地方我都用 WordDocument1.[...] 替换了 WordApplication1.ActiveDocument.[...],反之亦然...没有任何效果。

当我调试时,文本字段的 .Count 函数总是 returns 0,当我试图获取表单字段的 .Result 时,我收到无法找到字段的错误(不要不知道错误的英文措辞)。

有谁知道我做错了什么以及它是如何工作的?

提前致谢,

莉亚

要访问快速部件和复选框,您需要访问 ContentControls。

var
  ... // your other vars here
  LRange: OleVariant;
  LStartRange: Integer;
  LEndRange: Integer;
begin
  ...
  ... //here your code
  ...

  LStartRange := WordApplication1.ActiveDocument.Content.Start;
  LEndRange := WordApplication1.ActiveDocument.Content.End_;
  LRange := WordApplication1.ActiveDocument.Range(LStartRange, LEndRange);

  for I := 1 to LRange.ContentControls.Count do
    Memo1.Lines.Add(LRange.ContentControls.Item[I].Range.Text);

end;

P.S: Delphi Wrapper 不包含 "ContentControls" 属性 所以你需要使用 Range 作为 OleVariant

更新:

要访问文本字段项目:

for I := 1 to WordApplication1.ActiveDocument.Shapes.Count do
  Memo1.Lines.Add(WordApplication1.ActiveDocument.Shapes.Item(I).TextFrame.TextRange.Text);