使用正则表达式从Delphi搜索MS Word文档中的单词并导入Delphi应用程序

使用正则表达式从Delphi搜索MS Word文档中的单词并导入Delphi应用程序,delphi,ms-word,Delphi,Ms Word,我正在使用我们的实验室报告系统,并希望自动化一些任务。我们使用的系统不直观,使用word文档输入数据。有几个段落有标题(保护标题) 我想复制其中一个段落中的一个短语,并使用Delphi应用程序将其粘贴到另一个段落中 GetActiveOleObject('Word.Application'); 我怎么能用正则表达式呢。好的是,我想复制的可搜索短语是大写的,而其他的都是句子大小写。例如: 第3段标题:-->接收者注意到接收的方法好的,我终于让它工作了,如果有人需要,我会发布代码。我必须将文档复制

我正在使用我们的实验室报告系统,并希望自动化一些任务。我们使用的系统不直观,使用word文档输入数据。有几个段落有标题(保护标题)

我想复制其中一个段落中的一个短语,并使用Delphi应用程序将其粘贴到另一个段落中

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是如何做到这一点的。但是录制的宏没有帮助。谢谢您的输入!