AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Excel-Export formatieren

Ein Thema von Tim Henford · begonnen am 1. Sep 2008 · letzter Beitrag vom 2. Sep 2008
Antwort Antwort
Tim Henford

Registriert seit: 14. Sep 2006
169 Beiträge
 
#1

Excel-Export formatieren

  Alt 1. Sep 2008, 14:37
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...
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Excel-Export formatieren

  Alt 1. Sep 2008, 15:09
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.
  Mit Zitat antworten Zitat
Tim Henford

Registriert seit: 14. Sep 2006
169 Beiträge
 
#3

Re: Excel-Export formatieren

  Alt 2. Sep 2008, 09:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Excel-Export formatieren

  Alt 2. Sep 2008, 10:02
Zitat von Tim Henford:
aber das Programm bleibt beim Beenden noch offen, also im Taskmanager
Deine letzte Zeile ist nur ein
ExcelApp.Visible := True; d.h. du machst Excel nur unsichtbar. Versuch mal ExcelApp.Quit oder Close oder Exit...
  Mit Zitat antworten Zitat
Tim Henford

Registriert seit: 14. Sep 2006
169 Beiträge
 
#5

Re: Excel-Export formatieren

  Alt 2. Sep 2008, 10:07
Das hat auch nicht geklappt, aber ExcelApp:= Unassigned; scheint zu gehen.

Hast du noch eine Idee mit diesen nervigen Hochkommas am Anfang jeder Zelle?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Excel-Export formatieren

  Alt 2. Sep 2008, 11:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Excel-Export formatieren

  Alt 2. Sep 2008, 15:08
Hallo Tim und Jelly,


Zitat von Jelly:
Zitat von Tim Henford:
aber das Programm bleibt beim Beenden noch offen, also im Taskmanager
Deine letzte Zeile ist nur ein
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 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 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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 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