Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   virtualstringtree in excel exportieren (https://www.delphipraxis.net/152931-virtualstringtree-excel-exportieren.html)

youuu 13. Jul 2010 12:16

virtualstringtree in excel exportieren
 
Hi, wie der Titel schon sagt, wie exportiere ich am besten virtualstringtree in excel?

s.h.a.r.k 13. Jul 2010 12:26

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.

hoika 13. Jul 2010 13:01

AW: virtualstringtree in excel exportieren
 
Hallo,

zuerst in ein TStringGrid, und von dort per Google-Suche nach Excel.


Heiko

youuu 13. Jul 2010 14:32

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

DataCool 13. Jul 2010 15:12

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

youuu 14. Jul 2010 07:37

AW: virtualstringtree in excel exportieren
 
Danke, werde ich so machen

madas 14. Jul 2010 08:10

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;

David Martens 15. Jul 2010 13:40

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:
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;
Das ist die schnellste Variante GROSSE Datenmengen an Excel zu senden. (TranslateCell macht aus Integer die Excel Spalten/Zeilen-bezeichnungen)

Der OleVariant wird in der "Wrapper"-Klasse erzeugt:
Delphi-Quellcode:
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;
RowCount und ColCount wird auch so ermittelt.
Der OleVariant aus GetDataOle kann wie ein Stringgrid benutzt werden, was ich für zusätzliche Formatierungen ausnutze. z.B.:
Delphi-Quellcode:
...
          {$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}
...
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)

Um jetzt auf das Wiedersprechen zu kommen:
man kann natürlich die Werte einzeln nach Excel schreibe:
Delphi-Quellcode:
  {$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}
Diese Variante ist aber um mehrere Größenordnungen langsamer!

Gruß David

David Martens 15. Jul 2010 14:18

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

youuu 15. Jul 2010 14:44

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 01:14 Uhr.
Seite 1 von 4  1 23     Letzte »    

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