Oracle -> Exceldatei aus PL/SQL schreiben -> Tutorial 7
 

Tutorials

Tutorial

Komplexes Beispiel

English version

Dies ist ein Beispiel für einen Report, bei dem verschiedene Techniken kombiniert werden. Erklärt sind nur die entscheidenden Codeteile. Das gesamte Skript und die Ergebnisdatei können hier geruntergeladen werden altersliste.zip

Wie bei jedem Code ist es wichtig sich vorab zu überlegen was man braucht und wie man es am Besten organisiert.

Stile

Die Anzahl der Stile in einem Arbeitsblatt kann sehr schnell steigen, auch wenn man nur wenige Eigenschaften miteinander kombiniert. Hier allein für die Überschriften 8 und weitere 18 für die verschiedenen Text/Zahlfelder und Summen. Um die Übersicht zu behalten sollte die Benennung der Variablen einem Schema folgen, c_stilFettHdgRru wäre Fette Schrift - Hintergrund dunkelgrau - Rand rechts unten

    --Fett,Hintergrund dunkelgrau, Rand rechts und unten
    c_stilFettHdgRru        CONSTANT VARCHAR2 (5) := 's50'; 

Die Definition der Stile erfolgt in einer separaten Prozedur, die Variable für die spätere Verwendung ist global definiert. Natürlich könnte stattdessen auch eine Funktion verwendet werden und die Definition der Variablen in der Hauptprozedur erfolgen.

    tab_customStyles        xml_spreadsheet.t_tab_customStyles;
   ...
   PROCEDURE declareCustomStyles
   IS

Zunächst werden Hilfsvariablen für immer wiederkehrende Formatelemente erzeugt. Z.B. ist der Text immer oben ausgerichtet und Zeilenumbruch erlaubt, oder der Rahmen ist durchgehend schwarz mit Strichstärke 1

      r_alignmentC.vertical := 'Top';
      r_alignmentC.wrapText := TRUE;
      r_alignmentC.horizontal := 'Center';
...
      tab_borderO(1)    := r_border;
      r_border.bLineStyle := 'Continuous';
      r_border.bWeight  := 1;
      r_border.bColor   := '#000000';
      r_border.bPosition := 'Bottom';

Für die einzelnen Stile können jetzt die entsprechenden Fragmente verwendet werden

      --dunkelgrau fett Rand rechts und unten
      r_customStyles.id := c_stilFettHdgRru;
      r_customStyles.type := 'Text';
      r_customStyles.format := NULL;
      r_customStyles.alignment := r_alignmentC;
      r_customStyles.border := tab_borderRU;
      r_customStyles.background := r_backgroundDg;
      r_customStyles.font := r_fontB;
      tab_customStyles (i) := r_customStyles;
      i := i + 1;

Entsprechend werden Prozeduren definiert um die Spalten und die Druckausgabe einzustellen (declareColumnsAltersliste declarePrintSetupAltersliste). Eine weitere Routine erzeugt daraus zunächst die Definitionen, bevor die eigentliche Datei angelegt wird. Danach werden die Überschriften geschrieben.

    tab_customStyles        xml_spreadsheet.t_tab_customStyles;
   ...
PROCEDURE anlegenDatei
IS
BEGIN

    declarePrintSetupAltersliste();
    declareColumnsAltersliste();
    declareCustomStyles();
    v_fileHandle := xml_spreadsheet.createNewFile (
                        'LISTEN_DAT',
                        'Altersliste_Konto_12345678.xml',
                        tab_customStyles);
...
    xml_spreadsheet.writeData (
        v_fileHandle,
        TO_CHAR (NULL),
        c_stilFettHdgRru,
        NULL,
        NULL,
        2);
    xml_spreadsheet.writeData (
        v_fileHandle,
        'Forderungen an VN',
        c_stilFettHdgRru,
        NULL,
        NULL,
        7);
...

In der Hauptprozedur gibt es nur den Cursor, bei dem im ersten Durchgang das Anlegen der Datei aufgerufen wird. Damit wird verhindert, dass eine leereDatei angelegt wird, wenn es keine Daten gibt.

    FOR rec_liste IN cur_liste LOOP
        IF v_first THEN
            anlegenDatei();
            v_first := FALSE;
        END IF;

        v_styleFlag := MOD (rec_liste.altgrp_nr,  2);

        xml_spreadsheet.newDatarow (v_fileHandle);
        xml_spreadsheet.writeData (
            v_fileHandle,
            rec_liste.vta_cd,
            CASE v_styleFlag WHEN  1 THEN c_stilHhgRo 
            WHEN 0 THEN c_stilHdgRo 
            ELSE c_stilFettHviRo 
            END
            );
...
Ergebnis
Excel
MS-Excel output für Altersliste

Bilder zum Vergrößern anklicken