Lesen und Schreiben der Zellen-Inhalte von Excel-Tabellen.
Lesen und Schreiben der Zellen-Inhalte von Excel-Tabellen.
Beide Excel-Dateiformate werden unterstützt:
Die Funktionen dienen zum Lesen und Schreiben von Textinhalten von Excel-Tabellen.
Tabellenformate werden von den priint:comet Plugins nicht ausgewertet.
Um es mal positiv zu sagen: Der Umgang von Excel mit Schriften ist sehr kreativ. Je nachdem, wo eine Schrift ausgewählt wurde und welche Schrift verwendet wird, gibt es sieben (!) verschiedene Schreibweisen für die Kombination aus Schriftfamilie und Schriftschnitt. Generell werden im Dialog Zelle formatieren->Schriftart und in der Liste der Schriften der Toolbar unterschiedliche Schriftnamen angezeigt (und verwendet!).
Die Tabelle zeigt die unterschiedlichen Schreibweisen examplarisch am (nicht existierenden) Font Howgrotesque.
Schriftname | Beschreibung |
Howgrotesque Bd | Dialog Zelle formatieren->Schriftart |
Howgrotesque Bold | Liste der Schriften der Toolbar. Angezeigt wird darüberhinaus aber nur der Familenname Howgrotesque. |
Howgrotesque-Bold | In manchen Schriften wird Postscript-Name der Schrift verwendet. |
HowgrotesqueBold | Mitunter findet Excel einen Schriftnamen, den nicht mal die Schriftsammlung findet. |
Howgrotesque Fett | Manchmal wird der Stilname auch in lokaler übersetzung verwendet. |
Howgrotesque Kursiv, Fett | Hat die Schrift mehrere Einstellungen, kann der Stilname auch durch Komma getrennt sein. |
Howgrotesque Extrabreit, Schrä | Schriftnamen werden generell bei bei 31 Zeichen abgeschnitten. Die Information über den Bold-Schnitt geht hier also glatt verloren (und wird auch in Excel nicht mehr angewendet). |
Mit den Zusatz-Einstellungen für Fett und Kursiv kann außerdem die Darstellung einer Schrift geändert werden. Ist kein entsprechender Schriftschnitt installiert oder verfügbar, wird die Fett- bzw. Kursivschrift dabei on the fly berechnet. Es entsteht ein sogenannter fake Bold bzw. Italic. Von InDesign®, Illustrator® oder PDF-Generatoren wird dieses Verhalten nicht unterstützt.
überprüfen Sie daher bei der Verwendung der Schriftschnitte Bold, Italic und BoldItalic vorher immer, ob die gewählte Schrift überhaupt einen entsprechenden Schriftschnitt hat.
Um das Maß vollzumachen, kommt Excel zusätzlich mit eigenen Schriften. So enthält das Mac-Bundle von Excel enthält im Ordner Microsoft Excel.app/Contents/Resources/DFonts über 200 eigene Schriften. Diese Schriften werden bei Bedarf geladen und können nur von Excel verwendet werden (jedenfalls solange sie nur in diesem Bundle liegen).
Das ist jetzt alles nicht besonders schön. Zur Lösung haben wir eine sogenannte FontDB eingerichtet, die fest eingebaut ist und bei Bedarf nach den jeweils gültigen Schriftnamen durchsucht wird. Die FontDB enthält aktuell fast 2.000 Schriftschnitte. Zusätzlich haben wir alle fast 500 Schriften, die wir gefunden haben in Excel im Dialog und in der Liste der Toolbar geprüft und die FontDB entsprechend angepasst.
Mit einiger Wahrscheinlichkeit werden die von Ihnen verwendeten Schriften also schon richtig angewendet werden können.
Wird ein Schriftname trotzdem nicht in der FontDB gefunden, werden automatisch alle auf Ihrem Rechner installierten TrueType-, TrueTypeContainer- und OpenType-Schriften (ttf, ttc, otf) durchsucht:
Das Durchsuchen der installierten Schriften kann einmalig nach Programmstart einige Zeit (etwa 2-4) Sekunden dauern! Falsche oder fehlende Angaben in den Schriften können darüberhinaus zu Fehlern bei der Suche nach einer Schrift führen - und Fehler in Schriften gibt es jede Menge. Bei der Erstellung der FontFB mussten wir feststellen, dass ungefähr 20-25% aller Schriften Fehler insbesondere in den Angaben zu Schriftstärke, Neigung und Laufweite haben.
Aus Performance-Gründen und zur Vermeidung von Fehlern raten wir dringend, unbekannte Schriften in Ihrer lokalen Font-DB einzutragen. Hinweise dazu finden Sie hier:
Zur Auflösung der verschiedenen von Excel verwendeten Schriftnamen kann der Excel-Schriftname mit # getrennt an den Namen der Schriftfamilie angefügt werden. So finden Sie die für einen FontDB-Eintrag nötigen Informationen:
Attribut | Beschreibung | Beispiel |
font | Name der Schriftfamilie wie er z.B. in InDesign® verwendet wird. | font="Meta Pro" |
font mit # | Vollständiger Name aus Schriftfamilie und -schnitt wie er in Excel verwendet wird. Die Angabe wird mit # getrennt hinter
dem Namen der Schriftfmilie angegeben. Den verwendeten Namen finden Sie im Logfile:
# Search definition for Excel font 'MetaPro-CondBook'
|
font="Meta Pro#MetaPro−CondBook" |
face | Name des Schriftschnittes wie er z.B. in InDesign® verwendet wird. | face="Condensed Book" |
style, weight, stretch | Angaben zur Ausprägung der Schrift. Die Werte ergeben sich durch Vergleich mit den anderen Schriftschnitten der Schriftfamilie. Beachten Sie aber, dass es genau eine Variante mit den Werten n/400/0 geben muß! |
style="n" weight="400" stretch="-2" |
Hier ein Beispiel für Erweiterungen der FontDB:
<variant font="Meta Pro#MetaPro-CondBook" face="Condensed Book" style="n" weight="400" stretch="-2" /> <variant font="Meta Pro#MetaPro-CondBold" face="Condensed Bold" style="n" weight="700" stretch="-2" />
Datum und Zeit können von Excel in etwa 175 verschiedenen Sprachen angezeigt werden. Alle dafür verwendeten Zeittrenner, Monats- und Tagenamen sind Teil der Programm-Resourcen von Excel. Von den priint:comet Plugins und von comet_pdf werden diese Angaben mit Hilfe der installierten Locales des Betriebssystems berechnet. Die jeweils benötigte Locale wird im Logfile ausgegeben:
# Set locale 'hy_AM' for Excel datetime format '[$-42B]dd/mmm/yyyy;@'
Kaum ein Betriebssystem enthält alle von Excel verwendeten Locales. Die Installation zusätzlicher Locales hängt stark vom Betriebsystem und von den bereits installierten Locales ab. Dabei können wir Ihnen leider nicht helfen. Sie können aber für jede Locale eine (möglichst nahe) Ausweich-Locale festlegen, die statt dessen verwendet werden wird. Mehr zu Ausweich-Locales finden Sie hier.
Nach der Übersetzung in die Zielsprache können Zeittrenner, Monats- und Tagnamen Zeichen enthalten, die in der Zellschrift nicht definiert sind. Zum Beispiel enthält die Standardschrift Calibri keine japanischen, hebräischen oder armenischen Schriftzeichen. Excel wählt dann für einen japanischen Monatsnamen automatisch eine passende Schrift aus. Welche Schrift dabei verwendet wird, kann nicht ausgewählt werden. Von den priint:comet Plugins und von comet_pdf werden standardmäßig keine Schriftersetzungen gemacht. Sie können aber für jede Locale geeignete Schriften festlegen. Mehr zu Schriftersetzungen für Locales finden Sie hier.
Wird für ein Excel-Datum die aktuelle Sprache des Betriebssystems verwendet, wird Excel das Datum auf einem anderen Rechnern automatisch an dessen Sprache zeigen. Mit einem deutschen Betriebssystem werden Sie also ein deutsches Datum sehen, mit einem englischen Betriebssystem ein englisches. Wollen Sie die eigene Sprache fest einstellen, müssen Sie das explizit in einem benutzerdefinerten Format festlegen!
Von den priint:comet Plugins wird in diesem Fall die Sprache der Plugins (de_DE, en_US, fr_FR, ja_JP) verwendet. In comet_pdf können Sie die Sprache mit Hilfe der Programm-Option --lang [DE|EN|FR|JP] festlegen.
Überraschenderweise ersetzt Excel die Zeichen '/' und ':' in Zeitangaben automatisch durch die Datums- bzw. Uhrzeittrenner des Betriebsystemes (und nicht in der Locale des Zellformates). Daran haben wir uns in den priint:comet Plugins und in comet_pdf gehalten, verwenden aber (immerhin) die Sprache der Plugins (de_DE, en_US, fr_FR, ja_JP). In comet_pdf können Sie die Sprache mit Hilfe der Programm-Option --lang [DE|EN|FR|JP] festlegen.
Zur Definition von Ausweich-Locales und Schriftersetzungen verwenden Sie die Konfigurationsdatei datetime_locales.xml. Diese Datei wird (in dieser Reihenfolge) an folgenden Orten gesucht. Spätere Angaben überschreiben frühere:
Es gibt zwei Typen von Definitionen:
Hier ein Beispiel:
<datetime_locales> <!-- Map Afrikaans to English (US) - the default on Mac --> <datetime_locale name="af_ZA"> <substitution>en_US</substitution> <font/> <face/> <size/> </datetime_locale> <!-- Change font for Armenian datetimes --> <datetime_locale name="hy_AM"> <substitution/> <font>Arial Unicode MS</font> <face/> <size>120%</size> </datetime_locale> <!-- Change font for Japanese datetimes --> <datetime_locale name="ja_JP"> <substitution/> <font>HGPGothicE</font> <face/> <size>75%</size> </datetime_locale> </datetime_locales>
Bilder von Tabellenzellen werden als temporäre Dateien in den lokalen Cache-Ordner geladen. Bitte beachten Sie folgende Einschränkungen:
Folgende Rückgaben werden bei Bildern geliefert:
Bilder können zur Zeit nur von InDesign® importiert werden!
Zur vereinfachten Abfrage von Zellinhalten in Platzhaltern kann die 'Sprache' excelquery verwendet werden.
Bitte beachten Sie, dass die Sprache excelquery aussschließlich in Platzhaltern und nur zur Ermittlung der Inhalte einzelner Zellen definiert ist. In cScript wird excelquery nicht unterstützt; hier können die Abfragen auf einfache Weise mit den Befehlen des hier beschriebenen Moduls excel gemacht werden.
Die Definition der Sprache ist sehr einfach:
[functionVariables]
"excelFile"
select "formatString"
with cell
{ ( and | , ) cell }
Zur Einleitung hier ein kleines Beispiel, das einen Preis in der gleichen Schrift wie in der Excel-Datei ausgibt und bei dem der Cent-Betrag hochgestellt ist. Aus dem Excel-Wert 123.56789 wird dann beispielsweise 123,57.
Der Wert steht in der Zelle B1 der Tabelle ttt der Datei aaa.xlsx des Desktops. Die erhaltene Zahl zuerst mit Hilfe der Funktion int auf eine Ganzzahl gekürzt. Danach wird die Zelle erneut gelesen, uns interessiert jetzt aber nur die Schrifteinstellung der Zelle, die soll auf den festen Wert "," angewendet werden (Damit das Komma in der gleichen Schrift erscheint wie der Preis). Und schließlich wird der Wert ein drittes Mal geholt, jetzt interessiert uns aber nur der Cent-Betrag, also die (gerundeten) ersten zwei Nachkommastellen des Wertes aus Excel. Wir erhalten also drei Strings. Im Formatstring werden diese Ausgaben entsprechend zusammengefasst.
"$DESKTOP/aaa.xlsx" select "Unser Preis %s%s<cPosition:Superscript>%s<cPosition:>" with tt ttt!B1 int and tt ttt!B1 value "," and tt ttt!B1 cent
Wie in allen anderen Platzhaltern sind auch hier Funktionsvariablen zur Konfiguration der Platzhalter in InDesign® resp. Illustrator® erlaubt. Die Definitionen werden wie gewohnt direkt am Anfang der Platzhalter-Anweisung gemacht.
Hier ein einfaches Beispiel.
#pragma var "cell//Zelle" #pragma var "fmt//Format" "plain//Unformatiert" "tt//TaggedText" "html//HTML"
Neben den per Funktionsvariablen defnierten <Tags> der Anweisung sind natürlich auch alle Tags der Platzhalterumgebung wie <ID>, <ID2>, usw. definiert.
Die Entscheidung, ob eine Anweisung ein Excel- oder ein XML-Query ist, wird anhand der Dateiendung getroffen. Excel-Dateien müssen die Endungen xlsx oder xls haben. Unvollständige Pfade werden relativ zum aktuellen XML-Ordner aufgelöst. $ALIASSE am Anfang des Pfades sind erlaubt.
Die Angabe der Datei erfolgt in Anführungszeichen.
Hier ein Beispiel.
"$DESKTOP/aaa.xlsx"
Im Formatstring legen Sie fest, wie die folgenden Zellinhalte formatiert werden und welche (Zwischen)texte zusätzlich ausgegeben werden sollen. Die Syntax entspricht der allgemein verwendeten Form für formatierte Textausgabe in cScript. Als Wert der %-Marker wird dabei jeweils der Inhalt der nächsten Zelldefinition der Anweisung verwendet. Die Inhalte der Zellen müssen dabei jeweils in das entsprechende Zielformat umgewandelt werden können. Ein %f erwartet also einen Zellinhalt, der in eine Zahl umgewandelt werden kann usw.. Es sind beliebig viele %-Marker erlaubt, aber fehlende Zelldefinitionen können zu Fehlern in der Ausführung führen!
Der Formatstring muss in Anführungszeichen eingeschlossen werden!
Hier ein Beispiel in TaggedText-Notation.
"Unser Preis : %s%s<cPosition:Superscript>%s<cPosition:>"
Die Zellen definieren die Inhalte der %-Marker im Formatstring. Für jeden %-Marker wird genau eine Zelldefinition mit dem passenden Datentyp erwartet. Die erste Zelldefinition wird mit dem Schlüsselwort with vom Formatstring getrennt. Zelldefinitionen werden durch and oder Komma (,) voneinander getrennt.
Hier die allgemeine EBNF-Syntax einer Zelldefinition:
cell := numtype address numfunctions | stringtype address functions
numtype := int | float | double stringtype := string | plain | tt | html
address := [ sheet '!' ] ( cellName | cellAddress ) sheet := ( '"' Name_of_Sheet '"' ) | Name_of_Sheet | Index_of_Sheet cellName := [A-Za-z]+[0-9]+ cellAddress := row ',' col [onebased]
numfunctions := { numfunction } numfunction := int | cent | round fractions | script action_id
functions := { function | numfunction } function := upper | lower | reverse | folder | file | shortfile | extender | substr startpos length | rsubstr startpos length | trim '"' letter '"' | token '"' letter '"' tokennumber | value '"' any text '"'
Das sieht komplizierter aus, als es ist : Jede Zelldefinition beginnt mit der einleitenden Typdefinition. Darauf folgt die Adressierung der Zelle im Excel-Dokument. Danach können Zellinhalte, die einen Text enthalten (string, plain, tt, html) mit eingebauten oder selbst implmentierten Funktionen bearbeitet werden.
Zellinhalte können als Ganzzahlen, Kommazahlen oder als Text geholt werden. Beachten Sie bitte, dass Zahlen auch als Text geholt werden können. Umgekehrt können aber Texte in aller Regel nicht als Zahlen geholt werden!
Folgende Datentypen werden unterstützt:
Schlüssel | Typ | Beschreibung |
int | Ganzzahlen | Liefere den Inhalt der Zelle als Ganzzahl. Kommazahlen der Excel-Tabelle werden auf den ganzzahligen Anteil verkleinert. (123.89 ergibt also 123) Textinhalte können in aller Regel nicht in Ganzahlen konvertiert werden!. Im Formatstring können diese Werte u.a. mit %d geschrieben werden. |
float, double | Kommazahlen | Liefere den Inhalt der Zelle als Kommazahl (mit bis zu 20 Stellen). Textinhalte können in aller Regel nicht in Kommazahlen konvertiert werden!. Im Formatstring können diese Werte u.a. mit %f oder %.2f geschrieben werden. |
plain, string | Unformatierter Text |
Liefere den Inhalt der Zelle als unformatierten Text. Zahlen werden als Kommazahlen mit bis zu 20 Stellen dargestellt. Bildzellen liefern den vollständigen Pfad der geladenen Bilddatei.
Im Formatstring können diese Werte u.a. mit %s geschrieben werden. |
tt | TaggedText-formatierter Text |
Liefere den Inhalt der Zelle als TaggedText-formatierten Text. Bei nicht durch Funktionen nachbearbeitete Texte werden dabei, wenn vorhanden, die RichText-Einstellungen des Textes übernommen. Sonst wird die Schrifteinstellung der Zelle verwendet. Im Formatstring können diese Werte u.a. mit %s geschrieben werden. Bildzellen liefern eine gültige <w2inline>-Definition zum Anlegen eines eingebetteten Inlines des Bildes. Beginnt der Formatstring nicht mit einem gültigen TT-Trailer, wird automatisch ein %!TT vor den Text gesetzt. In einer Anweisung dürfen TaggedText und HTML nicht gemischt werden. Die sogenannten Design-Farben von Excel und deren Abtönungen können aktuell nicht unterstützt werden. Schrift in diesen Farben wird schwarz dargestellt. |
html | HTML-formatierter Text |
Liefere den Inhalt der Zelle als HTML-formatierten Text. Bei nicht durch Funktionen nachbearbeitete Texte werden dabei, wenn vorhanden, die RichText-Einstellungen des Textes übernommen. Sonst wird die Schrifteinstellung der Zelle verwendet. Im Formatstring können diese Werte u.a. mit %s geschrieben werden. Bildzellen liefern eine gültige <img>-Definition zur geladenen Bilddatei. Beginnt der Formatstring nicht mit einem gültigen HTML-Trailer, wird automatisch ein %!TT_html_ vor den Text gesetzt. In einer Anweisung dürfen HTML und TaggedText nicht gemischt werden. Die sogenannten Design-Farben von Excel und deren Abtönungen können aktuell nicht unterstützt werden. Schrift in diesen Farben wird schwarz dargestellt. |
Zellen werden über den Namen des Arbeitsblattes (sheet) und den Zellnamen oder den Zellindex adressiert. Platzhalter verwenden in der Regel 1-basierte Zellindexe zur Kennzeichnung der Zellen. Mit dem (optionalen) Post-Operator onebased werden die Zellindexe entsprechend um 1 verkleinert.
address := [ sheet '!' ] ( cellName | cellAddress)
sheet := ( '"' Name_of_Sheet '"' ) | Name_of_Sheet | Index_of_Sheet
cellName := [A-Za-z]+[0-9]+
cellAddress := row ',' col [onebased]
Folgende Angaben werden unterstützt:
Angabe | Wert | Beschreibung |
Arbeitsblatt | leer | Das erste Arbeitsblatt der Tabelle wird verwendet |
Zahl ! | 0-basierter Index des Arbeitsblattes. Nach der Angabe muß zwingend ein Ausrufezeichen (!) folgen! | Name_ohne_Leerzeichen ! | Name des Arbeitsblattes. Nach der Angabe muß zwingend ein Ausrufezeichen (!) folgen! |
"Name mit Leerzeichen" ! 'Name mit Leerzeichen' ! |
Name des Arbeitsblattes in Anführungszeichen. Nach der Angabe muß zwingend ein Ausrufezeichen (!) folgen! |
Zelle | A1, A2, ... | Als Namen werden die in Excel gebräuchlichen Angaben A1, A2, ..., B1, B2, ... , AA1, ... unterstützt. |
row, col | 0-basierter Zeilen,Spalten-Index der Zelle. Als 0,0-Index wird die erste nicht-leere Zelle verwendet. Achtung : Die erste nicht-leere Zelle muß nicht zwangsläufig die Zelle A1 sein, siehe first_col und first_row. |
Hier einige Angaben gültiger Adressen für Zellen:
A1 // Zelle A1 des ersten Arbeitsblattes 0,0 // Erste nicht-leere Zelle des ersten Arbeitsblattes 2!A1 // Zelle A1 des dritten Arbeitsblattes 2!0,0 // Erste nicht-leere Zelle des dritten Arbeitsblattes Daten!A1 // Zelle A1 des Arbeitsblattes Daten Daten!0, 0 // Erste nicht-leere Zelle des Arbeitsblattes Daten "Daten M"!A1 // Zelle A1 des Arbeitsblattes Daten M "Daten M"!0, 0 // Erste nicht-leere Zelle des Arbeitsblattes Daten M
Nachdem ein Wert aus der Excel-Datei abgeholt wurde, kann er mit Hilfe eingebauter oder selbst implementierter Funktionen bearbeitet werden. Beachten Sie bitte, dass die String-Funktionen wie upper, substr usw. nur für Textwerte verwendet werden können! Die Bearbeitung der Funktionen erfolgt strikt sequenziell: Die erste Funktion erhält den Originaltext aus der Excel-Datei, die zweite Funktion die Ausgabe der ersten Funktion usw..
Mögliche Funktionsparameter werden durch mindestens ein Whitespace (nicht Komma) getrennt.
RichText-Informationen der Excel-Zelle können, wie auch in Excel, in diesem Fall nicht übernommen werden. Für die formatierte Ausgabe wird immer die Schrifteinstellung der Zelle verwendet.
Folgende Funktionen sind definiert:
Funktion | Parameter | Beschreibung | Beispiel |
int | keine |
Entfernen der Nachkommastellen einer Zahl. Der Ganzzahl-Anteil der Zahl wird nicht gerundet! Achtung:Werte vom Typ float bzw. double behalten ihren Datentyp. Um das Ergebnis im Ausgabestring ohne Nachkommastellen zu erhalten, verwenden Sie %.0f. |
123.789 wird zu 123 |
round | int - Genauigkeit |
Runden einer Ganzzahl auf die angegebene Genauigkeit (z.B. 100). Runden einer Kommazahl auf die angegeben Anzahl von Nachkommastellen (z.B. 2) |
round 100 macht aus 1187 1200 round 0 macht aus 123.789 124 |
cent | keine |
Umwandeln der ersten beiden Nachkommastellen in eine zweistellige und gerundete Ganzzahl zwischen 00-99. Achtung: Werte vom Typ float bzw. double behalten ihren Datentyp. Um das Ergebnis im Ausgabestring ohne Nachkommastellen zu erhalten, verwenden Sie %.0f. |
Aus 123.1004 wird 10 Aus 123.789 wird 79 Aus 123.001 wird 00 |
upper, lower | keine | Umwandeln des Textes in Groß- bzw. Kleinbuchstaben |
Aus Hallo Köln wird HALLO KÖLN Aus PräHistorisch wird prähistorisch |
reverse | keine | Umkehren eines Textes |
Aus Hänschen wird nicht Hans sondern nehcsnäH |
folder, file, shortfile, extender | keine | Ermitteln von Teilen eines Pfades | |
substr |
int - Startposition int - Zeichenzahl |
Teilstring eines Textes. Position und Anzahl sind jeweils die Anzahl von Buchstaben (und nicht Bytes). | substr 1 1 von Hänschen ist ä (obwohl das UTF-8 ä aus zwei Bytes besteht). |
substr |
int - Startposition int - Zeichenzahl |
Teilstring vom Ende eines Textes. Position und Anzahl sind jeweils die Anzahl von Buchstaben (und nicht Bytes). | rsubstr 2 1 von Köln ist ö (obwohl das UTF-8 ö aus zwei Bytes besteht). |
trim | str - Trennzeichen | Entferne alle Vorkommen des Trennzeichens str an Anfang und Ende des Strings. | trim "-" von ---Info--- ist Info. |
token |
str - Trennzeichen int - Index |
Hole das n-te Token eines mit str getrennten Strings | token " " 1 von Guten Morgen ist Morgen. |
value | str - Beliebiger Text | Der ermittelte Zelltext wird duch str ersetzt. Die Funktion ist sinnvoll, wenn in die formatierte Textausgabe Zwischentext einegsetzt werden soll, der aber genauso formatiert werden soll, wie der Zelltext (siehe Beispiel). | |
script | int - Action-ID |
Ausführen einer definierten Aktion der Tabelle/Datei actions des aktuellen Datenpools. Das Skript verfügt über folgende
globale Variablen:
|
Hier ein sehr einfaches Skript:
int main () { string::append ( gResultString, "from script"); return 0; } |
Damit ist eigentlich alles gesagt.
static ExcelBook excel::open(
char* path,
int autosave = 0,
int useGlobal = 1)
Öffne eine Excel-Datei.
Name | Typ | Default | Beschreibung |
Return | ExcelBook | 0 : Fehler sonst : Geöffnete Excel-Datei zur Weiterverwendeng in den excel-Funktionen, siehe die Beschreibungen des Parameters useGlobal. |
|
path | char* oder String | - | Vollständiger Pfad der Excel-Datei. Der Pfad darf mit einem $ALIAS-Namen beginnen. |
autoSave | int | 0 | Soll die Datei vor dem Schließen automatisch gesichert werden? 0 : Nein 1 : Ja |
useGlobal | int | 1 | Datei global oder nur für das aktuelle Skript öffnen? 0 : Datei nur für das aktuelle Skript öffnen. In diesem Fall muss das erhaltene Ergebnis der Funktion mit close wieder geschlossen werden! 1 : Datei global öffnen. Die Excel-Datei bleibt bis zur nächsten Idle-Time oder zum close geöffnet. Wurde die Datei bereits in einem vorherigen Skript geöffnet, wird diese bereits geöffnete Datei zurückgegeben. Da Sie die Datei wahrscheinlich in mehreren Skripten verwenden wollen, ist das das empfohlene Vorgehen. |
static int excel::count_sheets(ExcelBook ebook)
Anzahl der Arbeitsblätter der Excel-Datei.
Name | Typ | Default | Beschreibung |
Return | int | Anzahl der Arbeitsblätter in der Excel-Datei 0 : Fehler bei der Ausführung |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
static char* excel::nth_sheet(ExcelBook ebook, int nth)
Name des n-ten Arbeitsblattes einer Excel-Datei
Name | Typ | Default | Beschreibung |
Return | char* | Name des n-ten Arbeitsblattes der Excel-Datei "" : Fehler Der Rückgabewert darf nicht verändert werden und wird bei folgenden Aufrufen der Funktion überschrieben. Hier finden Sie Informationen zu readonly-Rückgaben von Funktionen. |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
int | nth | - | 0-basierter Index des Arbeitsblattes |
#include "internal/types.h" #include "internal/text.h"
int main () { ExcelBook ebook; String str = string::alloc (); int n;
// Open the Excel file // ebook = excel::open ("$DESKTOP/aaa.xlsx"); if (!ebook) { showmessage ("Cannot open Excel file"); string::release (str);
return 0; }
// Collect all sheet names // for (n = 0; n < excel::count_sheets (ebook); n++) { string::append (str, "%s\n", excel::nth_sheet (ebook, n)); } frame::replace (gFrame, str);
// Clean up // excel::close (ebook); string::release (str);
return 0; }
static int excel::first_row(ExcelBook ebook, char* sheet)
Ermittle den Index der ersten verwendeten Zeile einer Excel-Tabelle.
Name | Typ | Default | Beschreibung |
Return | int | >= 0 : 0-basierter Index der ersten benutzen Zeile im Arbeitslatt -1 : Fehler |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | "" | Name des Arbeitsblattes "" : Erstes Arbteisblatt der Datei |
static int excel::last_row(ExcelBook ebook, char* sheet)
Ermittle den Index der ersten nicht verwendeten Zeile unter einer Excel-Tabelle.
Name | Typ | Default | Beschreibung |
Return | int | >= 0 : 0-basierter Index der ersten unbenutzten Zeile unter der Tabelle -1 : Fehler |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | "" | Name des Arbeitsblattes "" : Erstes Arbteisblatt der Datei |
static int excel::first_col(ExcelBook ebook, char* sheet)
Ermittle den Index der ersten verwendeten Spalte einer Excel-Tabelle.
Name | Typ | Default | Beschreibung |
Return | int | >= 0 : 0-basierter Index der ersten benutzen Spalte im Arbeitslatt -1 : Fehler |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | "" | Name des Arbeitsblattes "" : Erstes Arbteisblatt der Datei |
static int excel::last_col(ExcelBook ebook, char* sheet)
Ermittle den Index der ersten nicht verwendeten Spalte hinter einer Excel-Tabelle.
Name | Typ | Default | Beschreibung |
Return | int | >= 0 : 0-basierter Index der ersten unbenutzten Spalte hinter der Tabelle -1 : Fehler |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | "" | Name des Arbeitsblattes "" : Erstes Arbteisblatt der Datei |
static float excel::get_rowheight(
ExcelBook ebook,
char* sheet,
int row)
Höhe einer Zeile einer Tabelle
Name | Typ | Default | Beschreibung |
Return | float | > 0.0 : Höhe der Zeile in Punkten 0.0 : Fehler |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
static float excel::get_colwidth(
ExcelBook ebook,
char* sheet,
int col,
float* excelV)
Breite einer Spalte einer Tabelle relativ zur Gesamtbreite der Tabelle.
Name | Typ | Default | Beschreibung |
Return | float | > 0.0 : Prozentualer Anteil der Spalte an der Gesamtbreite der Tabelle im Bereich [0.0 - 1.0) 0.0 : Fehler
Microsoft definiert die Breite von Spalten auf sehr eigenwillige Art: |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
col | int | - | 0-basierte Spalte der Tabelle |
excelV | float* | 0 | In der Excel-Datei hinterlegte Spaltenbreite, siehe oben. 0 : Wert ignorieren |
static float excel::get_colwidth_pt(
ExcelBook ebook,
char* sheet,
int col)
Breite einer Spalte einer Tabelle.
Name | Typ | Default | Beschreibung |
Return | float | Breite der Spalte in pt 0.0 : Fehler |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
col | int | - | 0-basierte Spalte der Tabelle |
static float excel::get_merge(
ExcelBook ebook,
char* sheet,
int row,
int col,
int* oRowStart,
int* oRowEnd,
int* oColStart,
int* oColEnd)
Ermittle den verbundenen Bereich einer Zelle.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
oRowStart | int * | - | [Rückgabe] 0-basierte Zeilennummer der Ankerzelle 0 : Wert ignorieren |
oRowEnd | int * | - | [Rückgabe] 0-basierte erste Zeile, die nicht mehr zum Bereich gehört 0 : Wert ignorieren |
oColStart | int * | - | [Rückgabe] 0-basierte Spaltennummer der Ankerzelle 0 : Wert ignorieren |
oColEnd | int * | - | [Rückgabe] 0-basierte erste Spalte, die nicht mehr zum Bereich gehört 0 : Wert ignorieren |
static int excel::get_color(
ExcelBook ebook,
char* sheet,
int row,
int col,
int which,
int* oRed,
int* oGreen,
int* oBlue)
Ermittle die Farbeinstellungen einer Zelle.
Wenn Sie die äußeren Randfarben für verschmolzene Zellen abrufen, müssen Sie diese aus den tatsächlichen Indizes und nicht aus der Ankerzelle abrufen.
Wenn Sie z. B. versuchen, den rechten Rand einer Zelle zu bestimmen, die von Spalte 0-1 zusammengeführt wurde, müssen Sie die rechte Randfarbe an Spalte 1 abfragen.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
which | int | - | Welche Farbe soll geholt werden? 0: Rahmenfarbe links 1: Rahmenfarbe oben 2: Rahmenfarbe rechts 3: Rahmenfarbe unten 4: Rahmenfarbe diagonal 5: Muster Vordergrund 6: Muster Hintergrund |
oRed | int * | - | [Rückgabe] Rotanteil der Farbe im Bereich [0-255] Wenn der Wert negativ ist, ist die Farbe nicht gesetzt. |
oGreen | int * | - | [Rückgabe] Grüanteil der Farbe im Bereich [0-255] Wenn der Wert negativ ist, ist die Farbe nicht gesetzt. |
oBlue | int * | - | [Rückgabe] Blauanteil der Farbe im Bereich [0-255] Wenn der Wert negativ ist, ist die Farbe nicht gesetzt. |
static int excel::get_border(
ExcelBook ebook,
char* sheet,
int row,
int col,
int which,
int* oStyle)
Ermittle den Rahmenstil einer Zelle.
Wenn Sie den äußeren Rahmenstil für verschmolzene Zellen abrufen, müssen Sie diese aus den tatsächlichen Indizes und nicht aus der Ankerzelle abrufen.
Wenn Sie z. B. versuchen, den rechten Rand einer Zelle zu bestimmen, die von Spalte 0-1 zusammengeführt wurde, müssen Sie die rechte Seite an Spalte 1 abfragen.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
which | int | - | Welcher Stil soll geholt werden? 0: Rahmenstil links 1: Rahmenstil oben 2: Rahmenstil rechts 3: Rahmenstil unten 4: Rahmenstil diagonal |
oStyle | int * | - | [Rückgabe] Gesetzter Rahmenstil: -1 - Nicht gesetzt oder Fehler 0 - BORDERSTYLE_NONE 1 - BORDERSTYLE_THIN 2 - BORDERSTYLE_MEDIUM 3 - BORDERSTYLE_DASHED 4 - BORDERSTYLE_DOTTED 5 - BORDERSTYLE_THICK 6 - BORDERSTYLE_DOUBLE 7 - BORDERSTYLE_HAIR 8 - BORDERSTYLE_MEDIUMDASHED 9 - BORDERSTYLE_DASHDOT 10 - BORDERSTYLE_MEDIUMDASHDOT 11 - BORDERSTYLE_DASHDOTDOT 12 - BORDERSTYLE_MEDIUMDASHDOTDOT 13 - BORDERSTYLE_SLANTDASHDOT |
static int excel::read(
ExcelBook ebook,
char* sheet,
int row,
int col,
int type,
char* value,
int maxlen = 0,
int format = 0,
int dtFormat = -1)
Lies einen Wert aus einer Excel-Tabelle.
Die sogenannten Design-Farben von Excel und deren Abtönungen können aktuell nicht unterstützt werden. Schrift in diesen Farben wird schwarz dargestellt.
Beachten Sie bitte die Hinweise zu Schriftname und -schnitt. Fehlende Schriftzuweisungen können mit lokalen Erweiterungen der Schrifttabelle (FontDB) lokal korrigiert werden.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
type | int | - | Datentyp der Rückgabe-Variable value. 1 - kInt : Ganzzahl 2 - kFloat : Kommazahl 3 - kString : Text, Datum oder Bild. Siehe Parameter dtFormat für Datumsformate kInt und kFloat können nur in Zahlenzellen verwendet werden. In anderen Zellen erzeugt die Funktion einen Fehler! |
value | int*, float* char*, String | - | Rückgabevariable (abhängig vom Wert des Parameters type).
Nach erfolgreicher Ausführung der Funktion enthält die Variable den Wert der Zelle.
Beim Versuch, Zahlen aus Text- oder Datumszellen zu lesen, gibt die Funktion einen Fehler zurück! 1 - kInt : &int_var 2 - kFloat : &float_var 3 - kString : char* oder String |
maxlen | int | 0 | Nur bei type = kString und char* : Maximale Länge des
Ergebnisses. 0 : Beliebig |
format | int | 0 | Nur bei type = kString : Format der Ausgabe 0 - kExportPlain : Unformatierter Text 1 - kExportTagged : TaggedText 12 - kExportHTML : HTML -1 - kUndef : Direkter Wert. Die Ausgabe ist nützlich, wenn Sie den Zellinhalt ohne Excel-Formatierung erhalten wollen. Kommazahlen werden mit (bis zu) sechs Nachkommastellen angegeben. Zeitangaben erfolgen im Format dtFormat. Ist dtFormat = -1, wird yyyymmddhhmmss verwendet. Für die Ausgabe von Bildern siehe hier. |
dtFormat | int | -1 | Behandlung von Datum und Uhrzeit. Die Angabe wird nur bei benutzerdefinierten Zellformaten angewendet! -1 : Zellformat anwenden, siehe Datum & Uhrzeit sonst : Gültiges DateTime-Format, siehe system::now |
Öffne eine Excel-Datei und schreibe den Inhalt der ersten Tabelle in den aktuellen Rahmen. Wenn die Datei nur einmal in diesem Skript verwendet werden soll, sollte sie mit excel::close am Skriptende geschlossen werden.
#pragma plain
#include "internal/types.h" #include "internal/text.h"
int main () { ExcelBook ebook; String str = string::alloc (); String vs = string::alloc (); String ipath = string::alloc (); ItemRef fr = item::alloc (); int r, c, hostApp; char sheet[256]; int result; int w, h, x, y;
system::version(&hostApp); if (hostApp < 2) item::define (fr, 0, item::getint (gFrame)); else item::define (fr, 0, 221); // comet_pdf
// Open the Excel file // ebook = excel::open ("$DESKTOP/Formats.xlsx"); if (!ebook) { showmessage ("Cannot open Excel file"); string::release (str);
return 0; } strcpy (sheet, "Table 2");
// Read data and build the output string *str* // string::append (str, "%!TT"); // Init the output
for (r = excel::first_row (ebook, sheet); r < excel::last_row (ebook, sheet); r++) { for (c = excel::first_col (ebook, sheet); c < excel::last_col (ebook, sheet); c++) { wlog ("", "\n##### CELL [%c%d]\n", c+0x41, r+1);
string::append (str, "<ParaStyle:aaa>[%c%d] Type = %d : ", c+0x41, r+1, excel::get_type (ebook, sheet, r, c));
if (excel::get_type (ebook, sheet, r, c) == 8) { // It'a an image. // Add the image path and geometry to the output. // excel::read_image (ebook, sheet, r, c, ipath, &w, &h, &x, &y); string::append (str, "('%s', %d x %d with offset %d x %d) ", ipath, w, h, x, y); }
// Read cell data as TaggedText. // Numbers are formatted as close as possible to Excel. // Images are created as embedded inlies automatically. // result = excel::read (ebook, sheet, r, c, kString, vs, 0, kExportTagged); if (result == 0) { string::append (str, "%s", vs); } else { string::append (str, "Error while reading\n"); } } string::append (str, "<ParaStyle:aaa>"); }
// Finally insert the complete text // frame::replace (fr, str);
// There is no need to close the book again. // This is done automatically at the next idle time. //
return 0; }
Für eine HTML-Ausgabe ersetzen Sie lediglich den Präfix %!TT durch %!TT_html_ und ändern bei excel::read das Format in kExportHTML.
static int excel::read_image(
ExcelBook ebook,
char* sheet,
int row,
int col,
String path = 0,
int* width = 0,
int* height = 0,
int* xoffset = 0,
int* yoffset = 0)
Lies ein Bild aus einer Excel-Tabelle. Das Bild wird dabei automatisch in eine egene Bilddatei geladen.
Zellen von Excel-Tabellen werden nur dann als 'Bildzellen' erkannt, wenn die Zelle keinen Text enthält! Die Zelle eines Bildes ist die Zelle der Tabelle, in der die linke obere Ecke des Bildes liegt. Ob eine Zelle ein Bild enthält, kann mit Hilfe der Funktion excel::get_type (=8) ermittelt werden.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode noImageErr (101) : Keine Bildzelle |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
path | String oder char* | 0 | Bei erfolgreicher Ausführung der vollständige Pfad der geladenen Bilddatei.
Sonst bleibt der Wert unverändert.
Beachten Sie bitte, dass String und char* bereits Pointer sind, hier also das sonst für Ausgabevariablen übliche & nicht verwendet werden darf! 0 : Angabe ignorieren |
width | int* | 0 | Bei erfolgreicher Ausführung die Breite des Bildes in Pixeln.
Sonst bleibt der Wert unverändert.
Beachten Sie bitte, dass der Aufruf eine Adresse auf eine Zahl ist, üblicherweise also als &var geschrieben wird! 0 : Angabe ignorieren |
height | int* | 0 | Bei erfolgreicher Ausführung die Höhe des Bildes in Pixeln.
Sonst bleibt der Wert unverändert.
Beachten Sie bitte, dass der Aufruf eine Adresse auf eine Zahl ist, üblicherweise also als &var geschrieben wird! 0 : Angabe ignorieren |
xoffset | int* | 0 | Bei erfolgreicher Ausführung der Abstand des Bildes in Pixeln von der linken Seite der Zelle.
Sonst bleibt der Wert unverändert.
Beachten Sie bitte, dass der Aufruf eine Adresse auf eine Zahl ist, üblicherweise also als &var geschrieben wird! 0 : Angabe ignorieren |
yoffset | int* | 0 | Bei erfolgreicher Ausführung der Abstand des Bildes in Pixeln von der oberen Kante der Zelle.
Sonst bleibt der Wert unverändert.
Beachten Sie bitte, dass der Aufruf eine Adresse auf eine Zahl ist, üblicherweise also als &var geschrieben wird! 0 : Angabe ignorieren |
static int excel::get_font(
ExcelBook ebook,
char* sheet,
int row,
int col,
int fmt,
String tagsOpen,
String tagsClose)
Schrifteinstellungen einer gegebenen Zelle. Die Funktion ist nötig, wenn Sie Zellen mit Zahlengaben (z.B. eine Währungsangabe) ausgeben wollen. Mit read erhalten Sie lediglich den Zahlenwert ohne Anwendung der Formatierung (z.B. zwei Nachkommenstellen und €). Diese Formatierung können Sie im Skript nachholen. Aber wenn Sie dieses Ergebnis dann in der gleichen Schrift wie in Excel ausgeben wollen, benötigen Sie die Schrifteinstellungen der Zelle.
Die Funktion gibt in Abhängigkeit von der Anzahl der Funktionsparameter den Zellstil entweder als HTML/CSS- bzw. TaggedText-String oder als Einzelwerte der Eigenschaften zurück:
Beachten Sie bitte, dass die Rückgabewerte weight und italic der Funktion eine Kombination aus der gewählten (fake)-Einstellung von Excel und dem verwendeten Schriftschnitt sind!
Die sogenannten Design-Farben von Excel und deren Abtönungen können aktuell nicht unterstützt werden. Schrift in diesen Farben wird schwarz dargestellt.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
⇨ Ausgabe als Formatstring, genau 7 Parameter erforderlich | |||
fmt | int | - | Ausgabeformat 1 - kExportTagged : TaggedText 12 - kExportHTML : HTML |
tagsOpen | char* oder String | - | Allokierter String für die formatspezifische Ausgabe der Tags zum Setzen des Fonts der Zelle. |
tagsClose | char* oder String | - | Allokierter String für die formatspezifische Ausgabe der Tags zum Zurücksetzen des Fonts der Zelle. |
⇨ Einzelwerte, mind. 8 Parameter erforderlich | |||
fontname | char* oder String | - | Name der Schriftfamilie |
fontface | char* oder String | - | Name des Schriftschnittes unter Berücksichtigung von bold und italic. Der Schriftschnitt wird für <cTypeface:...> von TaggedText benötigt. Für die Ausgabe von HTML wird der Schriftschnitt nicht benötigt. |
size | int* | - | Schriftgröße in Punkten. |
red | int* | - | Rot-Anteil der Schriftfarbe im Bereich 0-255 |
green | int* | 0 | Grün-Anteil der Schriftfarbe im Bereich 0-255 |
blue | int* | 0 | Blau-Anteil der Schriftfarbe im Bereich 0-255 |
weight | int* | 0 | Schriftstärke mit den Werten 100, 200, ..., 900 |
italic | int* | 0 | Schrägschrift? 0 : Nein 1 : Ja Die Angabe wird die Ausgabe von HTML benötigt. Für TaggedText wird der Wert nicht benötigt, hier wird die Schriftneigung wird über den Schriftschnitt festgelegt. |
strikeThru | int* | 0 | Ist der Text durchgestrichen? 0 : Nein 1 : Ja |
underline | int* | 0 | Ist der Text unterstrichen? 0 : Nö 1 : Einfach unterstrichen über _ 2 : Doppelt unterstrichen über _ 3 : Einfach unterstrichen unter _ 4 : Doppelt unterstrichen unter _ |
position | int* | 0 | Schriftposition 0 : Normal 1 : Hochgestellt 2 : Tiefgestellt |
stretch | int* | 0 | Laufweite der Schrift -4 : ultra-condensed -3 : extr-condensed -2 : condensed -1 : semi-condensed 0 : normal 1 : semi-expanded 2 : expanded 3 : extrs-expanded 4 : ultra-expanded |
Schreibe den Inhalt der ersten Tabelle in der gleichen Textformatierung wie in Excel. Lokale Änderungen in den Zellen werden dabei ignoriert (können aber mit read gemacht werden.)
#include "internal/types.h" #include "internal/text.h"
int main () { ExcelBook ebook; String str = string::alloc (); String openTags = string::alloc (); String closeTags = string::alloc (); String vs = string::alloc (); int r, c;
// Open the Excel file // ebook = excel::open ("$DESKTOP/aaa.xlsx"); if (!ebook) { showmessage ("Cannot open Excel file"); string::release (str);
return 0; }
frame::replace (gFrame, "");
// Load data // for (r = excel::first_row (ebook); r < excel::last_row (ebook); r++) { for (c = excel::first_col (ebook); c < excel::last_col (ebook); c++) { // Get the formated styles // excel::get_font (ebook, "", r, c, kExportTagged, openTags, closeTags);
string::set (str, "%%!TT[%c%d] : ", c+0x41, r+1);
if (excel::read (ebook, "", r, c, kString, vs, 0) == 0) { string::append (str, "%s", openTags); string::append (str, "%s", vs); string::append (str, "%s", closeTags); } else { string::append (str, "Error while reading\n"); }
frame::append (gFrame, str); frame::append (gFrame, "\n"); } frame::append (gFrame, "\n"); }
// Clean up // excel::close (ebook); string::release (str);
return 0; }
Hier ein Vorschlag zum Umsetzen der Excel-Schrifteigenschaften in HTML/CSS.
#include "internal/types.h" #include "internal/text.h"
int get_style (String sopen, String sclose, ExcelBook ebook, int r, int c, char * sheet) { String fontname = string::alloc (); String fontface = string::alloc (); int size; int red, green, blue; int weight, italic, strikeThru, underline, position, stretch; int res;
// Init // string::set (sopen, ""); string::set (sclose, "");
// Read font settings of cell // res = excel::get_font (ebook, sheet, r, c, fontname, fontface, &size, &red, &green, &blue, &weight, &italic, &strikeThru, &underline, &position, &stretch); if (res != 0) { return 1; }
// Create and fill a new HTML span // string::append (sopen, "<span style='");
string::append (sopen, "font-family:\"%s\"; ", fontname); string::append (sopen, "font-size:%dpt; ", size); string::append (sopen, "font-weight:%dpt; ", weight); string::append (sopen, "color:rgb (%d, %d, %d); ", red, green, blue);
if (strikeThru) string::append (sopen, "text-decoration:line-through; "); if (underline) string::append (sopen, "text-decoration:underline; ");
if (position == 1) string::append (sopen, "vertical-align:super; "); if (position == 2) string::append (sopen, "vertical-align:sub; ");
if (stretch == -4) string::append (sopen, "font-stretch:ultra-condensed; "); else if (stretch == -3) string::append (sopen, "font-stretch:extra-condensed; "); else if (stretch == -2) string::append (sopen, "font-stretch:condensed; "); else if (stretch == -1) string::append (sopen, "font-stretch:semi-condensed; "); else if (stretch == 0) string::append (sopen, "font-stretch:normal; "); else if (stretch == 1) string::append (sopen, "font-stretch:semi-expanded; "); else if (stretch == 2) string::append (sopen, "font-stretch:expanded; "); else if (stretch == 3) string::append (sopen, "font-stretch:extra-expanded; "); else if (stretch == 4) string::append (sopen, "font-stretch:ultra-expanded; ");
string::append (sopen, "'>");
// Add italic if needed // if (italic) string::append (sopen, "<i>");
// Create the close tags in reverse order // if (italic) string::append (sclose, "</i>"); string::append (sclose, "</span>");
// Clean up // string::release (fontname); string::release (fontface);
return 0; }
int main () { String str = string::alloc (); ExcelBook ebook; int vi; float vf; String vs = string::alloc (); String format = string::alloc (); String formula = string::alloc (); String sopen = string::alloc (); String sclose = string::alloc (); int r, c; int formatID; int convqu = prefs::get_convert_quotas (); int dtY, dtM, dtD, dth, dtm, dts;
// Open the Excel file // ebook = excel::open ("$DESKTOP/aaa.xlsx"); if (!ebook) { showmessage ("Cannot open Excel file"); string::release (str);
return 0; }
prefs::set_convert_quotas (kOff);
// Load some data here // frame::replace (gFrame, ""); for (r = excel::first_row (ebook); r < excel::last_row (ebook); r++) { for (c = excel::first_col (ebook); c < excel::last_col (ebook); c++) { get_style (sopen, sclose, ebook, r, c, "");
string::set (str, "%%!TT_html_[%c%d] : %s", c+0x41, r+1, sopen);
if (excel::read (ebook, "", r, c, kInt, &vi) == 0) { string::append (str, "%d", vi); } else if (excel::read (ebook, "", r, c, kFloat, &vf) == 0) { string::append (str, "%.6f", vf); } else if (excel::read (ebook, "", r, c, kString, vs) == 0) { if (excel::get_type (ebook, "", r, c) == 5) { system::time_scan (vs, yyyymmddhhmmss, &dtY, &dtM, &dtD, &dth, &dtm, &dts); string::append (str, "%02d.%02d.%d, %02d:%02d:%02d", dtD, dtM, dtY, dth, dtm, dts); } else { string::append (str, "%s", vs); } }
string::append (str, sclose);
formatID = 0; string::set (format, ""); excel::get_format (ebook, "", r, c, &formatID, format); if (formatID > 0) string::append (str, " / Format %d", formatID); if (string::length (format)) string::append (str, " <span class=\"format\">%s</span>", format);
if (excel::get_formula (ebook, "", r, c, formula) == 0) { string::append (str, " / <span class=\"formula\">%s</span>", formula); }
string::append (str, " ");
frame::append (gFrame, str); frame::append (gFrame, "\n"); } frame::append (gFrame, "\n"); }
// Clean up // string::release (str); string::release (format); string::release (formula); string::release (sopen); string::release (sclose); excel::close (ebook);
prefs::set_convert_quotas (convqu);
return 0; }
static int excel::get_type(
ExcelBook ebook,
char* sheet,
int row,
int col)
Typ einer Zelle einer Excel-Tabelle.
Name | Typ | Default | Beschreibung |
Return | int | Typ der Tabellenzelle 0 : Fehler 1 : Zahl (int oder float) 3 : Text 4 : Boolean 5 : Datum, Uhrzeit 6 : Blank, die Zelle enthält lediglich eine Format-Information 7 : Empty, die Zelle existiert nicht 8 : Bild (seit v4.2 R32250) Die Zelle eines Bildes ist die Zelle, in der die linke obere Ecke des Bildes liegt. Nur Zellen ohne Text können als Bildzellen erkannt werden. |
|
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
static int excel::get_formula(
ExcelBook ebook,
char* sheet,
int row,
int col,
char* formula,
int maxlen = 0)
Formel einer Zelle einer Excel-Tabelle.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
formula | char* oder String | - | Formel zur Berechnung des Inhaltes der Zelle |
maxlen | int | 0 | Nur bei char* : Maximale Länge des Ergebnisses. 0 : Beliebig |
static int excel::get_format(
ExcelBook ebook,
char* sheet,
int row,
int col,
int* formatID,
char* format,
int maxlen = 0)
Hole das Format einer Zelle einer Excel-Tabelle.
Die folgende Tabelle enthält eine Liste der Standardformate. Der Ergebnisstring format der Standardformate ist leer. Benutzerdefinierte Formate haben IDs >= 164. Die Definition dieser Formate wird im Ergebnisstring format zurückgegeben. Die IDs 36-163 sind unbenutzt.
ID | Beschreibung | Beispiel |
general format | ||
general number | 1000 | |
number with decimal point | 1000,00 | |
number with thousands separator | 100.000 | |
number with decimal point and thousands separator | 100.000,00 | |
monetary value, negative in brackets | (1000 €) | |
monetary value, negative is red in brackets | (1000 €) | |
monetary value with decimal point, negative in brackets | (1000,00 €) | |
monetary value with decimal point, negative is red in brackets | (1000,00€) | |
percent value, multiply the cell value by 100 | 75% | |
percent value with decimal point, multiply the cell value by 100 | 75,00% | |
scientific value with E character and decimal point | 1,00E+1 | |
fraction value, one digit | 10 1/2 | |
fraction value, two digits | 10 23/95 | |
date value, depends on OS settings | 11.3.2009 | |
custom date value | 11. Mär. 09 | |
custom date value | 11. Mär. | |
custom date value | Mär. 09 | |
custom date value | 8:30 | |
custom date value | 8:30:00 | |
custom date value | 8:30 | |
custom date value | 8:30:00 | |
custom datetime value | 11.3.2009 8:30 | |
number with thousands separator, negative in brackets | (4.000) | |
number with thousands separator, negative is red in brackets | (4.000) | |
number with thousands separator and decimal point, negative in brackets | (4.000,00) | |
number with thousands separator and decimal point, negative is red in brackets | (4.000,00) | |
account value | 5.000 | |
account value with currency symbol | 5000 € | |
account value with decimal point | 5.000,00 | |
account value with currency symbol and decimal point | 5.000,00 € | |
custom time value | 30:55 | |
custom time value | 20:30:55 | |
custom time value | 30:55.0 | |
custom value | 15,2E+3 | |
text value | any text |
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
formatID | int* | - | ID der Formatanweisung < 164 : Excel-Standardformat >= 164 : Benutzerdefiniertes Format. Die Formatanweisung ist im Ergebnisstring format angegeben. |
format | char* oder String | - | Benutzerdefinierte Formatanweisung für den Zellinhalt |
maxlen | int | 0 | Nur bei char* : Maximale Länge des Ergebnisses. 0 : Beliebig |
static int excel::write(
ExcelBook ebook,
char* sheet,
int row,
int col,
int type,
char* value,
int maxlen = 0)
Schreibe einen neuen Wert in eine Zellen einer Excel-Tabelle.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
row | int | - | 0-basierte Zeile der Tabelle |
col | int | - | 0-basierte Spalte der Tabelle |
type | int | - | Welchen Datentyp hat die Zelle in der Excel-Tabelle? 1 - kInt : Ganzzahl 2 - kFloat : Kommazahl 3 - kString : Text 4 - kBool : Bool |
value | int, float char*, String | - | Der Datentyp der Variable ist abhängig vom Wert des Parameters type: 1 - kInt : int 2 - kFloat : float 3 - kString : char* oder String 4 - kBool : int |
Schreiben von Excel-Inhalten
#include "internal/types.h" #include "internal/text.h"
int main () { ExcelBook ebook; int r;
// Open the Excel file // ebook = excel::open ("$DESKTOP/bbb.xlsx"); if (!ebook) { showmessage ("Cannot open Excel file"); string::release (str); return 0; }
// Write some data here // for (r = 1; r < 11; r++) { excel::write (ebook, "", r, 0, kString, "28.10.2018, 12:34"); }
// Clean up // excel::save (ebook); excel::close (ebook);
return 0; }
static int excel::save(ExcelBook* ebook)
Sichern einer Excel-Datei.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
static int excel::to_xml(
ExcelBook* ebook,
char* sheet,
int destType,
char* dest,
int maxLen = 0)
Export einer Excel-Tabelle in XML. Die Funktion erzeugt das folgende XML-Format:
<?xml version="1.0" encoding="utf-8"?><rows> <row num="1" id="0"> <col name="A" num="1" id="0"> <format>Zellformat</format> <value>Direkter Zellinhalt</value> <text>Zellinhalt mit angewendetem Zellformat</text> </col> ... </row> ... </rows>
Wir möchten ausdrücklich darauf hinweisen, dass der XML-Export ein Datenexport ist. Für ein komplettes XML mit Zellgrößen, Farben, Linien etc. ist der Export nicht geeignet! Aber Sie können das mit den Funktionen dieses Moduls leicht auch selbst als Skript implementieren.
Hier einige gültige xmlquery-Abfragen
// Alle Zellen mit Nummer und Inhalt select ...num, num, value node rows.row.cols.col
// Alle Zellen mit Name (A1...) und Inhalt select name||...num, value node rows.row.cols.col
// Alle Zellen mit dem Inhalt 'a' select ...num, num, value node rows.row.cols.col where value='a'
// Alle Zeilen, deren erste beiden Spalten 'a' enthalten select ..num, col.num node rows.row.cols where child_0.value='a' and child_1.value='a'
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
sheet | char* oder String | - | Name des Arbeitsblattes "" : Erstes Arbeitsblatt der Datei |
destType | int | - | Was ist der folgende Parameter dest? -1 : Allokierter Ergebnisstring 0 : Vollständiger Dateipfad für das Ergebnis 1 : Vollständiger Dateipfad einer überschreibbaren Datei |
dest | char* oder String | - | Ergebnisstring oder Dateipfad in Abhänigkeigt des Parameters destType |
maxlen | int | 0 | Maximallänge des Ergebnisses in Byte. Der Parameter hat nur dann eine Bedeutung, wenn destType = -1 und dest vom Typ char* / char[nnn] sind. 0 : beliebig lang (Dann sollten Sie aber sicher sein, dass Ihre Zielvariable groß genug ist!) |
static int excel::close(ExcelBook* ebook)
Schließe eine Excel-Datei und entferne das Objekt aus dem Speicher.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
ebook | ExcelBook | - | Mit excel::open geöffnete Excel-Datei |
static int excel::col2i(char* colname)
Umrechnen eines Excel-Spaltennamens der Form A, B, ..., Z, AA, AB, ... in eine Zahl.
Name | Typ | Default | Beschreibung |
Return | int | 0-basierter Zahlenwert des Eingabestrings | |
colname | char* oder String | - | Zeichenkette bestehend aus den Buchstaben A-Z und a-z. Kleinbuchstaben werden dabei automatisch als Großbuchstaben ausgewertet. Beachten Sie bitte, dass Excel maximal 214 = 16.384 Spalten unterstützt. Das entspricht der Buchstabenkette XFD. |
static char* excel::i2col(int colnum)
Umrechnen einer Spaltenzahl in die in Excel gebräuchliche Form A, B, ..., Z, AA, AB, ... .
Name | Typ | Default | Beschreibung |
Return | char* | Excel-Name des gegebenen 0-basierten Spaltenindexes "" : Fehler Der Rückgabewert darf nicht verändert werden und wird bei folgenden Aufrufen der Funktion überschrieben. Hier finden Sie Informationen zu readonly-Rückgaben von Funktionen. |
|
colnum | int | - | 0-basierter Spaltenindex Beachten Sie bitte, dass Excel maximal 214 = 16.384 Spalten unterstützt. Das entspricht der Buchstabenkette XFD. |
Alphabetic index HTML hierarchy of classes or Java