Как сохранить множество таблиц данных в один файл с помощью tFDMemTable

Я импортировал много рабочих листов 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);

Вы говорите: «Дальше поддерживать с tFDMemTable, не больше Excel». Сохранение нескольких рабочих книг Excel в одной таблице FireDAC достаточно просто, но как вы представляете себе «поддержание» рабочих книг Excel без с помощью Excel? Возможно, я не совсем понимаю, что вы хотите сделать; пожалуйста, объясни.

MartynA 13.05.2019 17:58

@MartynA Да, точно. Мне не нужно использовать файл Excel после импорта в tFDMemTable. Всегда спасибо.

SHIN JaeGuk 15.05.2019 02:00

Итак, мой ответ - это то, что вы ищете?

MartynA 15.05.2019 09:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
1 411
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не знаю другого способа. Добавьте все данные в новый набор данных и экспортируйте его с помощью процедуры 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 отличаются от полей других рабочих листов. Когда я извлекаю объединенный файл, сохраняется ли исходная структура?

SHIN JaeGuk 08.04.2019 18:37

У вас должна быть одинаковая структура данных в каждом наборе данных, чтобы объединить их.

JacalarRick 09.04.2019 03:01
Ответ принят как подходящий

В приведенном ниже коде показано, как сохранить серию файлов 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, но более мощный и удивительный. Я сердечно ценю снова.

SHIN JaeGuk 15.05.2019 17:54

Другие вопросы по теме