Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StringGrid mit Spalten nach Excel exportieren (https://www.delphipraxis.net/69363-stringgrid-mit-spalten-nach-excel-exportieren.html)

L85 14. Mai 2006 13:14


StringGrid mit Spalten nach Excel exportieren
 
Ich würde gerne die Daten eines Stringrid nach Excel exportieren und dabei die Spalten/Zeilengröße mit nach Excel übertragen Ist das möglich? und ggf. wie?

ErdNussLocke 9. Sep 2008 18:24

Re: StringGrid mit Spalten nach Excel exportieren
 
Hi,

statt einen neuen Post zu erstellen benutz ich einfach den hier, das Problem ist das gleiche :)

Gibt es eine Möglichlkeit in einem Array gesammelte Daten nach Excel zu exportieren? Vllt hat ja
einer in den vergangenen zwei Jahren seit meinem Vorgänger einer ne Möglichkeit gefunden :)

MfG
ErdNussLocke

Der.Kaktus 9. Sep 2008 18:37

Re: StringGrid mit Spalten nach Excel exportieren
 
Zitat:

Zitat von ErdNussLocke
Hi,

statt einen neuen Post zu erstellen benutz ich einfach den hier, das Problem ist das gleiche :)

Gibt es eine Möglichlkeit in einem Array gesammelte Daten nach Excel zu exportieren? Vllt hat ja
einer in den vergangenen zwei Jahren seit meinem Vorgänger einer ne Möglichkeit gefunden :)

MfG
ErdNussLocke

Haste 2 Jahre gewartet um ein Grid nach Excel zu exportieren?..da muss ich aber mal herzhaft lachen...da gibt es hier genug Themen mit Hilfe der "Suchfunktion" der DP zu finden ;-)

[Edit] Satzbau [/Edit]

ErdNussLocke 10. Sep 2008 17:51

Re: StringGrid mit Spalten nach Excel exportieren
 
Hi,

habe es, mit Hilfe von DT, geschafft, dass mein Stringgrid in Excel exportiert wird. Ich habe es dahingehend geändert, dass es nach dem Exportieren die Exceldatei speichert und Excel sofort wieder schließt. Nun fragt Excel immer, ob die Datei (wenn sie bereits besteht) überschrieben werden soll. Kann man einstellen, dass die Datei automatisch überschrieben wird?
Danke schonmal,

MfG
ErdNussLocke

Speichercode:

Delphi-Quellcode:

    //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;

EDIT: Problem erledigt :) Der File wird einfach vor dem speichern gelöscht, falls er existiert.

toms 10. Sep 2008 18:30

Re: StringGrid mit Spalten nach Excel exportieren
 
Oder du setzt vor dem Speichern

Delphi-Quellcode:
XlApp.AlertBeforeOverwriting = False // resp.
XlApp.DisplayAlerts = False

ErdNussLocke 17. Sep 2008 12:19

Re: StringGrid mit Spalten nach Excel exportieren
 
Neue Frage:

Wenn ich mein StringGrid nach Excel exportiere wird die Formatierung nicht übernommen, also die Spalten sind
alle "Standardbreit", was für einige Spalten zu eng ist. Wie stell ich ein das die Formatierung aus dem
StringGrid nach Excel übernommen wird?

MfG
ErdNussLocke

toms 17. Sep 2008 13:03

Re: StringGrid mit Spalten nach Excel exportieren
 
Hallo,

Eine Spaltenbreite kannst du so setzen:

Delphi-Quellcode:
  ColumnRange := ExcelApp.Workbooks[M].WorkSheets[1].Columns; //  ColumnRange: OleVariant;
  ColumnRange.Columns[1].ColumnWidth := 15;
Jetzt gilt es nur noch herauszufinden, mit was für Einheiten Excel resp VBA arbeitet.

nahpets 17. Sep 2008 13:51

Re: StringGrid mit Spalten nach Excel exportieren
 
Hallo,

mach's mal so:

Delphi-Quellcode:
XLApp.Workbooks[M].Cells.Select;
XLApp.Workbooks[M].Cells.EntireColumn.AutoFit;
XLApp.Workbooks[M].Range['A1','A1'].Select;
Alles selektieren, Breite soll Excel gefälligst selbst machen, selektion aufheben.

Stephan

PS: Mit Delphimaßen nach Excelmaßen umrechnen, da läufst Du Dir 'nen Wolf.

ErdNussLocke 18. Sep 2008 11:24

Re: StringGrid mit Spalten nach Excel exportieren
 
Hmm der Moment der Wahrheit :)
Hab das mit dem Excelexport aus dem Tutorial übernommen, weiß aber nicht genau wie es funktioniert :)
Könnte mir wer sagen wo ich das AutoFit einsetzen muss?

Delphi-Quellcode:
//StringGrid-Inhalt nach Excel exportieren
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 hinzufügen
    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 befüllen
    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].Cells.EntireColumn.AutoFit; -> Hier hätte ich es eingesetzt
          XLApp.Workbooks[M].Worksheets[N].Range['A1'].Select;
          //Daten dem Excelsheet übergeben
          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) +
          Copy(FileName,Pos('.',FileName),
          Length(FileName)-Pos('.',FileName)+1);
          if fileexists(pfadE+Form1.EExportname.text+'.xls')=true
           then deletefile(pfadE+Form1.EExportname.text+'.xls');
          XLApp.Workbooks[M].SaveAs(SaveFileName);
      end;
      Result := True;
    except
      // Error?
    end;
  finally
    //Excel beenden
      XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
  end;
end;
Wäre sehr nett :):)
Daaanke

toms 18. Sep 2008 11:42

Re: StringGrid mit Spalten nach Excel exportieren
 
Hallo, Autofit muss natürlich erst nach dem Füllen des Worksheets aufgerufen werden.

Den Selection-Range könntest du in einer OleVariant SelRange speichern, damit dieser nicht 2 Mal berechnet werden muss:

also diese Variable hinzufügen

Delphi-Quellcode:
 SelRange: OLEVariant;
und dann so:

Delphi-Quellcode:
 SelRange := XLApp.Workbooks[M].Worksheets[N].Range[RefToCell(1, 1), RefToCell(SheetRowCount, SheetColCount)];
 SelRange.Select;
 XLApp.Selection.NumberFormat := '@';

 // ..

 SelRange.Select;
 XLApp.Selection.Columns.AutoFit;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr.
Seite 1 von 2  1 2      

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