Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - StringGrid to Excel Spaltenbreite festlegen


Bergmann89 - Di 06.03.07 12:22
Titel: StringGrid to Excel Spaltenbreite festlegen
HI,

ich hab mir jetz die Fkt. zum exportieren eines StringGrids zu einer Exceldatei
in mein Prog übernommen. Ich brauch aber unterschiedliche Spaltenbreiten, kann
mir jemand sagen wie ich das bewerkstelligen kann, gleich wenn ich das Grid exportiere?!

MfG Bergmann.


IngoD7 - Di 06.03.07 12:26

Wie exportierst du denn? Schickst du's mit der Post oder machst du eine CSV-Datei oder direkt eine XLS-Datei?


Bergmann89 - Di 06.03.07 12:31

HI, so mach ich das: HIER [http://www.dsdt.info/tipps/?id=559]


JoelH - Di 06.03.07 15:21

tuts auch ein Autofit?

Den machst du so:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure Excel_autofit(app_Excel:Variant;wb,sh:integer);
begin
  app_Excel.workbooks[wb].sheets[sh].Cells.select;
  app_Excel.Selection.Columns.autofit;
end;


App_Excel ist das Excel-OLE, wb das Workbook und sh das Worksheed welches du "autofitten" möchtest.


Bergmann89 - Do 08.03.07 19:33

HI, das mit dem Autofit sieht schoma ordentlich aus, Danke.
Kann ich auch einzellne Zellen einfärben, bzw den Font ändern?
Oder gibt es n gutet Tutorial zu der Excel verarbeitung?

MfG & Thx Bergmann.


Keldorn - Do 08.03.07 21:17

klar kannst du Zellen färben und Fonts ändern.
Nutz den Makrorekorder, zeichne ein Makro auf und mach die gewünschten Aktionen. Anschließend makro anguggn, und den vba-code in Delphi umschreiben. Mit Hilfe des Makros hast du am einfachsten alle benötigten Befehle, Parameter und Konstanten.

Mfg Frank


JoelH - Fr 09.03.07 12:17

user profile iconKeldorn hat folgendes geschrieben:

Nutz den Makrorekorder, zeichne ein Makro auf und mach die gewünschten Aktionen. Anschließend makro anguggn, und den vba-code in Delphi umschreiben. Mit Hilfe des Makros hast du am einfachsten alle benötigten Befehle, Parameter und Konstanten.


hehe,
diese Methode nutze ich auch, geht wunderbar. Meistens.....

Ein paar Funktionen hab ich mir dabei gebalstelt die ich öffters benötige:


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:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
const      // Excelkonstanten werden benötigt.
  xlCenter = $FFFFEFF4;
  xlWorksheet = -4167;
  xlnone = -4142;
  xlContinuous = 1;
  xlDiagonalDown = 5;
  xlDiagonalup = 6;
  xlEdgeLeft = 7;
  xlEdgeTop = 8;
  xlEdgeBottom = 9;
  xlEdgeRight = 10;
  xlThin = 2;
  xlInsideVertical = 11;
  xlInsideHorizontal = 12;
  xlColumnClustered = 51;
  xlColumns = 2;
  xlRows = 1;
  xlCategory = 1;
  xlPrimary = 1;
  xlBottom = -4107;
  xlValue = 2;
  xlToRight = -4161;
  xlToLeft = -4159;
  xlLandscape = 2;
  xlPageBreakPreview = 2;
  xlNormalView = 1;


procedure Excel_autofit(app_Excel:Variant;wb,sh:integer);OVERLOAD;
procedure Excel_Spaltenfarbe(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer;farbe:TColor);
procedure Excel_Spaltenhintergrund(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer;farbe:Integer);
procedure Excel_Nummernformat(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer;format:String);
procedure Excel_Merge_Spalten(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer);
procedure Excel_Schriftgroesse(app_Excel:Variant;wb,sh,ro,ru,sl,sr,groesse:integer);
procedure Excel_Schriftart(app_Excel:Variant;wb,sh,ro,ru,sl,sr:Integer;fontstyle:String);
procedure Excel_autofit(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer);OVERLOAD;
procedure Excel_LineStyle(app_Excel:Variant;wb,sh,ro,ru,sl,sr,dd,du,el,er,eb,et,iv,ih,wdd,wdu,wel,wer,web,wet,wiv,wih:integer);
procedure Excel_Select(app_Excel:Variant;wb,sh,ro,ru,sl,sr:Integer);
procedure Excel_Zeilenumbruch(app_Excel:Variant;wb,sh,ro:Integer;hv:String);


procedure Excel_LineStyle(app_Excel:Variant;wb,sh,ro,ru,sl,sr,dd,du,el,er,eb,et,iv,ih,wdd,wdu,wel,wer,web,wet,wiv,wih:integer);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].Select;
  app_Excel.Selection.Borders[xlDiagonalDown].LineStyle := dd;
  app_Excel.Selection.Borders[xlDiagonalup].LineStyle := du;
  app_Excel.Selection.Borders[xlEdgeLeft].LineStyle := el;
  app_Excel.Selection.Borders[xlEdgeTop].LineStyle := et;
  app_Excel.Selection.Borders[xlEdgeBottom].LineStyle := eb;
  app_Excel.Selection.Borders[xlEdgeRight].LineStyle := er;
  if sl <> sr then
    app_Excel.Selection.Borders[xlInsideVertical].LineStyle := iv;
  if ru <> ro then
    app_Excel.Selection.Borders[xlInsideHorizontal].LineStyle := ih;
  if wdd <> xlnone then
    app_Excel.Selection.Borders[xlDiagonalDown].Weight := wdd;
  if wdu <> xlnone then
    app_Excel.Selection.Borders[xlDiagonalup].Weight := wdu;
  if wel <> xlnone then
    app_Excel.Selection.Borders[xlEdgeLeft].Weight := wel;
  if wet <> xlnone then
    app_Excel.Selection.Borders[xlEdgeTop].Weight := wet;
  if web <> xlnone then
    app_Excel.Selection.Borders[xlEdgeBottom].Weight := web;
  if wer <> xlnone then
    app_Excel.Selection.Borders[xlEdgeRight].Weight := wer;
  if sl <> sr then
  begin
    if wiv <> xlnone then
      app_Excel.Selection.Borders[xlInsideVertical].Weight := wiv;
  end;
  if ru <> ro then
  begin
    if wih <> xlnone then
      app_Excel.Selection.Borders[xlInsideHorizontal].Weight := wih;
  end;
