0

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

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

GetActiveOleObject('Word.Application');

我该如何使用正则表达式。好消息是我要复制的可搜索短语是大写的,而其他所有内容都是句子大小写。例子:

第 3 段标题:---> 收件人备注 <---- 这在文档中不可编辑(受保护)

  1. 标本在此工作站的 FORMALIN 容器中收到

  2. 在该工作站收到的样本是新鲜的,没有固定剂

我的结果必须是这样的:

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

  1. 福尔马林容器 <----- 这是我想从第一场比赛中粘贴的地方

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

所以我的感觉是有一个德尔福代码来搜索段落标题“接收者注释”和“接收方法”之间的大写字母,并在下一段中列出它们。

我使用delphi xe3,我知道如何将正则表达式与其他文件一起使用,但不使用delphi。任何输入、代码片段、示例等将不胜感激!

4

2 回答 2

2

好的,我终于让它工作了,如果有人需要,我会发布代码。我必须将文档复制到我的 delphi Memo 并使用正则表达式在那里工作,然后将其粘贴回我想要的位置。尽管该过程可能看起来很麻烦,但它执行得非常快。无论如何,我使用的 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;
于 2012-12-06T06:52:28.757 回答
0

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

例如。

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

现在打开宏 VBA 管理器并查看 VBA 为您所做的操作生成的代码。这将使您对调用 delphi 代码所需的函数有一个很好的了解。

于 2012-12-08T18:36:19.313 回答