Lade...
 

CX_EXCEL_XML

CX_EXCEL_XML

Klassenhierarchie
Beschreibung:

Objekte dieser Klasse repräsentieren Excel-Dokumente. Die Objekte bieten die Möglichkeit .xlsx-Dateien einzulesen, zu bearbeiten und wieder als .xlsx-Datei abzuspeichern. Die Objekte bieten genau, wie CX_WORD_XML die Möglichkeit an, die XML-Daten als .xml Datei im Klartext abzulegen, diese können von Excel jedoch nicht geöffnet werden.

Die Verarbeitung von Excel-Dokumenten ist momentan gewissen Einschränkungen unterworfen, welche in den entsprechenden Funktionen(GetValue & SetValue) näher erläutert werden.

Die Parameter sind generell nach der Änderungsrate angeordnet. Parameter, die sich häufig ändern(Wert, Spalte) stehen bei Aufrufen weiter links, als die Parameter, die seltener geändert werden. (Zeile, Arbeitsblatt)
Hierbei wird davon ausgegangen, dass Excel-Dokumente zeilenweise in aufsteigender Reihenfolge- und innerhalb der Zeile spaltenweise verarbeitet werden. Die CX_EXCEL_XML-Klasse verfügt über einen Caching-Mechanismus, welcher nur dann voll zur Geltung kommt, wenn die Zeilen in möglichst kleinen Intervallen in aufsteigender Reihenfolge bearbeitet werden.

 

Da für das Bearbeiten von XML die gesamte XML-Struktur im Speicher nachgebaut werden muss, gibt es dafür eine technisch bedingte(32-Bit System) Größenbeschränkung. Diese liegt bei einer ca. 20 MB großen .xlsx-Datei. Da für einen Großteil der Anwendungen das Lesen aus großen Excel-Dateien wichtig ist, wurde ein "readonly mode" für diese XML-Klasse implementiert. CX_EXCEL_XML öffnet automatisch jede .xlsx-Datei vorerst im "readonly mode", wenn sie mit LoadFromFile geladen wurde. In diesem Modus werden die relevanten Dateiteile als temporäre Dateien ins TEMP-Verzeichnis entpackt und von dort im sogenannten Streaming-Mode eingelesen. Die temporären Dateien werden gelöscht, sobald das XML-Objekt gelöscht wird oder das Objekt in den "write mode" wechselt. In diesem Modus kann CX_EXCEL_XML beliebig große Dateien öffnen.

197662

Da in .xlsx-Dateien die Zelleninhalte (für Strings) in einer anderen Datei gehalten werden, als die restlichen Zelleninformationen, kann eine .xlsx-Datei mit vielen Strings unabhängig vom Modus nur recht langsam ausgelesen werden (im Vergleich zu einer .csv-Datei). Um die Performance zu verbessern werden bei .xlsx-Dateien mit einer String-Datei (sharedStrings.xml) < 100MB alle Strings beim Öffnen (nur im readonly mode) der Datei initial in den Speicher geladen.

Das initiale Laden dauert für reguläre Dateien ~80ms und kann GetValue um Faktoren von 10-20 beschleunigen und reduziert die Festplattenzugriffe bei exzessivem Lesen drastisch (Bsp: 50MB/s -> 100kB/s). Sollte das Laden fehlschlagen, weil zu wenig Speicher verfügbar ist (32-Bit), dann werden die Strings wie früher bei Bedarf aus der .xml-Datei rausgesucht.

 

In den "write mode" (auch DOM-Mode) kann das CX_EXCEL_XML-Objekt auf zwei verschiedene Weisen wechseln. Entweder durch den Aufruf einer Methode, die das XML verändern würde (EmptyDocument, SetColorIndex, SetValue) oder durch das explizite Versetzen in den "write mode" mittels SetWriteMode. Beim Öffnen eines Dokuments im "readonly mode" wird der Dateipfad der Originaldatei im Objekt abgelegt. Dieser Dateipfad wird später verwendet, um in den "write mode" zu wechseln.
Sollte sich also diese Datei während der Verarbeitung verändern, dann sollte vor der Verarbeitung mit SetWriteMode der Wechsel in den "write mode" erzwungen werden.

In der Performance unterscheiden sich "readonly mode" und "write mode" kaum. Der einzige Unterschied ist die Größenbeschränkung der Dateien beim "write mode".

Code-Beispiel:

Das folgende Script erhöht den Inhalt jeder numerischen Zelle eines Excel-Dokuments. Alle anderen Zellen werden rot eingefärbt.

Var(excel, columns, rows, column, row, sheet, value)
CreateTransObject(CX_EXCEL_XML) -> excel
1 -> sheet

"test.xlsx" excel Call(LoadFromFile)
sheet excel Call(GetColumnCount) -> columns
sheet excel Call(GetRowCount) -> rows
1 -> row

do
  1 -> column
  do
    column row sheet excel Call(GetValue) -> value
    value Type CX_NUMERIC =
    if { value 1 + column row sheet excel Call(SetValue) }
    else { 3 column row sheet excel Call(SetColorIndex) }
    column 1 + -> column
    column columns > !
  while
  row 1 + -> row
  row rows > !
while

"test_out.xlsx" excel Call(SaveToFile)

 

Methodenverzeichnis (MDI)
Funktion MA* Parameter Rückgabe Kurzbeschreibung

ConvertToDate
179190

  CX_FLOAT | CX_NUMERIC CX_DATE Wandelt ein Datum im Excel-Format in ein CX_DATE um.

ConvertToDateTime
179190

  CX_FLOAT CX_NUMERIC CX_DATETIME Wandelt eine Datumsangabe mit Uhrzeit im Excel-Format in ein CX_DATETIME um.
