Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Экспортировать TStringGrid в Excel-файл 3

Delphi , Компоненты и Классы , TStringGrid и TDrawGrid

Экспортировать TStringGrid в Excel-файл 3

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

 { Code by Reinhard Schatzl }

 uses
   ComObj;

 // Hilfsfunktion fur StringGridToExcelSheet 
// Helper function for StringGridToExcelSheet 
function RefToCell(RowID, ColID: Integer): string;
 var
   ACount, APos: Integer;
 begin
   ACount := ColID div 26;
   APos := ColID mod 26;
   if APos = 0 then
   begin
     ACount := ACount - 1;
     APos := 26;
   end;

   if ACount = 0 then
     Result := Chr(Ord('A') + ColID - 1) + IntToStr(RowID);

   if ACount = 1 then
     Result := 'A' + Chr(Ord('A') + APos - 1) + IntToStr(RowID);

   if ACount > 1 then
     Result := Chr(Ord('A') + ACount - 1) + Chr(Ord('A') + APos - 1) + IntToStr(RowID);
 end;

 // StringGrid Inhalt in Excel exportieren 
// Export StringGrid contents to Excel 
function StringGridToExcelSheet(Grid: TStringGrid; SheetName, FileName: string;
   ShowExcel: Boolean): Boolean;
 const
   xlWBATWorksheet = -4167;
 var
   SheetCount, SheetColCount, SheetRowCount, BookCount: Integer;
   XLApp, Sheet, Data: OLEVariant;
   I, J, N, M: Integer;
   SaveFileName: string;
 begin
   //notwendige Sheetanzahl feststellen 
  SheetCount := (Grid.ColCount div 256) + 1;
   if Grid.ColCount mod 256 = 0 then
     SheetCount := SheetCount - 1;
   //notwendige Bookanzahl feststellen 
  BookCount := (Grid.RowCount div 65536) + 1;
   if Grid.RowCount mod 65536 = 0 then
     BookCount := BookCount - 1;

   //Create Excel-OLE Object 
  Result := False;
   XLApp  := CreateOleObject('Excel.Application');
   try
     //Excelsheet anzeigen 
    if ShowExcel = False then
       XLApp.Visible := False
     else
       XLApp.Visible := True;
     //Workbook hinzufugen 
    for M := 1 to BookCount do
     begin
       XLApp.Workbooks.Add(xlWBATWorksheet);
       //Sheets anlegen 
      for N := 1 to SheetCount - 1 do
       begin
         XLApp.Worksheets.Add;
       end;
     end;
     //Sheet ColAnzahl feststellen 
    if Grid.ColCount <= 256 then
       SheetColCount := Grid.ColCount
     else
       SheetColCount := 256;
     //Sheet RowAnzahl feststellen 
    if Grid.RowCount <= 65536 then
       SheetRowCount := Grid.RowCount
     else
       SheetRowCount := 65536;

     //Sheets befullen 
    for M := 1 to BookCount do
     begin
       for N := 1 to SheetCount do
       begin
         //Daten aus Grid holen 
        Data := VarArrayCreate([1, Grid.RowCount, 1, SheetColCount], varVariant);
         for I := 0 to SheetColCount - 1 do
           for J := 0 to SheetRowCount - 1 do
             if ((I + 256 * (N - 1)) <= Grid.ColCount) and
               ((J + 65536 * (M - 1)) <= Grid.RowCount) then
               Data[J + 1, I + 1] := Grid.Cells[I + 256 * (N - 1), J + 65536 * (M - 1)];
         //------------------------- 
        XLApp.Worksheets[N].Select;
         XLApp.Workbooks[M].Worksheets[N].Name := SheetName + IntToStr(N);
         //Zellen als String Formatieren 
        XLApp.Workbooks[M].Worksheets[N].Range[RefToCell(1, 1),
           RefToCell(SheetRowCount, SheetColCount)].Select;
         XLApp.Selection.NumberFormat := '@';
         XLApp.Workbooks[M].Worksheets[N].Range['A1'].Select;
         //Daten dem Excelsheet ubergeben 
        Sheet := XLApp.Workbooks[M].WorkSheets[N];
         Sheet.Range[RefToCell(1, 1), RefToCell(SheetRowCount, SheetColCount)].Value :=
           Data;
       end;
     end;
     //Save Excel Worksheet 
    try
       for M := 1 to BookCount do
       begin
         SaveFileName := Copy(FileName, 1,Pos('.', FileName) - 1) + IntToStr(M) +
           Copy(FileName, Pos('.', FileName),
           Length(FileName) - Pos('.', FileName) + 1);
         XLApp.Workbooks[M].SaveAs(SaveFileName);
       end;
       Result := True;
     except
       // Error ? 
    end;
   finally
     //Excel Beenden 
    if (not VarIsEmpty(XLApp)) and (ShowExcel = False) then
     begin
       XLApp.DisplayAlerts := False;
       XLApp.Quit;
       XLAPP := Unassigned;
       Sheet := Unassigned;
     end;
   end;
 end;

 //Example 
