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

Delphi 如何使用tFDMemTable将多个数据表保存到一个文件中,delphi,firedac,Delphi,Firedac,我将许多Excel工作表一个接一个地导入到许多tFDMemTables中,并对它们进行了修改。现在我尝试将它们保存到任何类型的一个文件中,以便使用tFDMemTable进一步维护,不再使用Excel。如何使一个对象的多个tFDMemTables保存到一个文件中,而不是通过追加 我在Windows10中使用Delphi10.3社区。参考资料建议我使用FireDAC 在.Net中,我使用以下简单代码将多个表层制作成一个数据集和一个XML文件。但在Delphi中,数据表似乎意味着数据集。那么,是什么保

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

我在Windows10中使用Delphi10.3社区。参考资料建议我使用FireDAC

在.Net中,我使用以下简单代码将多个表层制作成一个数据集和一个XML文件。但在Delphi中,数据表似乎意味着数据集。那么,是什么保存了许多数据表,比如.Net数据集

DataSet.Tables.Add(Table);

DataSet.WriteXml(FileName);

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

我有一个解决方案供您使用

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

DataSet: TFDDataSet
每次获得数据表时,通过方法将其合并到
数据集中

最后,使用该方法编写XML文件

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

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

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

当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;
使用[…]ShellAPI;
类型
TForm1=类(TForm)
[...]
私有的
ID:Integer;//用于为FDMemTable1生成iD字段
[...]
公众的
结束;
过程TForm1.GetFiles(路径:String);
//查找给定目录中的所有文件并将其保存到FDMemTable1
变量
SearchRec:TSearchRec;
Res:整数;
FN:字符串;
开始
路径:=路径+'\*.xl*';
Res:=FindFirst(路径、faAnyFile、SearchRec);
如果Res=0{SearchRec.Attr和faAnyFile=faAnyFile},则开始
重复
SaveFile(ExtractFilePath(Path)+SearchRec.Name);
Res:=FindNext(SearchRec);
直到res0;
FindClose(SearchRec);
FN:=ExtractFilePath(Application.ExeName)+'Excelfiles.XML';
FDMemTable1.SaveToFile(FN,sfXML);
结束;
结束;
过程TForm1.SaveFile(文件名:String);
//将单个文件保存到FDMemTable1
变量
阿帕斯,
AName:字符串;
开始
APath:=提取文件路径(文件名);
AName:=ExtractFileName(文件名);
公司(ID);
FDMEM表1.插入;
FDMemTable1.FieldByName('ID')。AsInteger:=ID;
FDMemTable1.FieldByName('FilePath')。AsString:=APath;
FDMemTable1.FieldByName('FileName')。AsString:=AName;
TBlobField(FDMemTable1.FieldByName('FileData')).LoadFromFile(FileName);
表1.员额;
结束;
过程TForm1.WriteFiles;
//将文件从FDMemTable1提取到给定目录
变量
文件名:字符串;
开始
如果不是FDMemTable1。激活,则
FDMemTable1.打开;
表1.第一;
而不是FDMemTable1.Eof开始
FileName:=FDMemTable1.FieldByName('FileName').AsString;
TBlobField(FDMemTable1.FieldByName('FileData')).SaveToFile('C:\Temp\'+文件名);
//取消注释以下行以在Excel中打开文件;您需要将ShellAPI添加到使用列表中
//ShellExecute(句柄'Open',PChar('C:\Temp\'+文件名),'','',SW_SHOWNORMAL);
表1.下一步;
结束;
结束;
过程TForm1.FormCreate(发送方:TObject);
变量
FieldDef:TFieldDef;
开始
ID:=0;
FieldDef:=FDMemTable1.FieldDefs.AddFieldDef;
FieldDef.Name:=“ID”;
FieldDef.DataType:=ftInteger;
FieldDef:=FDMemTable1.FieldDefs.AddFieldDef;
FieldDef.Name:=“文件路径”;
FieldDef.DataType:=ftString;
FieldDef.Size:=最大路径;
FieldDef:=FDMemTable1.FieldDefs.AddFieldDef;
FieldDef.Name:=“文件名”;
FieldDef.DataType:=ftString;
FieldDef.Size:=最大路径;
FieldDef:=FDMemTable1.FieldDefs.AddFieldDef;
FieldDef.Name:=“文件数据”;
FieldDef.DataType:=ftBlob;
FDMemTable1.CreateDataSet;
结束;
程序TForm1.btnSaveClick(发送方:TObject);
开始
GetFiles('D:\aaad7\aaaofficeauto');
结束;
过程TForm1.btnWriteFilesClick(发送方:ToObject);
开始
写文件;
结束;

每个Excel工作表的字段与其他工作表的字段不同。检索合并文件时,是否保留了原始结构?要合并它们,每个数据集中必须具有相同的数据结构,您可以说“要进一步使用tFDMemTable进行维护,不再使用Excel。”。将大量Excel工作簿保存到单个FireDAC表中非常简单,但是您如何设想在不使用Excel的情况下“维护”Excel工作簿?也许我不太明白你到底想做什么;请解释一下。@MartynA是的,完全正确。导入到tFDMemTable后,我不需要使用Excel文件。谢谢你。那么我的答案就是你想要的吗?这很好用。我尝试的不仅仅是导入许多Excel文件,而是一次用一个文件处理多个表。因此,我将代码中的“file”改为“tMemoryStream”,我发现1 tFDMemTable本身可以用blob保存许多表。它比.net方式更复杂,但更强大、更神奇。我再次衷心感谢。
  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;