CX_EXCEL_XML
Klassenhierarchie
- CX_CLASS
- CX_SIMPLE
- CX_TERMED
- CX_EXPANDABLE
- CX_FOREIGN_OBJECT
- CX_XML_OBJECT
- CX_EXCEL_XML
- CX_XML_OBJECT
- CX_FOREIGN_OBJECT
- CX_EXPANDABLE
- CX_TERMED
- CX_SIMPLE
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.
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.
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)
Funktion | MA* | Parameter | Rückgabe | Kurzbeschreibung |
---|---|---|---|---|
ConvertToDate |
CX_FLOAT | CX_NUMERIC | CX_DATE | Wandelt ein Datum im Excel-Format in ein CX_DATE um. | |
ConvertToDateTime |
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 |
INTEGER | INTEGER | Rechnet sichtbare Arbeitsblätter in absolute Arbeitsblätter um | |
GetColorIndex |
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
Datenfeld | Typ | Referenz-Klasse | I* | Kurzbeschreibung |
---|---|---|---|---|
* I = Indizierbares Datenfeld
Modul | Kurzbeschreibung |
---|---|