Excel-Automation - Tabelle formatieren



  • Zunächst vielen Dank für den Tipp zum Sichtbarmachen der Excel-Anwendung (Tilsiter). Mit der Anweisung

    ExcelApplication1->set_Visible(TDefLCID(),TRUE);
    

    funktioniert das.
    Ich habe aber noch einige Fragen:
    Welche Funktion hat das Objekt TDefLCID?
    Welcher Unterschied existiert zwischen TRUE und true als Parameter für die Methode set-Visible()?

    Außerdem möchte ich noch folgendes Problem lösen:
    Ich fülle eine Excel-Tabelle mit Daten aus einer Datenbanktabelle. Nun möchte ich die EXCEl-Tabelle formatieren. Die Spaltenüberschriften in den Zellen A1 und B1 sollen fett dargestellt werden. Außerdem sollen die Spalten A und B aufgrund der Einträge in den Zellen A1 bzw. A2 in optimaler Breite erscheinen und die Zellen B2 bis B4 sollen im Währungsformat dargestellt werden. Leider kann ich mit dem folgenden Quellcode nicht die entsprechenden Bereiche formatieren, sondern es wird immer die gesamte Tabelle formatiert (z.B. Fett).

    // Tabelle formatieren
       ExcelWorksheet1->get_Range((OleVariant)StringToOleStr("A1"), (OleVariant)StringToOleStr("B1"));
       ExcelWorksheet1->Cells->Font->set_Bold((OleVariant)true);
       ExcelWorksheet1->Cells->Columns->AutoFit();
       ExcelWorksheet1->get_Range((OleVariant)StringToOleStr("B2"), (OleVariant)StringToOleStr("B4"));
       ExcelWorksheet1->Cells->set_NumberFormat((OleVariant)StringToOleStr("###.##0,00 ?"));
    

    Vielen Dank für eure Hilfe



  • (Nach)Fragen zu einem bereits behandelten Thema bitte im ursprüngliche Thread.

    Und in Zukunft bitte etwas Zeit in die Formulierung aussagekräftiger Überschriften investieren. Danke!



  • NoMi: keine Angst, das passiert erst einmal allen, die sich mit den Office-Komponenten herumärgern. Die Dokumentation ist schlecht bzw. schlicht nicht vorhanden, man muss ne Menge experimentieren.

    Zunächst zu TDefLCID(): eine LCID ist eine sog. "Locale ID" (übrigens eine unsigned long.) Diese ID bestimmt, z.B. welche Sprache, welches Datums- und welches Währungsformat zur Anwendung kommen soll. TDefLCID() ist in Borlands "UtilCls.h" definiert und sagt einfach, dass die Default-Einstellungen des Rechners zur Anwendung kommen sollen.
    Jetzt frag' mich bitte nicht, warum die set_Visible()-Methode eine Locale-Einstellung als Parameter braucht. Einige Excel-Funktionen verlangen danach... dann sollen sie sie halt kriegen: also, TDefLCID().

    Zur nächsten Frage: true und TRUE erfüllen meist denselben Zweck. Meines Wissens (kann mich irren, ich schau jetzt aber nicht nach) ist bool als ein Byte, BOOL hingegen als zwei-Byte-Wert (short int) definiert. Das ist nichts OLE-spezifisches, die ganzen Windows-SDK-Funktionen haben das auch so drauf. Stammt noch aus C-Zeiten (C hat kein bool, das kam erst mit C++).

    So, jetzt zum Eigentlichen, dem Code:
    Über ExcelWorksheet1->Cells bzw. -Columns wählt man alle Zellen eines Sheets an, deshalb deine Ergebnisse.
    get_Range(..) liefert einen Zeiger auf eine Range zurück, diesen kann man benutzen, um die ausgewählten Zellen zu bearbeiten.

    Es gibt bestimmt eine elegantere Möglichkeit (wenn's jemand weiss, bitte posten), aber ich spreche einzelne Spalten z.B. so an:

    RangePtr rp;
         // erst eine Zelle rauspicken:
         rp = ExcelWorksheet1->get_Range(TVariant("A1"),EmptyParam);
         // dann die Range auf die ganze Spalte erweitern:
         rp = rp->EntireColumn;
    
         // jetzt können wir die Range z.B. mit Unsinn füllen, Einstellungen ändern:
         rp->set_Value(TVariant("We like the moon"));
         rp->AutoFit();
    
         // für weitere Spalten einfach den Vorgang wiederholen.
    

    RangePtr ist dabei ein Zeiger auf Range, hatte ich fast vergessen zu erwähnen.
    Übrigens habe ich bestimmt schon ein halbes Dutzend Möglichkeiten gesehen, Textparameter als VARIANT zu übergeben. OLETEXT(".."), TVariant(..), StringToOleStr(..), und so weiter. Scheint Geschmackssache zu sein.



  • Übrigens, wenn es nicht auf die Einstellungen der Spalte ankommt, sondern nur auf die Inhalte, kann man die Ziel-Range auch dem Excel-Protokoll entsprechend als "A:E" angeben, wobei A die Anfangs-, und E die End-Spalte ist (für Zeilen entsprechend z.B."5:9").
    Also

    RangePtr meinerange = ExcelWorksheet1->get_Range(TVariant("A:A"),EmptyParam);
    meinerange->set_Value(TVariant(3.14159265));
    

    Sobald man jetzt aber z.B. die Spaltenbreite über AutoFit() anpassen will, muss man die Range auf die eigentlichen Spalten erweitern. Also wie oben mit EntireColumn, oder aber mit:

    meinerange = meinerange->get_Columns();
    

Anmelden zum Antworten