end;

procedure Excel_Zeilenumbruch(app_Excel:Variant;wb,sh,ro:Integer;hv:String);
var Before : IDispatch;
    st : String;
begin
   st := inttoStr(ro);
   if hv = 'h' then
   begin
     Before := app_Excel.workbooks[wb].sheets[sh].Rows[st];
     app_Excel.workbooks[wb].sheets[sh].HPageBreaks.add(Before);
   end
   else
   begin
     Before := app_Excel.workbooks[wb].sheets[sh].Columns[hv];
     app_Excel.workbooks[wb].sheets[sh].VPageBreaks.add(Before);
   end;
end;


procedure Excel_Select(app_Excel:Variant;wb,sh,ro,ru,sl,sr:Integer);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].Select;
end;

procedure Excel_Schriftart(app_Excel:Variant;wb,sh,ro,ru,sl,sr:Integer;fontstyle:String);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].Select;
  app_Excel.Selection.font.fontstyle := fontstyle;
end;

procedure Excel_Schriftgroesse(app_Excel:Variant;wb,sh,ro,ru,sl,sr,groesse:integer);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].Select;
  app_Excel.Selection.font.size := groesse;
end;

procedure Excel_Merge_Spalten(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].Select;
  app_Excel.Selection.MergeCells := true;
end;

procedure Excel_Nummernformat(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer;format:String);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].select;
  app_Excel.Selection.NumberFormat := format;
end;

procedure Excel_Spaltenfarbe(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer;farbe:TColor);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].select;
  app_Excel.Selection.font.color := farbe;
end;

procedure Excel_Spaltenhintergrund(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer;farbe:Integer);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].select;
  app_Excel.Selection.Interior.colorindex := farbe;
end;

procedure Excel_autofit(app_Excel:Variant;wb,sh,ro,ru,sl,sr:integer);
begin
  app_Excel.workbooks[wb].sheets[sh].Columns.Range[app_Excel.workbooks[wb].sheets[sh].Cells.Item[ro,sl],app_Excel.workbooks[wb].sheets[sh].Cells.Item[ru,sr]].select;
  app_Excel.Selection.Columns.autofit;
end;

procedure Excel_autofit(app_Excel:Variant;wb,sh:integer);
begin
  app_Excel.workbooks[wb].sheets[sh].Cells.select;
  app_Excel.Selection.Columns.autofit;
end;


Grundsätzlich bedeutet
wb = Workbook
sh = Sheet
ro = reihe oben
ru = reihe unten
sl = spalte links
sr = spalte rechts

mit den vier unteren begrenzt du also immer den Bereich der Felder auf die Einfluss genommen wird.

Die Funktion Linestyle ist ein Killer, das ist äusserst unübersichtlich, leider hab ich "verdrängt" was da was bedeutet.

Ein Aufruf sieht so aus bei mir


Delphi-Quelltext
1:
Excel_LineStyle(app_Excel,1,1,vonzeile,biszeile,von,bis,xlnone,xlnone,xlContinuous,xlContinuous,xlContinuous,xlContinuous,xlContinuous,xlContinuous,xlnone,xlnone,xlThin,xlThin,xlThin,xlThin,xlThin,xlThin);                    

das muss man einfach ausprobieren.


Bergmann89 - Fr 09.03.07 19:14

Danke, habs jetzt auch geschaft, hab mir aber nciht so ne mühe gemacht mit den ganzen Proceduren^^


JoelH - Mo 12.03.07 09:55

user profile iconBergmann89 hat folgendes geschrieben:
Danke, habs jetzt auch geschaft, hab mir aber nciht so ne mühe gemacht mit den ganzen Proceduren^^


Ich hab das in einer eigenen Unit und die wird bei jedem Projekt eingehängt, spart Hirnschmalz, weil ich das sehr häufig brauche.