如何使用 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);
我构建了一个小程序来读取带有 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);