OpenXLSX ist eine C ++ - Bibliothek zum Lesen, Schreiben, Erstellen und Ändern von Microsoft Excel® -Dateien mit dem .xlsx -Format.
Wie auf der Überschrift lautet - die neueste "Veröffentlichung", die auf https://github.com/troldal/openxlsx/releases angezeigt wird, ist von 2021-11-06 und stark veraltet - bitte ziehen/laden Sie die neueste SW -Version direkt aus dem Repository in seinem aktuellen Zustand. Link für diejenigen, die nicht git verwenden möchten: https://github.com/troldal/openxlsx/archive/refs/heads/master.zip
Überprüfte den XLDATETIME -Code als Antwort auf #299 und habe einen Fehler behoben, von dem ich glaube, dass ich mich vielleicht selbst vorgestellt habe. Entschuldigung, Daten sollten jetzt korrekt aus double , struct tm und time_t konstruieren und in struct tm zurückkehren.
Der Änderungsverlauf findet sich im detaillierten Änderungsprotokoll.
Heute haben es die Funktionen aus der Entwicklungszweig endlich in den Hauptzweig geschafft :) Für Einzelheiten finden Sie im folgenden detaillierten Änderungsprotokoll.
Zusammenfassend:
OpenXLSX/headers/XLStyles.hpp : Xlstyles -Klasse (und viele Unterklassen) wurden hinzugefügt, wodurch nahezu vollständige Zugriff auf alle Funktionen für Excel -Formatierungen ermöglicht wird.OpenXLSX/headers/XLMergeCells.hpp und XLSheet.hpp : XLMergeCells -Klasse wird über Xlworksheet zugänglich gemacht, um Zellverschmelzungen zu erstellen/zu löschenExamples/Demo10.cpp zeigt, wie Stile und Zusammenführungen verwendet werden. Hinweis: Der Abschnitt, der mit testBasics = false deaktiviert ist, wird die resultierende Excel -Tabelle unterbrochen, wenn dies aktiviert ist. Der einzige Zweck besteht darin, den Zugriff auf alle neuen Klassen und Methoden zu demonstrieren. Wenn Sie sie verwenden möchten, stellen Sie sicher, dass Sie sie richtig verwendenHinweis zu XlNumberFormat (s) : Entgegen allen anderen Xlstyles-Elementen verwenden diese keinen Index innerhalb des XML als revalierbarer ID (xlcellFormat :: setNumberFormatid), sondern stattdessen eine benutzerdefinierte ID, die über Xlnumberformat :: Setnumberformatid-und für eine XLCELLFORMAT-ID-ID-ID-ID-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format-Format jedoch jedoch. Vordefiniert durch MS. Im Allgemeinen wird für benutzerdefinierte Formate empfohlen, IDs> 100 zu verwenden.
Auf der To-Do-Liste:
Vor ein paar Tagen hatte ich endlich die Zeit, genug Git -Funktionalität zu lernen, um mit Zweigen arbeiten zu können. Daher habe ich eine Entwicklungszweig mit den neuesten Funktionen erstellt, die ich in einigen Pull -Anfragen / -problemen erwähnt habe. Fühlen Sie sich frei, einen Blick darauf zu werfen. Auf diese Weise müssen Sie nicht warten, bis das Hauptrepository aktualisiert ist.
Schloss eine Vielzahl von Pull -Anfragen, die im Mai 2024 -Update implementiert wurden, zwei weitere Editoriale aus PR #246 und #253.
Nach langer Zeit der Inaktivität habe ich beschlossen, die Entwicklung von OpenXLSX wieder aufzunehmen. Der Code wurde aufgeräumt und eine erhebliche Anzahl von Fehler wurde behoben. Die Bibliothek wurde unter Windows, MacOS und Linux getestet und sollte auf allen Plattformen arbeiten.
Ich möchte meinen aufrichtigen Dank an alle Personen ausdehnen, die zum Projekt beigetragen haben, entweder durch Meldung von Fehler, Vorschlägen von Funktionen oder durch Einreichen von Pull -Anfragen. Ich möchte mich auch bei allen Personen bedanken, die das Projekt mitgespielt haben und die Interesse an dem Projekt gezeigt haben.
Insbesondere möchte ich Lars Uffmann (https://codeeberg.org/lars_uffmann/) für seine Beiträge zum Projekt danken. Lars hat erhebliche Zeit und Mühe für die Reinigung des Codes, die Behebung von Fehler und die Implementierung neuer Funktionen aufgewendet. Ohne seine Hilfe wäre das Projekt nicht in dem Staat gewesen, den es heute ist.
Viele Programmiersprachen können Excel -Dateien entweder nativ oder in Form von Open Source -Bibliotheken ändern. Dies schließt Python, Java und C#ein. Für C ++ sind die Dinge jedoch stärker verstreut. Während es einige Bibliotheken gibt, sind sie im Allgemeinen weniger ausgereift und haben einen kleineren Merkmalssatz als für andere Sprachen.
Da es keine Open -Source -Bibliothek gibt, die meine Bedürfnisse voll ausgereift haben, habe ich beschlossen, die OpenXLSX -Bibliothek zu entwickeln.
Der Ehrgeiz ist, dass OpenXLSX in der Lage sein sollte, Excel -Dateien (Daten sowie Formatierung) zu lesen, zu schreiben, zu erstellen und zu ändern, und dies mit so wenigen Abhängigkeiten wie möglich. Derzeit hängt OpenXLSX von den folgenden Bibliotheken der Drittanbieter ab:
Diese Bibliotheken sind alle nur Header und im Repository enthalten, dh es ist nicht erforderlich, separat herunterzuladen und zu bauen.
Außerdem wurde der Fokus auf Geschwindigkeit und nicht auf Speicherverbrauch gestellt (obwohl es Optionen zur Reduzierung der Speicherverbrauch auf Kosten der Geschwindigkeit gibt; dazu später mehr).
OpenXLSX wurde auf den folgenden Plattformen/Compilern getestet. Beachten Sie, dass A '-' nicht bedeutet, dass OpenXLSX nicht funktioniert. Es bedeutet nur, dass es nicht getestet wurde:
| GCC | Klang | MSVC | |
|---|---|---|---|
| Fenster | Mingw | Mingw | + |
| Cygwin | - - | - - | N / A |
| Macos | + | + | N / A |
| Linux | + | + | N / A |
Die folgenden Compiler -Versionen sollten in der Lage sein, OpenXLSX ohne Fehler zu kompilieren:
Clang 7 sollte in der Lage sein, OpenXLSX zu kompilieren, aber anscheinend gibt es einen Fehler bei der Implementierung von STD :: Variante, die Compiler -Fehler verursacht.
Visual Studio 2017 sollte auch funktionieren, wurde aber nicht getestet.
OpenXLSX verwendet CMake als Build -System (oder Build -Systemgenerator, um genau zu sein). Daher müssen Sie zuerst CMake installieren, um OpenXLSX zu erstellen. Die Installationsanweisungen finden Sie unter www.cmake.org.
Die OpenXLSX -Bibliothek befindet sich im OpenXLSX -Unterverzeichnis dieses Repo. Das OpenXLSX-Unterverzeichnis ist ein in sich geschlossenes CMake-Projekt; Wenn Sie CMake für Ihr eigenes Projekt verwenden, können Sie den OpenXLSX -Ordner als Unterverzeichnis zu Ihrem eigenen Projekt hinzufügen. Alternativ können Sie CMake verwenden, um Dateien oder Projektdateien für eine Toolchain Ihrer Wahl zu generieren. Beide Methoden werden im Folgenden beschrieben.
Der mit Abstand am einfachsten, OpenXLSX in Ihrem eigenen Projekt zu verwenden, besteht darin, CMake selbst zu verwenden und dann den OpenXLSX -Ordner als Unterverzeichnis dem Quellbaum Ihres eigenen Projekts hinzuzufügen. Mehrere CMake -Projekte von mehreren IDE, insbesondere Visual Studio 2019, Jetbrains Clion und QT Creator. Wenn Sie Visual Studio verwenden, müssen Sie beim Erstellen eines neuen Projekts speziell "CMake -Projekt" auswählen.
Der Hauptvorteil bei der Einbeziehung der OpenXLSX -Bibliothek als Quellunterordner besteht darin, dass die Bibliotheks- und Header -Dateien nicht speziell aufgeführt sind. CMake wird sich dafür um Sie kümmern. Außerdem wird die Bibliothek mit derselben Konfiguration (Debugg, Release usw.) wie Ihr Projekt erstellt. Insbesondere dies ist ein Vorteil unter Windows, wo es nicht möglich ist, Release -Bibliotheken in einem Debug -Projekt (und umgekehrt) zu verwenden, wenn STL -Objekte durch die Bibliotheksschnittstelle weitergegeben werden, da sie sich in OpenXLSX befinden. Bei der Einbeziehung der OpenXLSX -Quelle ist dies kein Problem.
Durch die Verwendung des Befehls add_subdirectory() in der Datei cmakelists.txt für Ihr Projekt erhalten Sie Zugriff auf die Header und Bibliotheksdateien von OpenXLSX. OpenXLSX kann entweder eine gemeinsame Bibliothek oder eine statische Bibliothek generieren. Standardmäßig wird es eine gemeinsame Bibliothek erstellen, aber Sie können diese in der OpenXLSX -Datei cmakelists.txt ändern. Die Bibliothek befindet sich in einem Namespace namens OpenXLSX. Daher ist der vollständige Name der Bibliothek OpenXLSX::OpenXLSX .
Das folgende Snippet ist eine minimale CMakelists.txt -Datei für Ihr eigenes Projekt, das OpenXLSX als Unterverzeichnis enthält. Beachten Sie, dass der Ausgangsort der Binärdateien auf ein gemeinsames Verzeichnis eingestellt ist. Unter Linux und MacOS ist dies nicht wirklich erforderlich, aber unter Windows erleichtert dies Ihr Leben, da Sie sonst die openXLSX -Bibliotheksdatei an den Speicherort Ihrer ausführbaren Datei kopieren müssten, um auszuführen.
cmake_minimum_required ( VERSION 3.15)
project (MyProject)
set (CMAKE_CXX_STANDARD 17)
# Set the build output location to a common directory
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} / output )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} / output )
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} / output )
add_subdirectory (OpenXLSX)
add_executable (MyProject main.cpp)
target_link_libraries (MyProject OpenXLSX::OpenXLSX)Mit dem oben genannten sollten Sie den folgenden Code kompilieren und ausführen, wodurch eine neue Excel -Datei namens "talreetsheet.xlsx" generiert wird:
# include < OpenXLSX.hpp >
using namespace OpenXLSX ;
int main () {
XLDocument doc;
doc. create ( " Spreadsheet.xlsx " );
auto wks = doc. workbook (). worksheet ( " Sheet1 " );
wks. cell ( " A1 " ). value () = " Hello, OpenXLSX! " ;
doc. save ();
return 0 ;
}Wenn Sie die OpenXLSX -Binärdateien produzieren und sie selbst in Ihr Projekt aufnehmen möchten, kann dies mit CMake und einem Compiler -Toolchain Ihrer Wahl erfolgen.
Navigieren Sie aus der Befehlszeile durch das OpenXLSX -Unterverzeichnis der Projektrohne und führen Sie die folgenden Befehle aus:
mkdir build
cd build
cmake ..
Der letzte Befehl konfiguriert das Projekt. Dadurch konfiguriert das Projekt mithilfe der Standard -Toolchain. Wenn Sie die Toolchain angeben möchten, geben Sie cmake -G "<toolchain>" .. Mit <toolchain> ist die Toolchain, die Sie verwenden möchten, z. B. "Unix Makefiles", "Ninja", "Xcode" oder "Visual Studio 16 2019". Weitere Informationen finden Sie in der CMake -Dokumentation.
Schließlich können Sie die Bibliothek mit dem Befehl erstellen:
cmake --build . --target OpenXLSX --config Release
Sie können die Argumente --target und --config in das, was Sie verwenden möchten, ändern.
Beim Erstellen können Sie es mit dem folgenden Befehl installieren:
cmake --install .
In diesem Befehl werden die Bibliotheks- und Header -Dateien an der Standardstelle auf Ihrer Plattform (normalerweise/usr/local/unter Linux und MacOS sowie C: Programmdateien unter Windows) installiert. Sie können einen anderen Ort mit dem Argument " -Prefix" festlegen.
Beachten Sie, dass es je nach Plattform möglicherweise nicht möglich ist, sowohl Debug- als auch Freigabebibliotheken zu installieren. Unter Linux und MacOS ist dies kein großes Problem, da Release -Bibliotheken sowohl für Debug- als auch für Release -Executable verwendet werden können. Nicht so für Windows, wobei die Konfiguration der Bibliothek übereinstimmt wie für die ausführbare Datei, die darauf verknüpft ist. Aus diesem Grund ist es unter Windows viel einfacher, den OpenXLSX -Quellordner als Unterverzeichnis in Ihr CMake -Projekt aufzunehmen. Es wird Ihnen viele Kopfschmerzen ersparen.
OpenXLSX ist noch in Arbeit. Im Folgenden finden Sie eine Liste der Funktionen, die implementiert wurden und ordnungsgemäß funktionieren sollten:
Merkmale im Zusammenhang mit Formatierung, Diagrammen und Zahlen wurden nicht implementiert und sind nicht in naher Zukunft geplant.
Es sollte beachtet werden, dass das Erstellen von konstanten Xldocument -Objekten derzeit nicht funktioniert!
Die folgende Tabelle ist die Ausgabe eines Benchmarks (unter Verwendung der Google Benchmark -Bibliothek), die zeigt, dass Lese-/Schreibzugriff mit einer Rate von rund 4.000.000 Zellen pro Sekunde erfolgen kann. Die schwimmenden Punktzahlen sind aufgrund der Umwandlung in/von Zeichenfolgen in der .xml -Datei etwas niedriger.
Run on (16 X 2300 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x8)
L1 Instruction 32 KiB (x8)
L2 Unified 256 KiB (x8)
L3 Unified 16384 KiB (x1)
Load Average: 2.46, 2.25, 2.19
---------------------------------------------------------------------------
Benchmark Time CPU Iterations UserCounters...
---------------------------------------------------------------------------
BM_WriteStrings 2484 ms 2482 ms 1 items=8.38861M items_per_second=3.37956M/s
BM_WriteIntegers 1949 ms 1949 ms 1 items=8.38861M items_per_second=4.30485M/s
BM_WriteFloats 4720 ms 4719 ms 1 items=8.38861M items_per_second=1.77767M/s
BM_WriteBools 2167 ms 2166 ms 1 items=8.38861M items_per_second=3.87247M/s
BM_ReadStrings 1883 ms 1882 ms 1 items=8.38861M items_per_second=4.45776M/s
BM_ReadIntegers 1641 ms 1641 ms 1 items=8.38861M items_per_second=5.11252M/s
BM_ReadFloats 4173 ms 4172 ms 1 items=8.38861M items_per_second=2.01078M/s
BM_ReadBools 1898 ms 1898 ms 1 items=8.38861M items_per_second=4.4205M/s
Eine .xlsx -Datei ist im Wesentlichen eine Reihe von .xml -Dateien in einem .zip -Archiv. Innen verwendet OpenXLSX die Miniz -Bibliothek, um das .zip -Archiv zu komprimieren/zu dekomprimieren, und es stellt sich heraus, dass Miniz eine Obergrenze für die Dateigrößen hat, die es verarbeiten kann.
Die maximal zulässige Dateigröße für eine Datei in einem Archiv (dh ein Eintrag in einem .zip -Archiv, nicht das Archiv selbst) ist 4 GB (unkomprimiert). In der Regel handelt es sich bei der größten Datei in einer .xlsx -Datei/einem Archiv um .xml -Dateien, die die Arbeitsblattdaten enthalten. Dh die Arbeitsblattdaten können 4 GB nicht überschreiten. Was das in Bezug auf Zeilen und Spalten übersetzt, hängt stark von der Art der Daten ab, aber 1.048.576 Zeilen x 128 Spalten, die mit 4-stelligen Ganzzahlen gefüllt sind, werden ca. 4 GB. Die Größe des komprimierten Archivs hängt auch von den im Arbeitsblatt enthaltenen Daten sowie vom verwendeten Komprimierungsalgorithmus ab. Eine Arbeitsmappe mit einem einzigen Arbeitsblatt von 4 GB hat jedoch normalerweise eine komprimierte Größe von 300-350 MB.
Die 4 -GB -Begrenzung hängt nur mit einem einzelnen Eintrag in einem Archiv zusammen, nicht mit der Gesamtarchivgröße. Das heißt, wenn ein Archiv mehrere Einträge mit einer Größe von 4 GB enthält, kann Miniz es dennoch verarbeiten. Für OpenXLSX bedeutet dies, dass noch eine Arbeitsmappe mit mehreren großen Arbeitsblättern geöffnet werden kann.
OpenXLSX verwendet die PugixML -Bibliothek zum Parsen und Manipulieren von .xml -Dateien in .xlsx -Archiv. Pugixml ist ein DOM -Parser, der das gesamte .xml -Dokument in den Speicher liest. Das macht Parsing und Manipulation unglaublich schnell.
Alle Auswahlmöglichkeiten haben jedoch Konsequenzen, und die Verwendung eines DOM -Parsers kann auch viel Speicher verlangen. Für kleine Tabellenkalkulationen sollte es kein Problem sein, aber wenn Sie große Tabellenkalkulationen manipulieren müssen, benötigen Sie möglicherweise viel Speicher.
Die folgende Tabelle gibt einen Hinweis darauf, wie viele Datenspalten von OpenXLSX behandelt werden können (unter der Annahme von 1.048.576 Zeilen):
| Spalten | |
|---|---|
| 8 GB RAM | 8-16 |
| 16 GB RAM | 32-64 |
| 32 GB RAM | 128-256 |
Ihre Kilometerleistung kann variieren. Die Leistung von OpenXLSX hängt von der Art der Daten in der Tabelle ab.
Beachten Sie auch, dass es empfohlen wird, OpenXLSX im 64-Bit-Modus zu verwenden. Während es im 32-Bit-Modus leicht verwendet werden kann, kann es nur auf 4 GB RAM zugreifen, wodurch die Nützlichkeit beim Umgang mit großen Tabellenkalkulationen stark einschränkt.
Wenn der Speicherverbrauch für Sie ein Problem ist, können Sie die OpenXLSX -Bibliothek im Kompaktmodus erstellen (suchen Sie nach der Datei enable_compact_mode in der cmakelists.txt -Datei), mit der der Kompaktmodus von PugixML aktiviert werden kann. OpenXLSX verwendet dann weniger Speicher, läuft aber auch langsamer. Weitere Details in der PugixML -Dokumentation finden Sie hier. Ein Testfall, der auf Linux VM mit 8 GB RAM ausgeführt wurde, ergab, dass OpenXLSX ein Arbeitsblatt mit 1.048.576 Zeilen x 32 Spalten im Kompaktmodus im Vergleich zu 1.048.576 Zeilen x 16 Spalten im Standardmodus verarbeiten könnte.
Die bei weitem die meisten Fragen, die ich zu OpenXLSX auf GitHub bekomme, beziehen sich auf Unicode. Es ist anscheinend (und verständlicherweise) für viele Menschen eine Quelle großer Verwirrung.
Schon früh entschied ich, dass OpenXLSX sich auf das Excel -Teil konzentrieren sollte und nicht auch ein Text -Coding-/Conversion -Dienstprogramm sein sollte. Daher müssen alle Texteingaben/Ausgaben in OpenXLSX in der UTF-8-Codierung erfolgen ... sonst funktioniert es nicht wie erwartet. Es kann auch erforderlich sein, dass die Quellcode-Dateien im UTF-8-Format gespeichert werden. Wenn beispielsweise eine Quelldatei im UTF-16-Format gespeichert wird, sind auch alle String-Literale in UTF-16 enthalten. Wenn Sie also hart codierte Zeichenfolgenliterale in Ihrem Quellcode haben, muss die Quelldatei auch im UTF-8-Format gespeichert werden.
Alle String-Manipulationen und Verwendung in OpenXLSX verwendet die C ++ Std :: String, die agnostisch codiert, aber leicht für die UTF-8-Codierung verwendet werden kann. Außerdem verwendet Excel die interne UTF-8-Codierung (eigentlich kann es möglich sein, andere Codierungen zu verwenden, aber ich bin mir nicht sicher).
Wenn Sie mit anderen Textcodierungen zusammenarbeiten, müssen Sie sich selbst zu/von UTF-8 selbst konvertieren . Es gibt eine Reihe von Optionen (z. B. Boost.Nowide oder Boost.text). Innen verwendet OpenXLSX Boost.Nowide; Es gibt eine Reihe von praktischen Funktionen zum Öffnen von Dateien und zum Konvertieren zwischen STD :: String und Std :: Wstring usw. Ich werde auch vorschlagen, dass Sie James McNellis 'Präsentation bei CPPCON 2014 sehen und Joel Spolskys Blog lesen.
Unicode unter Windows ist besonders herausfordernd. Während UTF-8 unter Linux und MacOS gut unterstützt wird, ist die Unterstützung unter Windows begrenzter. Beispielsweise sieht die Ausgabe von Nicht-ASCII-Zeichen (z. B. chinesische oder japanische Zeichen) in das Terminalfenster wie Kauderwelsch aus. Wie bereits erwähnt, müssen Sie manchmal auch die Textcodierung der Quelldateien selbst bewusst sein. Einige Benutzer hatten Probleme mit dem Absturz von OpenXLSX beim Öffnen /Erstellen von .xlsx-Dateien mit Nicht-ASCII-Dateinamen. Um gesund zu bleiben, empfehle ich, dass Quellcodedateien immer in UTF-8-Dateien enthalten sind. Alle IDEs, die ich kenne, können Quellcodedateien in der UTF-8-Codierung verarbeiten. Willkommen in der wunderbaren Welt von Unicode unter Windows?
Ein Excel-File ist im Wesentlichen nur ein Haufen .xml-Dateien, die in ein .zip-Archiv eingewickelt sind. OpenXLSX verwendet eine Bibliothek der Drittanbieter, um die .xml -Dateien aus dem .zip -Archiv zu extrahieren. Die von OpenXLSX verwendete Standardbibliothek ist zippig, eine objektorientierte Wrapper um Miniz. Die Miniz-Bibliothek ist schnell und ist nur Header, das ideal für OpenXLSX ist.
Es ist jedoch möglich, ein anderes Zip-Bibliothek zu verwenden, wenn Sie möchten. In seltenen Fällen können Sie Stabilitätsprobleme mit Miniz haben. In diesen Fällen kann es nützlich sein, eine andere Zip-Bibliothek zu versuchen.
Die Verwendung der Zippy/Miniz -Bibliothek erfordert keine besonderen Anstrengungen. Es wird direkt aus der Schachtel funktionieren. Die Verwendung eines anderen Zip-Bibliotheks erfordert jedoch einige Arbeiten.
Um eine andere Zip-Bibliothek zu verwenden, müssen Sie eine Wrapper-Klasse erstellen, die der von der Iziparchive-Klasse angegebenen Schnittstelle entspricht. Beachten Sie, dass dies unter Verwendung des Typs des Typs implementiert wird, was bedeutet, dass keine Vererbung erforderlich ist. Die Klasse muss nur eine konforme Oberfläche haben, das ist alles. Geben Sie danach ein Objekt der Klasse an und liefern Sie es dem OpenXLSX -Konstruktor.
Um ein Beispiel dafür zu sehen, wie dies erledigt ist, werfen Sie einen Blick auf Demo1a im Beispiele -Ordner. In diesem Beispiel wird eine Klasse namens CustomIZIP (unter Verwendung von libzip als ZIP -Bibliothek) verwendet, die unter Beispielen/externem/Customzip gefunden werden kann. Um das Beispielprogramm zu erstellen, stellen Sie sicher, dass Libzip (und die Abhängigkeiten) auf Ihrem Computer installiert ist, und aktivieren Sie die Option OpenXLSX_ENABLABLABLE_LIBZIP in der Datei cmakelists.txt im OpenXLSX -Stamm.
Wie bereits erwähnt, verwendet das Demo1a -Beispielprogramm Libzip. Libzip ist eine sehr stabile Bibliothek und weit verbreitet. Meine Erfahrung ist jedoch, dass es für große Zip -Dateien, wie große Tabellenkalkulationen, ziemlich langsam ist. Aus diesem Grund ist Libzip möglicherweise nicht die ideale Lösung, ist jedoch nützlich, um zu zeigen, wie eine andere ZIP -Bibliothek verwendet werden kann.
Im Ordner "Beispiele" finden Sie mehrere Beispielprogramme, in denen die Verwendung von OpenXLSX veranschaulicht. Das Studium dieser Beispielprogramme ist der beste Weg, um zu lernen, wie man OpenXLSX verwendet. Die Beispielprogramme sind kommentiert, daher sollte es relativ leicht sein zu verstehen, was los ist.
OpenXLSX kann jetzt andere Zip -Bibliotheken verwenden als die Standard -Zippy/Miniz -Bibliothek. Siehe Demo1a als Beispiel dafür, wie es gemacht wird
Diese Version enthält Zeilenbereiche und Iteratoren. Es unterstützt auch die Zuordnung von Containern von Zellwerten zu Xlrow -Objekten. Dies ist signifikant schneller (bis zu X2) als die Verwendung von Zellbereichen oder zu Zellen durch Zellreferenzen.
Die interne Architektur von OpenXLSX wurde seit der vorherigen Version erheblich neu gestaltet. Der Grund dafür ist, dass sich die Bibliothek in einen großen Schlammball verwandelte und es immer schwieriger war, Features und Fehlern hinzuzufügen. Mit der neuen Architektur wird es (hoffentlich) einfacher zu verwalten und neue Funktionen hinzuzufügen.
Aufgrund der Neugestaltung der Architektur gibt es einige Änderungen an der öffentlichen Schnittstelle. Diese Änderungen sind jedoch nicht signifikant, und es sollte einfach zu aktualisieren sein:
Mir ist klar, dass diese Änderungen für einige Benutzer Probleme verursachen können. Aus diesem Grund befindet sich die vorherige Version von OpenXLSX in der "Legacy" -Ast dieses Repositorys. Ich empfehle jedoch dringend, dass Sie stattdessen zur neuen Version übergehen.
Es scheint, dass MS Office vor dem <mergeCells> XML -Knoten keine Formatierungs -XML -Knoten toleriert - um eine gemäß Fehlermeldung zu entfernen, ändert das neueste Commit die XLSheet::merges -Funktion, um einen neu erstellten <mergeCells> -Knoten direkt nach dem <sheetData> -Knode einzufügen.
Diese fehlenden Standardeinstellungen könnten zu Follow -up -Fehlern führen, wenn ein Stilindex dieser Zelle später gültig für den Zugriff auf diesen Stil nach Index angenommen wurde (Ausnahme, wenn sich der Index nicht in einem gültigen Bereich befand). Alle in einem Zellformat verfügbaren Stilindizes sind jetzt null initialisiert (ohne Annahmen, wie der Stil mit Index 0 konfiguriert wird, wie es normalerweise standardmäßig ist.
XLDocument.hpp : showWarnings() (Standardeinstellung) und suppressWarnings()XLStyles.hpp : Der Konstruktor -Parameter suppressWarnings (Standard: false )XLDocument::open : Wenn suppressWarnings() unterdrückt (), unterdrücken Sie Warnungen vor ignorierten Kommentaren XML -Dateien und unberechtigte ArbeitsmappenelementeXLDocument::open : m_suppressWarnings Einstellung wird an Xlstyles Constructor weitergeleitetXLException.hpp : Fehlende #include <string> hinzugefügtXLDocument::open erstellt eine fehlende Arbeitsbuchbeziehung in _rels/.rels if und nur wenn eine Arbeitsmappe mit dem Standardpfad xl/workbook.xml im Archiv existiertXLDocument::create und XLDocument::saveAs Funktion Schnittstellen, markierte sie jedoch als [[deprecated]] . Die neuen Schnittstellen erfordern eine explizite Spezifikation von XLForceOverwrite oder XLDoNotOverwrite . Sobald die veralteten Funktionsdefinitionen beseitigt werden können, könnte XLDoNotOverwrite zum neuen Standardverhalten werdenOpenXLSX/external/nowide/nowideDemo0 entfernt / hielt es im Makefile als TestfahrzeugNotesScripts mit xml-format.sh (XML-Linie, nützlich, um den XLSX-ZIP-Inhalt in einem Texteditor zu analysieren)make-gnu.sh zu Scripts/make-gnu.shScripts/cmake-cleanup.sh hinzugefügt, um Befehle zu erstellen (nicht ausführen!), Die alle von CMAKE generierten temporären Dateien entfernenScripts/demos-cleanup.sh hinzugefügt, um alle von den Demos erstellten XLSX-Dateien zu entfernenvoid setSavingDeclaration(XLXmlSavingDeclaration const& savingDeclaration) unter Verwendung class XLXmlSavingDeclaration (definiert in XLXmlData.hpp ), mit der eine benutzerdefinierte XML -Version, Codierung und eigenständige Eigenschaft über Pugixml -Eigenschaft übergeben werden kann, zu Pugixml -Notes/todo-list.txt XLWorksheet ermöglicht jetzt den Zugriff auf ein Objekt, das die zusammengeführten Zellbereiche des Arbeitsblatts verwaltet
XLMergeCells XLWorksheet::merges() - Zugriff auf die XLMergeCells -Klasse für das Arbeitsblatt direktvoid mergeCells(XLCellRange const& rangeToMerge, bool emptyHiddenCells = false) - Durch Rangetomerge definierte Zellenvoid mergeCells(const std::string& rangeReference, bool emptyHiddenCells = false)void unmergeCells(XLCellRange const& rangeToUnmerge) - Unmerge -Zellen definiert durch Rangetounmergevoid unmergeCells(const std::string& rangeReference) - Unmerge -Zellen, die durch Rangereference definiert sind XLMergeCells : Methoden hinzugefügt
int32_t XLMergeCells::findMerge(const std::string& reference) - Finden Sie eine Verschmelzungspassreferenzbool mergeExists(const std::string& reference)int32_t XLMergeCells::findMergeByCell(const std::string& cellRef) - Finden Sie einen Zusammenführen, der STD :: String CellRef enthältint32_t XLMergeCells::findMergeByCell(XLCellReference cellRef) - Finden Sie einen Zusammenführen, der XlcellReference CellRef enthältsize_t count() - Anzahl der im Arbeitsblatt definierten Zusammenführungen erhaltenconst char* merge(int32_t index) - Merge Reference String unter dem Index abrufenconst char* operator[](int32_t index) - Überlastung des Operators [] als Abkürzung zu :: Mergeint32_t appendMerge(const std::string& reference)void deleteMerge(int32_t index) - Löschen Sie mit dem angegebenen Index aus dem Arbeitsblatt (= Unmerge -Zellen), das von xlworksheet :: unmerGecells aufgerufen wird Beispiel für die Verwendung dieser Funktionalität zu Demo10.cpp hinzugefügt
XLDocument::open wird nun unbekannte Unterordner ignorieren (sie bleiben im Reißverschluss in Erinnerung und Bleiben im Archiv beim Speichern nicht zugänglich). Dies verhindert eine Ausnahme für jede XLSX -Datei, die von einer "kreativen" Anwendung geschrieben wurde, in der Elemente hinzugefügt wurdenconstexpr von const unsigned int pugi_parse_settings und bewegte es auf XLDocument.hpp , damit die const Xlstyles und XlsharedStrings zur Verfügung stelltXLStyles -Klasse - Schnittstelle finden Sie in OpenXLSX/headers/XLStyles.hppExamples/Demo10.cpp demonstriert die Verwendung der neuen Funktionen von Xlstyles & Cell FusionsXLCellIterator : Kann jetzt über einen Bereich iterieren und XLCellIterator::cellExists bevor Sie darauf zugreifen. Dies ermöglicht es, nicht existierende Zellen zu überspringen, ohne sie zu erstellen.workbook##.xml , XML -Namespaces und zufällige 64 -Bit -Identifikatorenxl/workbook.xml ) Arbeitsbuch XML-Name wird jetzt akzeptiert, wenn es in _rels/.rels korrekt verwiesen wirdbool OpenXLSX::enable_xml_namespaces() muss verwendet werden <x:row r="1"> um x Namespace -Unterstützung zu aktiviereninsert_child_before("x:row", curRow ) im <y:sheetData> node streifen das x: und fügen Sie ein Zeilenelement mit dem Namen <y:row> mit dem Namespace des übergeordneten Knotens einOpenXLSX/headers/XLXmlParser.hpp ), nehmen als optionales letzte Argument ein bool force_ns , das - falls wahr - einen Namespace für die Erstellung/Zugriff auf die Funktion des Knotens respektiert. Ein Helfer const bool OpenXLSX::XLForceNamespace = true steht für die Code -Lesbarkeit zur VerfügungXMLNode::insert_child_before("x:row", curRow, XLForceNamespace) im <y:sheetData> Knoten wie oben fügt ein Zeilenelement mit dem Namen x:rowid="rId##" gespeichert sind, wobei ## die Sequenznummer ist. Wenn eine neue Komponente zum Arbeitsmappen hinzugefügt wird, wird eine neue Beziehungs -ID festgelegt, indem der höchste vorhandene Wert innerhalb des Arbeitsmodels aufgenommen wird und +1 zu IT hinzugefügt wird. Während der Untersuchung von [#254] wurde festgestellt, dass ein Arbeitsbuch (scheinbar) zufällige 64 -Bit -Ganzzahlen verwendet wurde, die in Form r:id="Rxx" gespeichert wurde, wobei xx eine hexadezimale Darstellung einer 64 -Bit -Ganzzahl ist.OpenXLSX::UseRandomIDs() muss aufgerufen werden, um die ID -Funktionalität zu wechseln, bevor ein solches Dokument geöffnet wirdOpenXLSX::UseSequentialIDs() kann verwendet werden Hinweis auf enable_xml_namespaces : Der Namenspace -Unterstützung ist transparent und kann mit Dokumenten verwendet werden, die solche Namespaces nicht verwenden. Es kann jedoch eine kleine (<5%) Leistung auf große Arbeitsmappen haben und ist daher optional zu aktivieren.
Vorsicht bei UseRandomIDs : Bitte beachten Sie, dass ein gemischter Modus, in dem ein Dokument mit zufälliger ID -Unterstützung und ein anderes ohne sequentielle Beziehungs -IDs geöffnet wird, vorerst nicht unterstützt wird. Wenn Sie mit Dokumenten verschiedener Typen arbeiten müssen, sollten Sie immer das gewünschte Beziehungs -ID -Verhalten für das nächste Dokument konfigurieren, damit arbeiten, die Beziehungs -ID -Konfiguration ändern, bevor Sie das nächste Dokument öffnen.
Bitte ignorieren Sie Beispiele/Demo0.cpp und Beispiele/Demo9.CPP für den Moment (Demo0 ist trivial und wurde verwendet, um die Unterstützung der Nicht-standardmäßigen Arbeitsmappe zu testen, und Demo9 erfordert eine Überprüfung mit besseren Kommentaren). Demo9 zeigt, wie Sie den neuen XLCELLSsignable verwenden, um den Zellinhalt zu kopieren (wie Excel Copy & Flear).
XLCellIterator erzeugt nicht mehr leere Zellen, ::cellExists() um sie zu iterierenXLStyles -UnterstützungXLWorksheet bietet jetzt XLMergeCells -Unterstützung für das Zusammenführen / Entfernen von ZellbereichenDemo10.cpp hat viele Beispiele, wie die neue Xlstyles -Funktionalität verwendet werden kanncustomXml usw. im XLSX -ArchivXLProperties.cpp XLAppProperties to create <TitlesOfParts> and <HeadingPairs> nodes (and subnodes) if missing, added method alignWorksheets , called by XLDocument::open to ensure that all worksheets listed in the workbook xml are also accounted for in docProps/app.xml .XLProperties.cpp prettyInsertXmlNodeBefore , maybe this can eventually become a global function, paired with a TBW function prettyInsertXmlNodeAfter , and could be used by all classes, cleaning up the code for whitespace support substantially.XLProperties.cpp for <HeadingPairs> subnodes: pairCount -> pairValueParent , pairCountValue -> pairValue Code refactored in XLDocument::open to read the shared strings table while consistently ignoring phonetic tags, which were previously only ignored if the very first child of an <si> tag was a phonetic tag. Will now be ignored anywhere before, after or in between text <t> and rich text <r> tags.
Included a "dumb" fallback solution in XLRelationships.cpp GetTypeFromString to support previously unknown relationship domains, eg type="http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet" . Altered behavior will initially test against the hardcoded relationship domains, and if that test fails to identify a relationship type string, the type string will be searched for an occurrence of /relationships/ and if that substring is found, the type detection fallback will try to evaluate the relationship type based on the substring starting with /relationships/ , ignoring the domain. For the above example, that would result in a test of typeString.substr( comparePos ) == "/relationships/worksheet" , where comparePos == 41 (the position at which substring /relationships/ begins).
In anticipation of a potential future need for a similar "dumb" fallback solution, repeating hardcoded strings in XLContentTypes.cpp GetTypeFromString were also replaced with string constants.
Updated .gitignore to a more generic version that excludes everything and explicitly re-includes all desired files.
BinaryAsHexString : replaced char array with std::string, as ISO C++ standard does not permit variable size arraysRand64 : added explicit type cast, as bitwise shift-left does not do integer promotion to long on the left operand-Wpedantic -Wextra and removed all previously disabled flags after below patchesf( param ) -> f(param) , a[ index ] -> a[index] and if( condition ) -> if (condition) )warning: enumerated and non-enumerated type in conditional expression [-Wextra]void ZipArchive::Save(std::ostream& stream)void ZipArchive::ExtractDir(const std::string& dir, const std::string& dest)void ZipArchive::ExtractAll(const std::string& dest)-Wunused-function by pragma for functions fileExists and isDirectoryuint32_t (was uint64_t ). CAUTION : there is no validity check on the underlying XML (nor was there ever one in case a value was inconsistent with OpenXLSX::MAX_ROWS)-Wsign-comparebool endReached() to eliminate -Wignored-qualifiers (ignored because const on trivial return types accomplishes nothing)OpenXLSX::ignore template, can be used to suppress -Wunused-parameter and -Wunused-variable like so: OpenXLSX::ignore(unusedValue)-Wunused-parameter#pragma warning lines in another pragma to disable -Wunknown-pragmas (on gcc/g++)#pragma GCC diagnostic push#pragma GCC diagnostic ignored "-Wunknown-pragmas" // disable warning about below #pragma warning being unknown# pragma /* offending lines go here */#pragma GCC diagnostic popzippy.hppIZipArchive.hppXLCell.hppXLCellIterator.hppXLCellRange.hppXLCellReference.hppXLCellValue.hppXLColor.hppXLColumn.hppXLCommandQuery.hppXLContentTypes.hppXLDateTime.hppXLDocument.hppXLException.hppXLFormula.hppXLMergeCells.hppXLProperties.hppXLRelationships.hppXLRowData.hppXLRow.hppXLSharedStrings.hppXLSheet.hppXLStyles.hppXLWorkbook.hppXLXmlData.hppXLXmlFile.hppXLZipArchive.hppExamples/Demo5.cpp<Properties> (document) element, was previously wrongly appended to headingPairs/xl/worksheets/sheet* , /xl/sharedStrings.xml , /xl/styles.xml , /xl/theme/theme* ) and otherwise ignored. This fixes an issue when the workbook contains /xl/pivotCache/ and /xl/pivotTables/ entries until support for those is implemented (if ever ;P)<cols> element obtained via a rowNode parent's parentstd::vector< XLStyleIndex > m_columnStyles , and a method fetchColumnStyles that will populate the vector so that it can be passed to the XLCellIterator constructorXLCellIterator::cellExists() without creating the XML for the cell.<font><scheme val="major"/></font> )<font><vertAlign val="subscript"/></font> )<fills><fill><gradientFill>...</gradientFill></fill>...</fills> are now supportedPlease refer to Demo10 and XLStyles.hpp on how to set cell formatting. Zusamenfassend: