如何使用tFDMemTable将许多数据表保存到一个文件

时间:2019-04-08 09:17:58

标签: delphi firedac

我将许多Excel工作表一个接一个地导入到许多tFDMemTables中,并对其进行了修改。现在,我尝试将它们保存到任何一种文件中,以便进一步使用tFDMemTable进行维护,而不再使用Excel。如何使许多tFDMemTables到一个对象而不是通过APPEND保存到一个文件?

我在Windows 10中使用Delphi 10.3社区。参考文献推荐我使用它的FireDAC。

在.Net中,我使用以下简单代码将多个表层分成一个数据集和一个XML文件。但是在Delphi中,数据表似乎意味着数据集。那么,拥有许多数据表(如.Net DataSet)的是什么?

DataSet.Tables.Add(Table);

DataSet.WriteXml(FileName);

3 个答案:

答案 0 :(得分:2)

下面的代码显示如何将一系列Excel文件(工作簿)保存到行中  基于每个FDMemTable行的一本工作簿来创建FDMemTable。这个做完了  通过将Excel文件保存在FDMemTable的Blob字段中。

GetFiles方法显示如何扫描文件夹中的Excel文件并将其保存到  使用SaveFile方法创建FDMemTable。 FDMemTable行包含名称  文件的位置以及找到该文件的路径。

GetExcelMethod完成后,它将FDMemTable内容保存到文件中  然后可以将其复制到其他地方。

WriteFiles方法从FDMemTable读取Excel文件并将其写入  到指定目录:此方法还显示了如何使用Excel打开文件。

当然,此处显示的技术并不限于Excel文件:  调整GetFiles中的文件掩码,它可以查找和保存任何类型的文件。

  uses [...]  ShellAPI;

  type
    TForm1 = class(TForm)
    [...]
    private
      ID : Integer;  //  used to generate iD field for FDMemTable1
      [...]
    public
    end;

  procedure TForm1.GetFiles(Path : String);
  //  Find all files in a given directory and save them to FDMemTable1
  var
    SearchRec : TSearchRec;
    Res : Integer;
    FN : String;
  begin
    Path := Path + '\*.xl*';
    Res := FindFirst(Path, faAnyFile, SearchRec);
    if Res = 0 {SearchRec.Attr and faAnyFile = faAnyFile} then begin
      repeat
        SaveFile(ExtractFilePath(Path) + SearchRec.Name);
        Res := FindNext(SearchRec);
      until Res <> 0;
      FindClose(SearchRec);
      FN := ExtractFilePath(Application.ExeName) + 'Excelfiles.XML';
      FDMemTable1.SaveToFile(FN, sfXML);
    end;
  end;

  procedure TForm1.SaveFile(FileName : String);
  //  Save an individual file to FDMemTable1
  var
    APath,
    AName : String;
  begin
    APath := ExtractFilePath(FileName);
    AName := ExtractFileName(FileName);

    inc(ID);
    FDMemTable1.Insert;
    FDMemTable1.FieldByName('ID').AsInteger := ID;
    FDMemTable1.FieldByName('FilePath').AsString := APath;
    FDMemTable1.FieldByName('FileName').AsString := AName;
    TBlobField(FDMemTable1.FieldByName('FileData')).LoadFromFile(FileName);
    FDMemTable1.Post;

  end;

  procedure TForm1.WriteFiles;
  //  Extract files from FDMemTable1 to s given directory
  var
    FileName : String;
  begin
    if not FDMemTable1.Active then
      FDMemTable1.Open;
    FDMemTable1.First;
    while not FDMemTable1.Eof do begin
      FileName := FDMemTable1.FieldByName('FileName').AsString;
      TBlobField(FDMemTable1.FieldByName('FileData')).SaveToFile('C:\Temp\'+ FileName);
      // Uncomment the following line to have the file opened in Excel; you'll need to add ShellAPI to your Uses list
      // ShellExecute(Handle, 'Open', PChar('C:\Temp\' + Filename), '','',SW_SHOWNORMAL);
      FDMemTable1.Next;
    end;
  end;

  procedure TForm1.FormCreate(Sender: TObject);
  var
    FieldDef : TFieldDef;
  begin
    ID := 0;
    FieldDef := FDMemTable1.FieldDefs.AddFieldDef;
    FieldDef.Name := 'ID';
    FieldDef.DataType := ftInteger;

    FieldDef := FDMemTable1.FieldDefs.AddFieldDef;
    FieldDef.Name := 'FilePath';
    FieldDef.DataType := ftString;
    FieldDef.Size := Max_Path;

    FieldDef := FDMemTable1.FieldDefs.AddFieldDef;
    FieldDef.Name := 'FileName';
    FieldDef.DataType := ftString;
    FieldDef.Size := Max_Path;

    FieldDef := FDMemTable1.FieldDefs.AddFieldDef;
    FieldDef.Name := 'FileData';
    FieldDef.DataType := ftBlob;

    FDMemTable1.CreateDataSet;
  end;

  procedure TForm1.btnSaveClick(Sender: TObject);
  begin
    GetFiles('D:\aaad7\aaaofficeauto');
  end;

  procedure TForm1.btnWriteFilesClick(Sender: TObject);
  begin
    WriteFiles;
  end;

答案 1 :(得分:0)

I don't know another way. Append all data into a new dataset and export it using SaveToFile() procedure.

答案 2 :(得分:0)

我为您提供解决方案。

使用TFDDataSet变量存储Excel文件中的所有数据。

DataSet: TFDDataSet

每次获取数据表时,都通过TFDDataSet.MergeDataSet方法将其合并到DataSet中。

// Getting data from Excel files.
// Suppose there are 10 excel files.
for I := 0 to 9 do
begin
  // Stored Excel data to TempDataSet.
  // ...

  // Merge TempDataSet to DataSet.
  DataSet.MergeDataSet(TempDataSet, dmDataAppend, mmAdd);
end;

最后,使用TFDDataSet.SaveToFile方法编写XML文件。

// Write to XML file.
DataSet.SaveToFile('C:\Data\DataSetData.xml', sfXML);