Autor Beitrag
Leto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Di 07.12.04 16:43 
Hallo. Ich hab eine Frage zu der Ole-Atomation. Ich habe in meinem Programm exakt drei Stringgrids, die ich in ener Exceldatei reinkloppen will, wobei der Inhalt jeder Stringrid in verscheidene Tabellen (nennt man die so?) reingedonert werden soll. Meine Kentnisse in der Schnittstellentechnik zu Excel sind nur sehr mau, und wollte mich nicht damit totschlagen, wenn mir hier vielleicht efinzienter geholfgen wird. Bislang verwende ich diesen (nicht vor mir) Code um eine Stringrid in eine Exceltabelle zu jagen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
//Hilfsfunktion für StringGridToExcelSheet
function RefToCell(RowID, ColID: Integer): string;
var
  ACount, APos: Integer;
begin
  ACount := ColID div 26;
  APos   := ColID mod 26;
  if APos = 0 then begin
    ACount := ACount - 1;
    APos   := 26;
  end;
  if ACount = 0 then
     Result := Chr(Ord('A') + ColID - 1) + IntToStr(RowID);
  if ACount = 1 then
     Result := 'A' + Chr(Ord('A') + APos - 1) + IntToStr(RowID);
  if ACount > 1 then
     Result := Chr(Ord('A') + ACount - 1) + Chr(Ord('A') + APos - 1) +
     IntToStr(RowID);
end;


//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(11), 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(11), 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) + IntToStr(M) +
        Copy(FileName,Pos('.',FileName),
        Length(FileName)-Pos('.',FileName)+1);
        XLApp.Workbooks[M].SaveAs(SaveFileName);
      end;
      Result := True;
    except
      // Error?
    end;
  finally
    //Excel beenden
    if (not VarIsEmpty(XLApp)) and (ShowExcel = false) then begin
      XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
    end;
  end;
end;


Nun möchste ich drei StringGrids in die selbe Datei donnern, aber in unterschitlichen Tabellen mit natürlich unterscheidlichen SheetNames. Kann mir jemand da gezielt helfen?

Danke!

_________________
Carpe Noctem
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 07.12.04 19:43 
Hallo

im groben Überblick enthält der code alles, was du brauchst und kannst es anpassen. Wo genau liegt denn das Problem?

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Leto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Di 07.12.04 21:23 
Das Problem sind meine rudimentären Kenntnisse in des genauen Codegeschehens und ich hatte gehofft für dieses Problem eine schnelle Hilfestellung zu bekommen, ohne dass ich mich jetzt zu genau beschäftigen muss, denn mehr habe ich wikrlich nicht vor damit anzustellen. Nur die drei Stringgrids in eine Datei in verscheidenen 'Seiten'. hatte gehofft, dass mir so schnell geholfen wird.

_________________
Carpe Noctem