Я импортировал много рабочих листов Excel во многие таблицы tFDMemTable один за другим и модифицировал их. Сейчас пытаюсь сохранить их в какой-нибудь ОДИН файл, чтобы дальше вести с tFDMemTable, не больше Excel. Как я могу сделать много объектов tFDMemTables to ONE для сохранения в ОДИН файл, а не APPEND?
Я использую Delphi 10.3 Community в Windows 10. Справочник рекомендует использовать FireDAC.
В .Net я создаю слои с несколькими таблицами в ОДИН набор данных и ОДИН файл XML со следующим простым кодом. Но в Delphi кажется, что таблица данных означает набор данных. Так что же содержит множество таблиц данных, таких как .Net DataSet?
DataSet.Tables.Add(Table);
DataSet.WriteXml(FileName);
@MartynA Да, точно. Мне не нужно использовать файл Excel после импорта в tFDMemTable. Всегда спасибо.
Итак, мой ответ - это то, что вы ищете?
Я не знаю другого способа. Добавьте все данные в новый набор данных и экспортируйте его с помощью процедуры SaveToFile().
У меня есть решение для вас.
Используйте переменную TFDDataSet
для хранения всех данных из файлов Excel.
DataSet: TFDDataSet
Каждый раз, когда вы получаете таблицу данных, объединяйте ее с методом DataSet
через TFDDataSet.MergeDataSet.
// 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 отличаются от полей других рабочих листов. Когда я извлекаю объединенный файл, сохраняется ли исходная структура?
У вас должна быть одинаковая структура данных в каждом наборе данных, чтобы объединить их.
В приведенном ниже коде показано, как сохранить серию файлов Excel (рабочих книг) в строки. FDMemTable на основе одной рабочей книги на строку FDMemTable. Закончено путем сохранения файла Excel в поле большого двоичного объекта таблицы FDMemTable.
Метод GetFiles показывает, как сканировать папку на наличие файлов Excel и сохранять их в FDMemTable с помощью метода SaveFile. Строка FDMemTable включает имя файла Excel и путь, по которому он был найден.
Когда метод GetExcelMethod завершается, он сохраняет содержимое FDMemTable в файл. который затем можно скопировать в другое место.
Метод WriteFiles считывает файлы Excel из FDMemTable и записывает их в указанный каталог: этот метод также показывает, как открыть файл с помощью 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;
Это прекрасно работает. Я пытаюсь не просто импортировать много файлов Excel, но и обрабатывать множество таблиц с одним файлом одновременно. Поэтому я изменил «файл» в коде на «tMemoryStream» и обнаружил, что 1 tFDMemTable может содержать множество таблиц в себе с помощью blob. Это более сложный способ, чем .net, но более мощный и удивительный. Я сердечно ценю снова.
Вы говорите: «Дальше поддерживать с tFDMemTable, не больше Excel». Сохранение нескольких рабочих книг Excel в одной таблице FireDAC достаточно просто, но как вы представляете себе «поддержание» рабочих книг Excel без с помощью Excel? Возможно, я не совсем понимаю, что вы хотите сделать; пожалуйста, объясни.