Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Excel-Export formatieren (https://www.delphipraxis.net/119819-excel-export-formatieren.html)

Tim Henford 1. Sep 2008 13:37


Excel-Export formatieren
 
Hallo,

ich habe folgenden Quelltext, der prinzipiell auch ganz gut funktioniert:
http://www.swissdelphicenter.ch/en/showcode.php?id=1427

Delphi-Quellcode:
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);
var
  cat: _Catalog;
  tbl: _Table;
  col: _Column;
  i: integer;
  ADOConnection: TADOConnection;
  ADOQuery: TADOQuery;
  ScrollEvents: TScrollEvents;
  SavePlace: TBookmark;
begin
  //
  //WorkBook creation (database)
  cat := CoCatalog.Create;
  cat._Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0');
  //WorkSheet creation (table)
  tbl := CoTable.Create;
  tbl.Set_Name(SheetName);
  //Columns creation (fields)
  DBGrid.DataSource.DataSet.First;
  with DBGrid.Columns do
    begin
      for i := 0 to Count - 1 do
        if Items[i].Visible then
        begin
          col := nil;
          col := CoColumn.Create;
          with col do
            begin
              Set_Name(Items[i].Title.Caption);
              Set_Type_(adVarWChar);
            end;
          //add column to table
          tbl.Columns.Append(col, adVarWChar, 20);
        end;
    end;
  //add table to database
  cat.Tables.Append(tbl);

  col := nil;
  tbl := nil;
  cat := nil;

  //exporting
  ADOConnection := TADOConnection.Create(nil);
  ADOConnection.LoginPrompt := False;
  ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0';
  ADOQuery := TADOQuery.Create(nil);
  ADOQuery.Connection := ADOConnection;
  ADOQuery.SQL.Text := 'Select * from [' + SheetName + '$]';
  ADOQuery.Open;


  DisableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);
  SavePlace := DBGrid.DataSource.DataSet.GetBookmark;
  try
  with DBGrid.DataSource.DataSet do
    begin
      First;
      while not Eof do
        begin
          ADOQuery.Append;
          with DBGrid.Columns do
            begin
              ADOQuery.Edit;
              for i := 0 to Count - 1 do
                if Items[i].Visible then
                  begin
                    ADOQuery.FieldByName(Items[i].Title.Caption).AsString := FieldByName(Items[i].FieldName).AsString;
                  end;
              ADOQuery.Post;
            end;
          Next;
        end;
    end;

  finally
  DBGrid.DataSource.DataSet.GotoBookmark(SavePlace);
  DBGrid.DataSource.DataSet.FreeBookmark(SavePlace);
  EnableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);

  ADOQuery.Close;
  ADOConnection.Close;

  ADOQuery.Free;
  ADOConnection.Free;

  end;

end;
Einige Probleme treten dabei aber auf:
- Wie könnte ich überprüfen, ob es den SheetName schon gibt und dementsprechend das sheet anders bennen?
- Wie könnte ich die Spaltennamen formatieren (fett, bunt)?
- alle Spalten werden als adVarWChar definiert und dadurch wird in Excel alles mit Hochkomma angezeigt, also auch meine Zahlen - ein ändern auf einen anderen Typ im Quelltext scheint nicht so einfach zu funktionieren


Danke Tim

P.S.: Ich hatte erst mit OLE exportiert, aber das lief um einiges zu langsam...

Jelly 1. Sep 2008 14:09

Re: Excel-Export formatieren
 
OLE ist aber schon das richtige Stichwort. Es ist langsam, das stimmt, aber du kannst doch dein Export beibehalten, und dann nur über OLE die Formatierungen vornehmen.

Oder google mal nach nativen Excel Komponenten. Das geht dann wohl am Flottesten, die XLS direkt nativ zu erstellen und die Formatierungen vorzunehmen.

Tim Henford 2. Sep 2008 08:44

Re: Excel-Export formatieren
 
Ok, dankeschön mit OLE klappt das doch wie gewünscht.
Nun habe ich folgenden Code, aber das Programm bleibt beim Beenden noch offen, also im Taskmanager. Fenster sind alle geschlossen:

Delphi-Quellcode:
procedure excelFormat;
const
  // SheetType
  xlChart = -4109;
  xlWorksheet = -4167;
  // WBATemplate
  xlWBATWorksheet = -4167;
  xlWBATChart = -4109;
  // Page Setup
  xlPortrait = 1;
  xlLandscape = 2;
  xlPaperA4 = 9;
  // Format Cells
  xlBottom = -4107;
  xlLeft = -4131;
  xlRight = -4152;
  xlTop = -4160;
  // Text Alignment
  xlHAlignCenter = -4108;
  xlVAlignCenter = -4108;
  // Cell Borders
  xlThick = 4;
  xlThin = 2;
