0

我构建了一个小程序来使用 Delphi 从 .docx 中读取所有文本。它适用于普通文本和快速部件,但我在论坛和教程中找到的解决方案都不适用于我的文本字段或表单字段。我正在使用 Word 2013 和 Delphi XE7,我的文档有 2 个表单字段,一个名为“姓名”,另一个名为“作者”,还有一个文本字段。

这是我的代码:

    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 函数总是返回 0,当我尝试获取表单字段的 .Result 时,我得到了找不到字段的错误(不知道错误的英文措辞) .

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

提前致谢,

莉亚

4

1 回答 1

1

要访问快速部件和复选框,您需要访问 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;

PS: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);
于 2015-09-07T14:38:37.223 回答