{....}uses DB;
{....}privateprocedure SendToExcel(aDataSet: TDataSet);
{....}uses
ComObj, ActiveX, Excel2000; // or Excel97 procedure TForm1.SendToExcel(aDataSet: TDataSet);
var
PreviewToExcel: TExcelApplication;
RangeE: Excel2000.Range; //or RangeE: Excel97.Range
I, Row: Integer;
Bookmark: TBookmarkStr;
begin
PreviewToExcel := TExcelApplication.Create(Self);
PreviewToExcel.Connect;
PreviewToExcel.Workbooks.Add(NULL, 0);
RangeE := PreviewToExcel.ActiveCell;
for I := 0 to aDataSet.Fields.Count - 1 dobegin
RangeE.Value := aDataSet.Fields[I].DisplayLabel;
RangeE := RangeE.Next;
end;
aDataSet.DisableControls;
try
Bookmark := aDataSet.Bookmark;
try
aDataSet.First;
Row := 2;
whilenot aDataSet.EOF dobegin//Write down Record As Row in msExcel
RangeE := PreviewToExcel.Range['A' + IntToStr(Row), 'A' + IntToStr(Row)];
for I := 0 to aDataSet.Fields.Count - 1 dobegin
RangeE.Value := aDataSet.Fields[I].AsString;
RangeE := RangeE.Next;
end;
aDataSet.Next;
Inc(Row);
end;
finally
aDataSet.Bookmark := Bookmark;
end;
finally
aDataSet.EnableControls;
end;
//Creating Preview from Range A1..ColumnX //Calculating ASCII 64 (Character Before "A") With Dataset FieldsCount //This Method can only handle range A1..Z?, if want to be excel column type //support, exp "AA"/"IV"
RangeE := PreviewToExcel.Range['A1', chr(64 + aDataSet.Fields.Count) + IntToStr(Row - 1)];
RangeE.AutoFormat(8, NULL, NULL, NULL, NULL, NULL, NULL);
PreviewToExcel.Visible[0] := True;
PreviewToExcel.Disconnect;
end;
// Beispiel: // Example: procedure TForm1.Button1Click(Sender: TObject);
begin
SendToExcel(Table1);
end;
Перевод кода на русский язык:
Код используется для экспорта данных из компонента TDataSet (dataset в Delphi) в файл Excel с помощью интерфейса COM-автоматизации.
Вот разбивка того, что код делает:
Процедура SendToExcel принимает TDataSet в качестве входного параметра и экспортирует его данные в файл Excel.
Создается новый экземпляр Excel, к нему подключается, добавляется новый рабочий стол.
Итерируются поля dataset и устанавливаются их метки отображения в первой строке таблицы (A1:A, где - количество полей).
Отключаются контролы dataset, закладка позиции, а затем итерируются записи dataset, каждая запись записывается как строка в файл Excel.
После экспорта всех записей включается enable controls, освобождаются ресурсы, использованные приложением Excel, и отключается соединение с Excel.
Процедура Button1Click - пример использования процедуры SendToExcel. Она просто вызывает SendToExcel с Table1 в качестве входного параметра, предполагая, что Table1 - компонент TDataSet на форме.
Вот некоторые предложения по улучшению:
Вместо жесткого кодирования имени и пути файла Excel, рассмотрите возможность передачи его как необязательного параметра процедуры SendToExcel.
Используйте механизмы обработки ошибок (например, блоки try-finally) более эффективно. Например, вы можете освободить ресурсы даже если возникнет исключение.
Рассмотрите использование более надежной методики расчета буквы столбца Excel (например, вместо жесткого кодирования ASCII-значения).
Код не проверяет, является ли dataset открытым или имеет ли записи перед экспортом. Можете добавить проверки для этого.
Вот обновленная версия процедуры SendToExcel, которая включает некоторые из этих предложений:
procedureSendToExcel(constaDataSet:TDataSet;constaFileName:string);varPreviewToExcel:TExcelApplication;RangeE:Excel2000.Range;I,Row:Integer;Bookmark:TBookmarkStr;begintryPreviewToExcel:=TExcelApplication.Create(Self);PreviewToExcel.Connect;PreviewToExcel.Workbooks.Add(NULL,0);RangeE:=PreviewToExcel.ActiveCell;// Установка меток отображения полей в первой строкеforI:=0toaDataSet.Fields.Count-1dobeginRangeE.Value:=aDataSet.Fields[I].DisplayLabel;RangeE:=RangeE.Next;end;aDataSet.DisableControls;tryBookmark:=aDataSet.Bookmark;tryaDataSet.First;Row:=2;whilenotaDataSet.EOFdobegin// Запись записи как строки в msExcelRangeE:=PreviewToExcel.Range['A'+IntToStr(Row),'A'+IntToStr(Row)];forI:=0toaDataSet.Fields.Count-1dobeginRangeE.Value:=aDataSet.Fields[I].AsString;RangeE:=RangeE.Next;end;aDataSet.Next;Inc(Row);end;finallyaDataSet.Bookmark:=Bookmark;end;finallyaDataSet.EnableControls;end;// Создание предпросмотра от диапазона A1..ColumnXRangeE:=PreviewToExcel.Range['A1',Chr(64+aDataSet.Fields.Count)+IntToStr(Row-1)];RangeE.AutoFormat(8,NULL,NULL,NULL,NULL,NULL,NULL);PreviewToExcel.Visible[0]:=True;PreviewToExcel.Disconnect;exceptonE:ExceptiondoShowMessage('Ошибка экспорта данных в Excel: '+E.Message);end;end;
Статья описывает код на Delphi, который позволяет записать данные из компонента TDataSet в файл Microsoft Excel.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.