ConvertToTime
179190
  CX_FLOAT CX_NUMERIC CX_TIME Wandelt eine Uhrzeit im Excel-Format in ein CX_TIME um.
EmptyDocument       Initialisiert das Objekt mit einem leeren Excel-Dokument
Export
178726
  INTEGER,INTEGER,CX_WIDGET,
INTEGER,INTEGER,INTEGER
  Exportiert den Inhalt des übergebenen ListViews in das Excel-Objekt. (Wie de_CyberEnterprise_ce34406)

GetAbsoluteSheetNr
182452

  INTEGER INTEGER Rechnet sichtbare Arbeitsblätter in absolute Arbeitsblätter um

GetColorIndex
181555

  INTEGER,INTEGER,INTEGER INTEGER Liefert den Farbindex einer Zelle.
Wertebereich: 0-56
GetColumnCount   INTEGER INTEGER Gibt die Anzahl der verwendeten Spalten des Excel-Dokuments zurück.
GetRowCount   INTEGER INTEGER Gibt die Anzahl der verwendeten Zeilen des Excel-Dokuments zurück.
GetSheetCount
178301
    INTEGER Gibt die Anzahl der enthaltenen Arbeitsblätter zurück.
GetSheetName
234689
  INTEGER STRING Gibt den Namen des Arbeitsblatts zurück.
SetSheetName
234689
  STRING,INTEGER STRING Setzt den Namen des Arbeitsblatts.
AddSheet
234689
  STRING INTEGER Fügt ein neues Arbeitsblat zum XML-Objekt hinzu und gibt dessen Arbeitsblattnummer zurück.
GetSheetByName
234689
  STRING INTEGER Gibt die Arbeitsblattnummer des Arbeitsblatts mit dem übergebenen Namen zurück.
GetSheets
234689
    VECTOR<INTEGER> Gibt die Arbeitsblattnummern der Arbeitsblätter im XML-Objekt zurück.
GetSheetNames
234689
    VECTOR<STRING> Gibt die Namen der Arbeitsblätter im XML-Objekt zurück.
DeleteSheet
234689
  INTEGER   Löscht das Arbeitsblatt.
MoveSheet
234689
  INTEGER,INTEGER   Verschiebt das Arbeitsblatt im XML-Dokument.
DuplicateSheet
234689
  STRING,INTEGER INTEGER Fertigt eine Kopie des Arbeitsblatts mit dem übergebenen Namen an und gibt die Arbeitsblattnummer der Kopie zurück.
GetVisibility
234689
  INTEGER BOOLEAN Gibt den Sichtbarkeitszustand des Arbeitsblatts zurück.
SetVisibility
234689
  BOOLEAN,INTEGER   Setzt den Sichtbarkeitszustand des Arbeitsblatts.
GetSheetCount
178301
    INTEGER Gibt die Anzahl der enthaltenen Arbeitsblätter zurück.
GetMode     STRING Gibt zurück, ob sich das XML-Objekt im Lese- oder Schreibmodus befindet.
GetValue   INTEGER, INTEGER, INTEGER STRING | CX_NUMERIC | CX_DATE | CX_TIME | CX_DATETIME Liefert den Inhalt einer Zelle(Referenziert durch Arbeitsblatt,Zeile,Spalte) als Objekt des entsprechenden Typs zurück
LoadFromFile   STRING   Lädt den XML-Inhalt einer .xlsx-Datei mit dem angegebenen Dateipfad in das CX_EXCEL_XML-Objekt.
SaveToFile   STRING   Speichert den aktuellen Zustand des CX_EXCEL_XML-Objektes in eine .xlsx-Datei an dem angegebenen Dateipfad.
SetColorIndex   INTEGER, INTEGER, INTEGER, INTEGER   Setzt die Hintergrundfarbe der Zelle(Arbeitsblatt,Zeile,Spalte) auf die übergebene Farbe.
SetWriteMode       Zwingt das XML-Objekt, in den Schreibmodus zu wechseln.
SetValue   (STRING | INTEGER | CX_NUMERIC | CX_DATE | CX_TIME | CX_DATETIME), INTEGER, INTGER, INTEGER   Schreibt den Inhalt des übergebenen Wertes in eine Zelle(Arbeitsblatt,Zeile,Spalte)
WriteToFile   STRING   Schreibt den aktuellen Inhalt des CX_EXCEL_XML-Objektes in eine .xml-Datei an dem angegebenen Dateipfad.
Assign   CX_XML_OBJECT   Überschreibt den Inhalt des aufrufenden XML-Objekts mit dem Inhalt des übergebenen XML-Objekts
LoadFromString   STRING   Der Inhalt des XML-Objekts wird durch das im String übergebene XML ersetzt
SaveXMLString       Der transiente Zustand des XML-Objekts wird im persistenten Bereich festgeschrieben
GetDomain     INTEGER Domain dieses Objektes
GetSiblings     COLLECTION Alle Siblings dieses Objektes
GetSiblings2     COLLECTION Alle Siblings dieses Objektes
SetDomain   INTEGER, INTEGER   Domain setzen
Unlink2       Dieses Objekt aus der Liste der Objekte mit Gültigkeit entfernen
VerifySiblings     INTEGER Ring der Austauschobjekte prüfen

* MA = Member-Access-Funktion

 

Datenverzeichnis (DDI)
Datenfeld Typ Referenz-Klasse I* Kurzbeschreibung
         
         

* I = Indizierbares Datenfeld

 

Verwendung in AppsWH
Modul Kurzbeschreibung