![]() |
AW: virtualstringtree in excel exportieren
In TExcelServer stecken ja auch Variablen die den Zugriff auf Excel managen. Zeig doch mal wie du in die Zellen von Excel schreibst?
Ich wollte nicht die ganzen 4000 Zeilen :thumb: Quelltext meines ExcelServers hier einstellen. Ich hatte übrigens vergessen das intensives Exception handling auch im Server stecken. :) |
AW: virtualstringtree in excel exportieren
Entschuldigung, hatte gestern leider keine Zeit mehr.
Bislang schreib ich noch gar nichts in Excel, ich hab es vorher mit einen Striggrid gelöst und mit Hilfer der Schweizer. Nun wollte ich allerdings ein VirtualStringTree benutzen, da ich mit ihm besser arbeiten kann. Nur kenn ich mich bei dem VST nicht aus, wie man den Inhalt exportiert. |
AW: virtualstringtree in excel exportieren
Zitat:
und dann auch noch mit einem passenden Objekt/Interface befüllen mußt. schau einfach mal, was sonst so dazu geschrieben wurde ![]() |
AW: virtualstringtree in excel exportieren
Delphi-Quellcode:
Das ist der Code den ich verwendet habe für den Export von Stringgrid zu Excel
//Hilfsfunktionen
function StringToVariant(const SourceString : string) : Variant; var FloatValue : Extended; begin if TryStrToFloat(SourceString, FloatValue) then Result := FloatValue else Result := SourceString; end; function RefToCell(Col, Row : Integer) : string; var Pos : Integer; begin //Spalte bestimmen Result := ''; while Col > 0 do begin Pos := Col mod 26; if Pos = 0 then begin Pos := 26; Dec(Col); end; Result := Chr(Ord('A') + Pos - 1) + Result; Col := Col div 26; end; //Spalte und Zeile zusammenführen Result := Result + IntToStr(Row); end; //Inhalt eines TStringGrid nach Excel exportieren und anzeigen function ExportStringGridToExcel(StringGrid : TStringGrid) : Boolean; var Col : Integer; Data : OleVariant; ExcelApp : OleVariant; MaxCol : Integer; MaxRow : Integer; Range : OleVariant; Row : Integer; Workbook : OleVariant; Worksheet : OleVariant; Value : OleVariant; begin Result := False; //Verbindung zu Excel herstellen ExcelApp := CreateOleObject('Excel.Application'); try if not VarIsNull(ExcelApp) then begin //Neues Workbook öffnen Workbook := ExcelApp.Workbooks.Add; if not VarIsNull(Workbook) then begin //Maximalen Bereich bestimmen MaxCol := Min(StringGrid.ColCount, ExcelApp.Columns.Count); MaxRow := Min(StringGrid.RowCount, ExcelApp.Rows.Count); if (MaxRow > 0) and (MaxCol > 0) then begin //Worksheet auswählen Worksheet := Workbook.ActiveSheet; //Bereich auswählen Range := Worksheet.Range[RefToCell(1, 1), RefToCell(MaxCol, MaxRow)]; if not VarIsNull(Range) then begin //Daten aus Grid holen Data := VarArrayCreate([1, MaxRow, 1, MaxCol], varVariant); for Row := 0 to Pred(MaxRow) do begin for Col := 0 to Pred(MaxCol) do begin Value := StringToVariant(StringGrid.Cells[Col, Row]); Data[Succ(Row), Succ(Col)] := Value end; end; //Daten dem Excelsheet übergeben Range.Value := Data; Range.Columns.AutoFit; //Excel anzeigen Workbook.Activate; ExcelApp.Visible := True; Result := True; end; end; end; end; finally Value := UnAssigned; Data := UnAssigned; Range := UnAssigned; Workbook := UnAssigned; ExcelApp := UnAssigned; end; end; |
AW: virtualstringtree in excel exportieren
Delphi-Quellcode:
Grund: Variant kennt kein Extended und er würde es demnach vesuchen runterzurunden, welches bei zu großen Werten Fehler/Exceptions verursachen würde.
function StringToVariant(const SourceString : string) : Variant;
var FloatValue : Double; das ganze Try-Funally, inklusife der :=UnAssigned; kannst du weglassen, das macht Delphi automatisch, beim Verlassen der Funktionen. Bei RefToCell ist das Col immer größer als 0? Wenn nicht, dann wäre eine Fehlerprüfung/-behandlung angebracht. Und statt dem wenig aussagenden Result würde ich eine etwas aussagekräftigere Fehlerbehandlung verwenden:
Delphi-Quellcode:
oder
procedure ExportStringGridToExcel(StringGrid : TStringGrid);
var Col : Integer; Data : OleVariant; ExcelApp : OleVariant; MaxCol : Integer; MaxRow : Integer; Range : OleVariant; Row : Integer; Workbook : OleVariant; Worksheet : OleVariant; begin //Verbindung zu Excel herstellen ExcelApp := CreateOleObject('Excel.Application'); if not VarIsNull(ExcelApp) then begin //Neues Workbook öffnen Workbook := ExcelApp.Workbooks.Add; if not VarIsNull(Workbook) then begin //Maximalen Bereich bestimmen MaxCol := Min(StringGrid.ColCount, ExcelApp.Columns.Count); MaxRow := Min(StringGrid.RowCount, ExcelApp.Rows.Count); if (MaxRow > 0) and (MaxCol > 0) then begin //Worksheet auswählen Worksheet := Workbook.ActiveSheet; //Bereich auswählen Range := Worksheet.Range[RefToCell(1, 1), RefToCell(MaxCol, MaxRow)]; if not VarIsNull(Range) then begin //Daten aus Grid holen Data := VarArrayCreate([1, MaxRow, 1, MaxCol], varVariant); for Row := 0 to Pred(MaxRow) do for Col := 0 to Pred(MaxCol) do Data[Succ(Row), Succ(Col)] := StringToVariant(StringGrid.Cells[Col, Row]) //Daten dem Excelsheet übergeben Range.Value := Data; Range.Columns.AutoFit; //Excel anzeigen Workbook.Activate; ExcelApp.Visible := True; end; end; end else raise Exception.Create('neues Workbook konnte nicht angelegt werden'); end else raise Exception.Create('Excel.Application konnte nicht geladen werden'); end;
Delphi-Quellcode:
procedure ExportStringGridToExcel(StringGrid : TStringGrid);
var Col : Integer; Data : OleVariant; ExcelApp : OleVariant; MaxCol : Integer; MaxRow : Integer; Range : OleVariant; Row : Integer; Workbook : OleVariant; Worksheet : OleVariant; begin //Verbindung zu Excel herstellen ExcelApp := CreateOleObject('Excel.Application'); if VarIsNull(ExcelApp) then raise Exception.Create('Excel.Application konnte nicht geladen werden'); //Neues Workbook öffnen Workbook := ExcelApp.Workbooks.Add; if VarIsNull(Workbook) then raise Exception.Create('neues Workbook konnte nicht angelegt werden'); //Maximalen Bereich bestimmen MaxCol := Min(StringGrid.ColCount, ExcelApp.Columns.Count); MaxRow := Min(StringGrid.RowCount, ExcelApp.Rows.Count); if (MaxRow > 0) and (MaxCol > 0) then begin //Worksheet auswählen Worksheet := Workbook.ActiveSheet; //Bereich auswählen Range := Worksheet.Range[RefToCell(1, 1), RefToCell(MaxCol, MaxRow)]; if not VarIsNull(Range) then begin //Daten aus Grid holen Data := VarArrayCreate([1, MaxRow, 1, MaxCol], varVariant); for Row := 0 to Pred(MaxRow) do for Col := 0 to Pred(MaxCol) do Data[Succ(Row), Succ(Col)] := StringToVariant(StringGrid.Cells[Col, Row]) //Daten dem Excelsheet übergeben Range.Value := Data; Range.Columns.AutoFit; //Excel anzeigen Workbook.Activate; ExcelApp.Visible := True; end; end; end; |
AW: virtualstringtree in excel exportieren
Danke Himitsu, für die Erklärungen, das wusste ich nicht.
Aber das hauptptoblem ist, das ich das Stringgrid nicht mehr verwenden möchte, lieber das VST und da blick ich ga nicht durch mit dem Export. Muss auch zugeben, das ich mich das erste mal damit beschäftige (VST Exports). |
AW: virtualstringtree in excel exportieren
Es kommt auch erstmal darauf an, wie du die Daten im VST ablegst/anzeigst/verwaltest.
dieses ließt z.B. alle Hauptknoten/Zeilen aus (wenn man den VST als Tabelle nutzt:
Delphi-Quellcode:
Aber ich würde nicht den Export aus dem VST erzeugen.
var
RowCount: Integer; Row: PVirtualNode; begin RowCount := VirtualStringTree1.RootNodeCount; Row := VirtualStringTree1.RootNode; while Assigned(Row) do begin // die Spalten der jeweiligen Zeile aus Row.Data auslesen, // irgendwie wirst du dort ja die Daten verwalten Row := Row.NextSibling; end; end; - im Hintergrund liegen alle Daten in einer eigenen Struktur/Liste rum - der VST wird, für die Anzeige mit dieser Struktur/Liste verknüpft - auch der Export wird aus der internen Liste erstellt Der VST ist ja gerade dafür entworfen wurden, daß er selber keine Daten vorhalten/verwalten muß, sondern z.B. nur Zeiger auf die Daten bekommt und diese dann "virtuell" anzeigt, aber aus externen Quellen holt. |
AW: virtualstringtree in excel exportieren
Ah, gut das versteh ich.
Auch wenn es sich jetzt dumm anhört, wie spicht man die Liste an in der diese Daten liegen? |
AW: virtualstringtree in excel exportieren
@himitsu: dazu muß der Export aber die Struktur kennen. Wenn das nicht der Fall ist, dann muß man direkt aufs VST gehen. Hat den Vorteil das der Export dann universell bleibt.
Hier noch mein Vorschlag (ein wenig Umgebaut von himitsus post):
Delphi-Quellcode:
Das ist übrigens Late-binding.
procedure ExportVirtualStringTreeToExcel(VirtualStringTree : TVirtualStringTree);
var ExcelApp, Workbook, Worksheet, Range, Data : OleVariant; iCol, iRow, ColCount, RowCount : Integer; FNodeData : PGridTreeData; FNode : PVirtualNode; begin //Verbindung zu Excel herstellen ExcelApp := CreateOleObject('Excel.Application'); if not VarIsNull(ExcelApp) then begin //Neues Workbook öffnen Workbook := ExcelApp.Workbooks.Add; //Worksheet auswählen Worksheet := Workbook.ActiveSheet; if not VarIsNull(Workbook) then begin RowCount := VirtualStringTree.TotalCount; ColCount := VirtualStringTree.Header.Columns.Count; if (RowCount > 0) and (ColCount > 0) then begin //Bereich auswählen Range := Worksheet.Range[RefToCell(1, 1), RefToCell(ColCount, RowCount)]; if not VarIsNull(Range) then begin Data := VarArrayCreate([0, RowCount - 1, 0, ColCount - 1], varVariant); with VirtualStringTree do begin FNode := GetFirst; for iRow := 0 to RowCount - 1 do begin FNodeData := GetNodeData(FNode); for iCol := 0 to ColCount - 1 do begin Data[iRow, iCol] := FNodeData^.Columns[iCol]; end; FNode := GetNext(FNode); end; end; Range.Value := Data; Range.Columns.AutoFit; //Excel anzeigen Workbook.Activate; ExcelApp.Visible := True; end; end; end else raise Exception.Create('neues Workbook konnte nicht angelegt werden'); end else raise Exception.Create('Excel.Application konnte nicht geladen werden'); end; Gruß David |
AW: virtualstringtree in excel exportieren
Schönen guten Morgen,
danke David, allerdings funktioniert diese Stelle bei mir nicht
Delphi-Quellcode:
undeklarierter Bezeichner wird mir da zurück gegeben.
FNodeData : PGridTreeData;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 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