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

How to save many data tables to one file using tFDMemTable

我将许多 Excel 工作表一张一张地导入到许多 tFDMemTables 并修改它们。现在我尝试将它们保存到任何类型的 ONE 文件中,以便进一步使用 tFDMemTable 进行维护,不再 Excel。我怎样才能将多个 tFDMemTables 制作成一个对象以保存到一个文件中,而不是通过 APPEND?

我用的是Delphi10.3 Community in Windows10.参考推荐FireDAC我用的

在 .Net 中,我使用以下简单代码将多个 table 层放入一个数据集和一个 XML 文件中。但是在Delphi中好像一个数据table就是一个数据集的意思。那么什么是像 .Net DataSet 那样保存许多数据 table 的?

DataSet.Tables.Add(Table);

DataSet.WriteXml(FileName);

我不知道其他方法。将所有数据附加到新数据集中并使用 SaveToFile() 过程将其导出。

我有一个解决方案给你。

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

DataSet: TFDDataSet

每次得到一个数据table,通过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);

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

GetFiles 方法展示了如何扫描文件夹中的 Excel 个文件并将它们保存到 FDMemTable 使用 SaveFile 方法。 FDMemTable 行包括名称 Excel 文件的名称及其所在路径。

当 GetExcel方法完成时,它会将 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;