procedure TForm1.Button1Click(Sender: TObject);
 begin
   //StringGrid inhalt in Excel exportieren 
  //Grid : stringGrid, SheetName : stringgrid Print, Pfad : c:\Test\ExcelFile.xls, Excelsheet anzeigen 
  StringGridToExcelSheet(StringGrid, 'Stringgrid Print', 'c:\Test\ExcelFile.xls', True);
 end;

Перевод контента на русский язык:

Данное кодирование - это приложение Delphi, экспортирующее содержимое TStringGrid-контроля в файл Excel. Функция StringGridToExcelSheet создает новый файл Excel, добавляет листы в соответствии с количеством строк и столбцов в grid, заполняет листы данными из grid, форматирует ячейки как текст и сохраняет файлы на диск.

Комментарии к коду:

  1. Функция RefToCell конвертирует идентификаторы строки и столбца в ссылку Excel-стиля (например, "A1", "B2" и т.д.).
  2. В функции StringGridToExcelSheet код determines количество необходимых листов в файле на основе количества строк grid и количества строк, которые могут поместиться на одиночный лист.
  3. Затем код проходит по каждому листу, заполняет его данными из grid, форматирует ячейки как текст и сохраняет файл на диск.
  4. Если параметр ShowExcel установлен в True, код делает приложение Excel видимым; если нет, то оно работает молча.
  5. Событийный обработчик кнопки Button1Click - это пример использования функции StringGridToExcelSheet. Он экспортирует содержимое TStringGrid-контроля с именем "StringGrid" в файл Excel с указанным путем и именем.

Предложения по улучшению:

  • Добавьте код обработки ошибок, чтобы поймать любые исключения, которые могут возникнуть во время процесса экспорта.
  • Используйте более описательные имена переменных вместо одиночных буквенных переменных, таких как I, J и т.д.
  • Рассмотрите добавление диалогового окна подтверждения перед экспортом данных, чтобы пользователь мог отменить операцию.
  • Если вы планируете использовать эту функцию для больших объемов данных, рассмотрите оптимизацию ее производительности с помощью многопоточности или других техник.

Альтернативное решение:

procedure ExportStringGridToExcel(const Grid: TStringGrid; const FileName: string);
var
  XLApp, Sheet: OLEVariant;
  Data: Variant;
  RowCount, ColCount: Integer;
begin
  XLApp := CreateOleObject('Excel.Application');
  try
    XLApp.Visible := True;

    RowCount := Grid.RowCount;
    ColCount := Grid.ColCount;

    XLApp.Workbooks.Add;
    Sheet := XLApp.ActiveWorkbook.Sheets.Add;
    Sheet.Name := 'Sheet1';

    Data := VarArrayCreate([0, RowCount-1, 0, ColCount-1], varVariant);
    for I := 0 to RowCount-1 do
      for J := 0 to ColCount-1 do
        Data[I+1, J+1] := Grid.Cells[J+1, I+1];

    Sheet.Range['A1'].Resize(RowCount, ColCount).Value := Data;

    XLApp.Workbooks.SaveAs(FileName);
  finally
    if VarIsEmpty(XLApp) then
      XLApp.Quit;
  end;
end;

Альтернативное решение более простое и эффективное, чем оригинальный код. Оно создает одиночный лист в файле Excel, заполняет его данными из TStringGrid-контроля и сохраняет файл на диск. Функция ExportStringGridToExcel принимает только два параметра: TStringGrid-контрол и имя файла для экспорта.

Как экспортировать данные из TStringGrid в файл Excel с помощью Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TStringGrid и TDrawGrid ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:11:56/0.0062849521636963/1