使用RegEx从Delphi中搜索MS Word文档中的单词并导入到Delphi应用程序

时间:2012-12-05 18:56:04

标签: delphi ms-word

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

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

GetActiveOleObject('Word.Application');

我如何使用RegEx。好消息是我要复制的可搜索短语是大写的,而其他一切都是句子。例如:

第3段标题:---> Receiver Notes< ----这在文档(受保护)中不可编辑

  1. 该样本在此工作站的CONTAINER OF FORMALIN中收到

  2. 在该工作站

  3. 接收到没有固定的新鲜标本

    我的结果必须是:

    第4段标题--->接收方法< ------再次保护

    1. FORMALIN的容器< -----这里是我要从第一场比赛中粘贴的地方

    2. 没有固定的新鲜< -----这里是第二场比赛......等等

    3. 所以我的感觉是要在段落标题" Receiver Note"之间搜索delphi代码。和#34;接收方法"对于大写的人,并在下一段中列出。

      我使用delphi xe3,我知道如何使用正则表达式与其他文件,但不是使用delphi的单词。任何输入,代码片段,示例等将非常感谢!

2 个答案:

答案 0 :(得分:2)

好的,我终于让这个工作了,如果有人需要这个,我会发布代码。我不得不将文档复制到我的delphi备忘录并使用正则表达式在那里工作,然后将其粘贴回我想要的地方。虽然这个过程看起来很麻烦,但执行起来非常快。我使用的单词文档通常都是一两页。

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;

答案 1 :(得分:0)

作为使用Word(或任何办公应用程序)和ActiveX Delphi组件的一般规则,是使用神奇的宏录制器来查看它是如何做到的。

例如

  • 打开您的word文档
  • 从工具菜单中选择[记录宏]
  • 进行搜索
  • 将其复制到剪贴板
  • 替换您的代码
  • 做任何你需要做的事。
  • 停止宏

现在打开宏VBA组织器,查看VBA为您所做的事情生成的代码。这将使您非常了解获取delphi代码所需的函数。