AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein virtualstringtree in excel exportieren
Thema durchsuchen
Ansicht
Themen-Optionen

virtualstringtree in excel exportieren

Ein Thema von youuu · begonnen am 13. Jul 2010 · letzter Beitrag vom 20. Jul 2010
Antwort Antwort
Seite 2 von 4     12 34      
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#11

AW: virtualstringtree in excel exportieren

  Alt 15. Jul 2010, 16:40
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 Quelltext meines ExcelServers hier einstellen.

Ich hatte übrigens vergessen das intensives Exception handling auch im Server stecken.
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#12

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 08:27
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.
Steven
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#13

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 08:33
Bei "ExcelWorksheet" erhalte ich schon die Fehlermeldung "undeklarierter Bezeichner"
Das ist eine Variable, welche du natürlich noch deklarieren
und dann auch noch mit einem passenden Objekt/Interface befüllen mußt.

schau einfach mal, was sonst so dazu geschrieben wurde Hier im Forum suchenExcelWorksheet ... irgendwo wird hoffentlich das Nötige zu finden sein.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#14

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 09:13
Delphi-Quellcode:
//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;
Das ist der Code den ich verwendet habe für den Export von Stringgrid zu Excel
Steven

Geändert von mkinzler (20. Jul 2010 um 08:43 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#15

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 09:37
Delphi-Quellcode:
function StringToVariant(const SourceString : string) : Variant;
var
  FloatValue : Double;
Grund: Variant kennt kein Extended und er würde es demnach vesuchen runterzurunden, welches bei zu großen Werten Fehler/Exceptions verursachen würde.

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:
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;
oder
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#16

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 09:48
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).
Steven
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#17

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 10:10
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:
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;
Aber ich würde nicht den Export aus dem VST erzeugen.
- 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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Jul 2010 um 10:13 Uhr)
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#18

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 10:34
Ah, gut das versteh ich.
Auch wenn es sich jetzt dumm anhört, wie spicht man die Liste an in der diese Daten liegen?
Steven
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#19

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 12:32
@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:
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;
Das ist übrigens Late-binding.

Gruß David
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#20

AW: virtualstringtree in excel exportieren

  Alt 19. Jul 2010, 08:31
Schönen guten Morgen,

danke David, allerdings funktioniert diese Stelle bei mir nicht

FNodeData : PGridTreeData; undeklarierter Bezeichner wird mir da zurück gegeben.
Steven

Geändert von mkinzler (20. Jul 2010 um 08:44 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr.
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