var
  ColumnRange: OleVariant;

  // function to get the number of Rows in a certain column
  function GetLastLine(AColumn: Integer): Integer;
  const
    xlUp = 3;
  begin
    Result := ExcelApp.Range[Char(96 + AColumn) + IntToStr(65536)].end[xlUp].Rows.Row;
  end;
begin
  { Start Excel by using GetActiveOleObject, you use an instance of Word that's already running, if there is one.}
  try
    ExcelApp:= GetActiveOleObject('Excel.Application');
  except
    try
      // if no instance of Word is running, try to Create a new Excel Object
      ExcelApp:= CreateOleObject('Excel.Application');
    except
      Application.MessageBox (PChar ('Excel kann nicht gestartet werden!'+#13#10+
          'Wurde Excel installiert?'),'Excel nicht gefunden', mb_iconWarning+ MB_SETFOREGROUND + MB_SYSTEMMODAL);
      Exit;
    end;
  end;

  // Arbeitsmappe öffnen
  ExcelApp.Workbooks.Open('export.xls');

  // Change the Column Width.
  ColumnRange:= ExcelApp.Workbooks[1].WorkSheets[1].Columns;
  ColumnRange.Columns[1].ColumnWidth := 20;
  ColumnRange.Columns[2].ColumnWidth := 20;
  ColumnRange.Columns[3].ColumnWidth := 20;
  ColumnRange.Columns[4].ColumnWidth := 20;
  ColumnRange.Columns[5].ColumnWidth := 20;

  // Fettdruck in den Zellen
  ExcelApp.Range['A1:Z1'].Font.Bold := True;

  // Zoom
  ExcelApp.ActiveSheet.PageSetup.Zoom := 95;

  // Show Excel:
  ExcelApp.Visible := True;
end;
Woran liegt das hier? Muss man da noch irgendetwas wieder freigeben?

Außerdem hab ich das Problem mit dem Hochkommas und den Datentyp noch nicht lösen können.

Dankeschön Tim

Jelly 2. Sep 2008 09:02

Re: Excel-Export formatieren
 
Zitat:

Zitat von Tim Henford
aber das Programm bleibt beim Beenden noch offen, also im Taskmanager

Deine letzte Zeile ist nur ein
Delphi-Quellcode:
ExcelApp.Visible := True;
d.h. du machst Excel nur unsichtbar. Versuch mal ExcelApp.Quit oder Close oder Exit...

Tim Henford 2. Sep 2008 09:07

Re: Excel-Export formatieren
 
Das hat auch nicht geklappt, aber ExcelApp:= Unassigned; scheint zu gehen.

Hast du noch eine Idee mit diesen nervigen Hochkommas am Anfang jeder Zelle?

Jelly 2. Sep 2008 10:13

Re: Excel-Export formatieren
 
Zitat:

Zitat von Tim Henford
Hast du noch eine Idee mit diesen nervigen Hochkommas am Anfang jeder Zelle?

Nicht direkt, aber was spricht denn gegen das Ändern des Zellenformates über OLE. Wie der code auszusehen hat kannst du direkt in Excel VBA nachvollziehen, nachdem du die Änderung als Makro speicherst. Das muss dann nur noch leicht an die Delphi Syntax angepasst werden.

Chemiker 2. Sep 2008 14:08

Re: Excel-Export formatieren
 
Hallo Tim und Jelly,


Zitat:

Zitat von Jelly
Zitat:

Zitat von Tim Henford
aber das Programm bleibt beim Beenden noch offen, also im Taskmanager

Deine letzte Zeile ist nur ein
Delphi-Quellcode:
ExcelApp.Visible := True;
d.h. du machst Excel nur unsichtbar. Versuch mal ExcelApp.Quit oder Close oder Exit...

Damit wir Excel sichtbar nicht unsichtbar.

Zitat:

Zitat von Tim Henford
Das hat auch nicht geklappt, aber ExcelApp:= Unassigned; scheint zu gehen.

Ist aber nicht so schön, besser ist es wie Jelly vorgeschlagen hat, mit ExcelApp.Quit; Excel zu schließen.

Zitat:

Zitat von Tim Henford
Hast du noch eine Idee mit diesen nervigen Hochkommas am Anfang jeder Zelle?

Du übergibst die Daten vom DBGrid nach Excel alle als String vielleicht ist es möglich direkt die Daten in das richtige Format zu übergeben z.B. Zahl als Zahl ; Text als Text.
Die Hochkommas wirst Du wahrscheinlich, nicht ohne Aufwand entfernen können.

Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz