我将许多Excel工作表一个接一个地导入到许多tFDMemTables中,并对其进行了修改。现在,我尝试将它们保存到任何一种文件中,以便进一步使用tFDMemTable进行维护,而不再使用Excel。如何使许多tFDMemTables到一个对象而不是通过APPEND保存到一个文件?
我在Windows 10中使用Delphi 10.3社区。参考文献推荐我使用它的FireDAC。
在.Net中,我使用以下简单代码将多个表层分成一个数据集和一个XML文件。但是在Delphi中,数据表似乎意味着数据集。那么,拥有许多数据表(如.Net DataSet)的是什么?
DataSet.Tables.Add(Table);
DataSet.WriteXml(FileName);
答案 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);