![]() |
virtualstringtree in excel exportieren
Hi, wie der Titel schon sagt, wie exportiere ich am besten virtualstringtree in excel?
|
AW: virtualstringtree in excel exportieren
Nun ja, nachdem die eigentlichen Daten nicht in dem VST stecken hat es ja damit eigentlich nichts direkt zu tun. Du könntest z.B. eine CSV-Darei schreiben.
|
AW: virtualstringtree in excel exportieren
Hallo,
zuerst in ein TStringGrid, und von dort per Google-Suche nach Excel. Heiko |
AW: virtualstringtree in excel exportieren
Vom String in Excel ist kein Problem, dachte nur ich kann es umgehen ein Stringgrid noch auf die Form zuschmieren
|
AW: virtualstringtree in excel exportieren
Hi,
wie S.h.a.r.k. schon sagte es ist ganz egal in welcher optischen Komponente die Daten stehen, Du must einfach eine ".csv" Datei erstellen. So schwer ist das ja nicht, da arbeitest Du mit TFileStream oder Textfile oder TStringList und schreibst Deine Daten zeilenweise(am Ende der Zeile CRLF)und die Felder trennst Du dann mit ";" fertig. Greetz Data |
AW: virtualstringtree in excel exportieren
Danke, werde ich so machen
|
AW: virtualstringtree in excel exportieren
Delphi-Quellcode:
exportText := vst.ContentToText(tstVisible, ';');
with TFileStream.Create('D:\ExportOrdner\ExportTest.csv', fmCreate or fmShareDenyWrite) do begin Write(exportText[1], length(exportText)); Free; end; |
AW: virtualstringtree in excel exportieren
Da muß ich ein wenig wiedersprechen.
Fakt ist man muß eine Konvertierung machen, ob StringGrid, VST oder sonstwas. Da unser Export mit unterschiedlichen "Grids" arbeiten können soll, habe ich eine "Wrapper"-Klasse geschrieben, damit die eingentliche Exportklasse übersichtlich bleibt. Hier ein paar Ansätze:
Delphi-Quellcode:
Das ist die schnellste Variante GROSSE Datenmengen an Excel zu senden. (TranslateCell macht aus Integer die Excel Spalten/Zeilen-bezeichnungen)
procedure TExcelServer.WriteRange(Row, Col, RowCount, ColCount: integer; Values: OleVariant);
begin ExcelWorksheet.Range[ TranslateCell(Row + 1, Col + 1), TranslateCell(Row + RowCount, Col + ColCount)].Value := Values; end; Der OleVariant wird in der "Wrapper"-Klasse erzeugt:
Delphi-Quellcode:
RowCount und ColCount wird auch so ermittelt.
function TDataWrapper.GetDataOle : OleVariant;
var i, iRow, iCol : Longint; bm : TBookmark; FNodeData : PGridTreeData; FNode : PVirtualNode; begin Result := VarArrayCreate([0, RowCount - 1, 0, ColCount - 1], varVariant); {$REGION 'FAdvStringGridLink'} if Assigned(FAdvStringGridLink) then begin for iCol := 0 to ColCount - 1 do begin for iRow := 0 to RowCount - 1 do begin Result[iRow, iCol] := FAdvStringGridLink.Cells[iRow, iCol]; end; end; end; {$ENDREGION} {$REGION 'FVirtualStringTreeLink'} if Assigned(FVirtualStringTreeLink) then begin with FVirtualStringTreeLink do begin FNode := GetFirst; for iRow := 0 to RowCount - 1 do begin FNodeData := GetNodeData(FNode); for iCol := 0 to ColCount - 1 do begin Result[iRow, iCol] := FNodeData^.Columns[iCol]; end; FNode := GetNext(FNode); end; end; end; {$ENDREGION} {$REGION 'FDataSourceLink'} if Assigned(FDataSourceLink) then begin with FDataSourceLink.DataSet do begin DisableControls; bm := GetBookmark; First; iRow := 0; while (not Eof) do begin i := 0; for iCol := 0 to FieldCount - 1 do begin if Fields[iCol].Visible then begin Result[iRow, i] := Fields.Fields[iCol].AsString; inc(i); end; end; Next; inc(iRow); end; GotoBookmark(bm); FreeBookmark(bm); EnableControls; end; end; {$ENDREGION} end; Der OleVariant aus GetDataOle kann wie ein Stringgrid benutzt werden, was ich für zusätzliche Formatierungen ausnutze. z.B.:
Delphi-Quellcode:
Ich benutzt übrigens Early-binding um wenigstens ein bisschen Kontrolle zu behalten. (Sollte man bei solchen Problemen immer dazu sagen, erleichter das Verständnis ungemein)
...
{$REGION 'Werte ggf. formatieren und dann einfügen —————————————————————————————'} if iMonat > -1 then begin for iRow := 0 to AData.RowCount - 1 do OleGrid[iRow, iMonat] := '01.' + OleGrid[iRow, iMonat]; end; if (FExcelServer.Version.Major >= 11) then begin if iDatum > -1 then begin OleGrid[iRow, iDatum] := StrToDateTime(OleGrid[iRow, iDatum]); end; end; ... {$REGION 'Daten schreiben ——————————————————————————————————————————————————————'} FExcelServer.WriteRange(FStartRow, FStartCol, AData.RowCount, AData.ColCount, OleGrid); {$ENDREGION} ... Um jetzt auf das Wiedersprechen zu kommen: man kann natürlich die Werte einzeln nach Excel schreibe:
Delphi-Quellcode:
Diese Variante ist aber um mehrere Größenordnungen langsamer!
{$REGION 'FVirtualStringTreeLink'}
if Assigned(FVirtualStringTreeLink) then begin with FVirtualStringTreeLink do begin FNode := GetFirst; for iRow := 0 to RowCount - 1 do begin FNodeData := GetNodeData(FNode); for iCol := 0 to ColCount - 1 do begin Result[iRow, iCol] := FNodeData^.Columns[iCol]; // Hier kann man statt den Variant zu füllen auch gleich Excel füttern end; FNode := GetNext(FNode); end; end; end; {$ENDREGION} Gruß David |
AW: virtualstringtree in excel exportieren
Und weil wir gerade dabei sind. Ich würde gerne mein Wissen, was Excel angeht, mit anderen teilen und ein Projekt ins Leben rufen was zum Ziel hat einen funktionierenden Excel(Word, Office)-Server für Delphi bereitzustellen.
Hier u.a. was ich bisher kann: - Prüfung ob Excel installiert - Excel: starten, anzeigen, verstecken, schließen, Version anfragen, Sprache (des Systems) - Dokument: öffnen, speichern, neu anlegen - Tabellen: anlegen, umbenennen, kopieren, aktivieren - PivotTable: anlegen, formatieren - PivotField: umbenennen, Orientierung/Position ändern, Funktion/Berechnung bestimmen, Zwischensummen, Sortierung - Diagramme: anlegen, Typ setzen, installierte Typen finden (nur bis 2007), Titel/Achsen ändern, neue Datenserie hinzufügen - Diagrammobjekt: Name/Fehlerbalken ändern, Datenlabel anzeigen - Hyperlink: in Zelle einfügen - Zellen/Spalten/Reihen/"Ranges": einfügen, löschen, ändern, lesen, (Zahlen)-Format ändern, Schrift ändern (nicht alles), Pagebreak anlegen - Spalten: autofit - Makros: existiert ein Makro (nicht für 2007), ausführen - diverse Listen: offene Dokumente, Tabellen, PivotTables, PivotFields, Diagramme, Diagrammobjekte Leider ist alles in EINER Klasse zusammengefasst. Wenn ich Zeit hätte (hust), würde ich für die einzelnen Objekte Klassen anlegen, ähnlich wie es in Excel selber ist. Hat jemand Lust und Zeit dabei mitzumachen? Alleine kann ich das nicht stemmen. nachmal Gruß David |
AW: virtualstringtree in excel exportieren
David Martens, das ist grad zuviel input auf einmal, da blick ich noch garniht durch.
Bei "ExcelWorksheet" erhalte ich schon die Fehlermeldung "undeklarierter Bezeichner" Wenn ich das mal "doof" kopiere |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 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