![]() |
Excel Bordereinstellungen
Hi,
ich verwende diesen Code aus der DH, um die Daten eines Stringgrid nach Excel zu exportieren:
Delphi-Quellcode:
Das funktoniert auch wunderbar, jetzt möchte ich allerdings, dass um jede Zelle ein vollständige Rahmen gezeichnet wird
//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].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; (Es soll beim Ausdrucken eine schöne Tabelle sein) Hab schon hier gelesen ![]() aber hab es nicht geschafft es zu übertragen (verwende Excel 2007) Kann mir wer helfen? :) Danke schonmal, MfG ErdNussLocke |
Re: Excel Bordereinstellungen
Sorry, eigentlich sollte das in "Object-Pascal / Delphi-Language", vllt kann es ja wer verschieben :)
|
Re: Excel Bordereinstellungen
Hallo,
hab' mal mit Excel ein Makro aufgezeichnet.
Code:
Das solltest Du nach Delphi übersetzt bekommen.
Sub Makro1()
Cells.Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End Sub |
Re: Excel Bordereinstellungen
Hi,
danke schonmal für die Antwort! Aber muss ich dazu noch eine uses eintragen? Weil xldiagonal etc. kennt er nicht :) MfG ErdNussLocke |
Re: Excel Bordereinstellungen
Bei mir stehen die Werte in der Excel97-Unit. Du musst mal gucken, was bei dir drauf ist, könnte auch Excel2000 oder ExcelXP heißen.
|
Re: Excel Bordereinstellungen
Gut :) Mit ExcelXP hat er schonmal die Befehle, allerdings sagt er nun beim Exportieren, dass
die Methode 'Selection' vom Automatisierungsobjekt nicht unterstützt wird. Das sagt mir leider nicht so viel :-/ (verwende Delphi 7, Excel 2007) MfG` ErdNussLocke |
Re: Excel Bordereinstellungen
Zeig mal deinen Code, das Makro muss ja nach Delphi übersetzt werden.
|
Re: Excel Bordereinstellungen
Inzwischen zeigt er "Mitglied nicht gefunden".
Delphi-Quellcode:
//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].Worksheets[N].Range['A1'].Select; //Macro XLApp.Selection.Borders(xlDiagonalDown).LineStyle := xlNone; XLApp.Selection.Borders(xlDiagonalUp).LineStyle := xlNone ; XLApp.Selection.Borders(xlEdgeLeft).LineStyle := xlContinuous; XLApp.Selection.Borders(xlEdgeLeft).Weight := xlThin; XLApp.Selection.Borders(xlEdgeLeft).ColorIndex := xlAutomatic; XLApp.Selection.Borders(xlEdgeTop).LineStyle := xlContinuous; XLApp.Selection.Borders(xlEdgeTop).Weight := xlThin; XLApp.Selection.Borders(xlEdgeTop).ColorIndex := xlAutomatic; XLApp.Selection.Borders(xlEdgeBottom).LineStyle := xlContinuous; XLApp.Selection.Borders(xlEdgeBottom).Weight := xlThin; XLApp.Selection.Borders(xlEdgeBottom).ColorIndex := xlAutomatic; XLApp.Selection.Borders(xlEdgeRight).LineStyle := xlContinuous; XLApp.Selection.Borders(xlEdgeRight).Weight := xlThin; XLApp.Selection.Borders(xlEdgeRight).ColorIndex := xlAutomatic; XLApp.Selection.Borders(xlInsideVertical).LineStyle := xlContinuous; XLApp.Selection.Borders(xlInsideVertical).Weight := xlThin; XLApp.Selection.Borders(xlInsideVertical).ColorIndex := xlAutomatic; XLApp.Selection.Borders(xlInsideHorizontal).LineStyle := xlContinuous; XLApp.Selection.Borders(xlInsideHorizontal).Weight := xlThin; XLApp.Selection.Borders(xlInsideHorizontal).ColorIndex := xlAutomatic; //Macroende //Daten dem Excelsheet übergeben Sheet := XLApp.Workbooks[M].WorkSheets[N]; Sheet.Range[RefToCell(1, 1), RefToCell(SheetRowCount,SheetColCount)].Value := Data; end; end; |
Re: Excel Bordereinstellungen
Oje, war das jetzt so grob falsch, dass keiner mehr weiter mag :D
Sorry :-/ Aber vllt kann sich ja doch noch wer durchringen :) |
Re: Excel Bordereinstellungen
An welcher Stelle kommt denn der Fehler?
|
Re: Excel Bordereinstellungen
hoi,
was passiert wenn du 'Selection' durch 'Range' ersetzt ? (XLApp.Range.Borders(xlDiagonalDown).LineStyle := xlNone; ...) cya |
Re: Excel Bordereinstellungen
Hi,
der Fehler "Mitglied nicht gefunden" kommt direkt in der ersten Macrozeile (XLApp.Selection.Borders(xlDiagonalDown).LineStyle := xlNone;) und wenn ich selection durch range ersetze, kommt ebenfalls in der ersten Zeile "unzulässige Parameterzahl" :-/ Allerdings wird auch weiter oben schon selection benutzt, also ist die Funktion doch zulässig, nur mit borders kommter nicht klar? Thx und MFG ErdNussLocke |
Re: Excel Bordereinstellungen
kann es sein das zu range noch irgendwas in [] muss?
so wirds beim sheet.range verwendet |
Re: Excel Bordereinstellungen
Schon über eckige Klammern versucht? (Borders[xl..])
|
Re: Excel Bordereinstellungen
Das ist ja zum Verzweifeln :-/
Jetz kommt wieder das die Methode "borders" vom Automatisierungsprozess nicht unterstützt wird. Gibt es vielleicht noch eine andere Art nach Excel zu exportieren, wo vllt einer schon eine Lösung hat :) MFG ErdNussLocke |
Re: Excel Bordereinstellungen
Delphi-Quellcode:
Den Parameter des Range und die Borders musst Du für dich natürlich noch anpassen.
Worksheet.Range['A1:B4'].Borders[xlEdgeLeft].LineStyle := xlContinuous;
Worksheet.Range['A1:B4'].Borders[xlEdgeLeft].ColorIndex := xlColorIndexAutomatic; Worksheet.Range['A1:B4'].Borders[xlEdgeLeft].Weight := xlThin; Viele Grüße |
Re: Excel Bordereinstellungen
funktioniert :)
Danke an alle! |
Re: Excel Bordereinstellungen
Hi,
weiter gehts ;) Meine Frage diesmal: Ich habe jetzt das Stringgrid in einer schönen Tabelle verpackt nach Excel übergeben. Wie kann ich jetzt über dieser Tabelle 2 oder 3 Zeilen einfügen, die nicht zur Tabelle gehören und wo ein anderer Text (quasi eine Überschrift) eingefügt werden soll. (Das gleiche auch mit einer Fußzeile). Wäre ne feine Sache wenn mir da wer helfen kann :) Danke schonmal, MfG ErdNussLocke |
Re: Excel Bordereinstellungen
Im Excelsheet?
|
Re: Excel Bordereinstellungen
Der Code ist wie gesagt nicht von mir, und ich bin mit der Excelsache auch noch ganz neu im Geschäft.
Was brauch ich? Einen Befehl, der zunächst drei Zellen über der Tabelle einfügt. Aber wie und an welcher Stelle? Muss es irgendwo hier mit rein?
Delphi-Quellcode:
Aber die Überschrift steht ja nicht mit im Grid. und danach geht schon die Formatierung der Tabelle los. Muss ich dann noch
//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); einen ganze neuen Teil zur Befüllung einfügen? |
Re: Excel Bordereinstellungen
joa gut, durch ne Menge ausprobieren und "try and error" hab ichs jetzt geschafft :)
Trotzdem danke! |
Re: Excel Bordereinstellungen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr. |
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