Delphi - 在第一个文件的过程完成后,从列表中打开下一个文件



我总共有 3214 个。doc .我需要打开第一个文件,复制其内容,将其粘贴到RichEdit中,提取一些文本,将其插入数据库,然后转到下一个文件并重复该过程。

到目前为止,我已经设法:

  • 仅打开第 1 .doc/任意 1 .doc
  • 复制内容并将其粘贴到丰富编辑中
  • 从 RichEdit 中提取文本
  • 将提取的文本插入数据库
  • 关闭打开的.doc并清除 RichEdit 的内容

我已经按顺序将所有 3214 个文件名加载到一个Memo中。

完成列表中的第一个文件后,我现在如何让它移动到列表中的下一个.doc并执行相同的操作,重复此操作直到我完成所有 3214 个.doc文件?目前正在阅读有关循环的信息,但我还无法弄清楚。

到目前为止的代码:

procedure TForm1.Button4Click(Sender: TObject);
var
  content: string;
  StartPos: Integer;
  endPos: Integer;
  i: integer;
  fname: string;
  WordApp : Variant;    
begin
  WordApp := CreateOleObject('Word.Application');
  for i := 1 to 1 do    
    fname := Memo1.Lines[i - 1];
  WordApp.Visible := True;
  WordApp.Documents.Open('C:UserstcshDesktopall'+fname);
  WordApp.ActiveDocument.Select;
  WordApp.Selection.Copy;
  RichEdit1.Lines.Add(WordApp.Selection);
  WordApp.documents.item(1).Close;
  WordApp.Quit;
  content:= RichEdit1.Text;    
  //<text extract code is here>    
  begin
    //<sql code is here>
  end;
  RichEdit1.Clear;
  Edit1.Clear;
  Edit2.Clear;
  Edit3.Clear;
  Edit4.Clear;
  Edit5.Clear;
  Edit7.Clear;
  Edit8.Clear;
  //the TEdit's hold the extracted text so the sql can retrieve it from them and insert into the database
end;
for i := 1 to 1 do

嗯,那只会运行一次。

您可能还想尝试:

  • 在每次迭代中创建 WordApp 对象,
  • 在每次迭代之间添加时间延迟(使用 Sleep 和 Application.ProcessMessages)(因为 LU RD 指出这不是必需的)

代码示例如下:

  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    WordApp := CreateOleObject('Word.Application');
    fname := Memo1.Lines[i];
    WordApp.Visible := True;
    WordApp.Documents.Open(fname);
    WordApp.ActiveDocument.Select;
    WordApp.Selection.Copy;
    Memo2.Lines.Add(WordApp.Selection);
    Memo2.Lines.Add('===');
    WordApp.documents.item(1).Close;
    WordApp.Quit;
    //Sleep(1000);  -> not needed
    //Application.ProcessMessages;
  end;

试试 System.IOUtils.TDirectory.GetFiles

GetFiles('C:temp', '*.doc');

这是一个例子

你会在这里找到一些关于SO的。

更新

...
var
line: string;
...   
for line in Memo1.Lines do begin
 <your code per file>
 ShowMessage(line);
end

最新更新