使用正则表达式从Delphi搜索MS Word文档中的单词并导入Delphi应用程序
我正在使用我们的实验室报告系统,并希望自动化一些任务。我们使用的系统不直观,使用word文档输入数据。有几个段落有标题(保护标题) 我想复制其中一个段落中的一个短语,并使用Delphi应用程序将其粘贴到另一个段落中使用正则表达式从Delphi搜索MS Word文档中的单词并导入Delphi应用程序,delphi,ms-word,Delphi,Ms Word,我正在使用我们的实验室报告系统,并希望自动化一些任务。我们使用的系统不直观,使用word文档输入数据。有几个段落有标题(保护标题) 我想复制其中一个段落中的一个短语,并使用Delphi应用程序将其粘贴到另一个段落中 GetActiveOleObject('Word.Application'); 我怎么能用正则表达式呢。好的是,我想复制的可搜索短语是大写的,而其他的都是句子大小写。例如: 第3段标题:-->接收者注意到接收的方法好的,我终于让它工作了,如果有人需要,我会发布代码。我必须将文档复制
GetActiveOleObject('Word.Application');
我怎么能用正则表达式呢。好的是,我想复制的可搜索短语是大写的,而其他的都是句子大小写。例如:
第3段标题:-->接收者注意到接收的方法好的,我终于让它工作了,如果有人需要,我会发布代码。我必须将文档复制到我的delphi备忘录中,然后使用regex将其粘贴到我想要的地方。虽然这个过程看起来很麻烦,但执行速度非常快。无论如何,我使用的word文档通常只有一两页
procedure TForm1.Button1Click(Sender: TObject);
var
DXRANGE, DXWORD: OleVariant;
n : Integer;
regexpr: TRegEx;
Match: TMatch;
begin
try
DXWORD := GetActiveOleObject('Word.Application');
DXRANGE := DXWORD.Documents.Item(1)
.Range(DXWORD.Documents.Item(1).Range.Start, DXWORD.Documents.Item(1)
.Range.End);
DXRANGE.Copy;
Memo1.Clear;
Memo1.PasteFromClipBoard;
regexpr := TRegEx.Create('\b[A-Z][A-Z][A-Z]+(?:\s+[A-Z]+)*\b');
Match := regexpr.Match(Memo1.Text);
n := 1;
Memo2.Clear;
while Match.Success do
begin
Memo2.Lines.Add(IntToStr(n) + Match.Value);
Memo2.Lines.Add('');
Match := Match.NextMatch;
n := n + 1;
end;
Memo2.SelectAll;
Memo2.CopyToClipboard;
DXWORD.Selection.PasteSpecial(wdPasteRTF)
except
on E: exception do
begin
ShowMessage(E.Message);
end;
end;
end;
当使用Word(或任何office应用程序)和ActiveX Delphi组件时,一般的规则是使用惊人的宏记录器来查看它是如何做到的 例如
- 打开word文档
- 从工具菜单中选择[Record Macro]
- 进行搜索
- 将其复制到剪贴板
- 替换您的代码
- 做任何你需要做的事情
- 停止宏
现在打开宏VBA Organizer,查看VBA为您的操作生成的代码。这将使您对调用delphi代码所需的函数有一个很好的了解 您最好使用Word自动化,而不是尝试使用正则表达式(Word文档是用格式信息编码的,因此您必须先提取文本)。通过Word automation,您可以使用Word VBA对象模型轻松地抓取整个段落(或任何一组段落)并访问单独的行,这是一个很好的文档。我在word自动化方面的经验非常有限。你能给我举个例子吗?这是一个非现场的例子列表。请参见组件调色板中服务器选项卡上的组件TWordApplication和组件TWordDocument。这些应该让你开始,一旦你知道在这里要问什么,就会有一些对办公自动化和德尔福非常了解的人在这里回答问题。(我会在您的问题中添加generic
delphi
标记,并省略delphi-xe3
,除非您的问题是特定于版本的。大多数与FireMonkey或XPlatform无关的内容都是generic。)(续)发布此问题的Word automation答案是不合适的,因为您的问题与Word automation无关。任何与自动化相关的答案都将是“非答案”,因为它不会解决您发布的问题。(不过,你可以发布一个不同的问题;是否离开这个问题取决于你。)是的,我通常是在几周前知道后才这样做的。我试图通过录制宏,使用启用的野生类型来记录word是如何做到这一点的。但是录制的宏没有帮助。谢谢您的输入!