OpenXlsx est une bibliothèque C ++ pour lire, écrire, créer et modifier les fichiers Microsoft Excel®, avec le format .xlsx.
Comme le dit le titre - la dernière "version" qui est montrée sur https://github.com/troldal/openxlsx/releases est de 2021-11-06, et gravement obsolète - veuillez extraire / télécharger la dernière version SW directement à partir du référentiel dans son état actuel. Lien pour ceux qui ne veulent pas utiliser git : https://github.com/troldal/openxlsx/archive/refs/heads/master.zip
A examiné le code XLDateTime en réponse au # 299 et a corrigé un bug que je pense que je me suis peut-être présenté. Toutes mes excuses, les dates devraient désormais construire correctement à partir de double , struct tm et time_t et se revertir en struct tm .
L'historique des changements se trouve dans le journal de changement détaillé.
Aujourd'hui, les fonctionnalités de la branche de développement ont finalement fait la branche principale :) Pour plus de détails, veuillez vous référer au journal de modification détaillé ci-dessous.
En résumé:
OpenXLSX/headers/XLStyles.hpp : La classe XLSTYLES (et beaucoup de sous-classes) ont été ajoutées, offrant un accès presque complet à toutes les capacités de formatage Excel.OpenXLSX/headers/XLMergeCells.hpp XLSheet.hppExamples/Demo10.cpp montre comment les styles et les fusions sont utilisés Remarque: La section désactivée avec testBasics = false va briser la feuille de calcul Excel résultante si elle est activée, le seul but est de démontrer l'accès à toutes les nouvelles classes et méthodes. Si vous souhaitez les utiliser, assurez-vous de les utiliser correctementRemarque sur XlNumberFormat (S) : Contrairement à tous les autres éléments XlStyles, ceux-ci n'utilisent pas d'index dans le XML comme ID référable (xlCellFormat :: SetNumberFormatid), mais plutôt un ID défini par l'utilisateur qui peut être défini via XLNumberFormat :: SetNumberFormatid - et pour un format XLCellFormat, peut être déterminé à un format Auto-Decat, ou pour un format XLCell, Ord pour un format XLCEllFormat, Ord pour un format adress prédéfini par MS. Généralement, pour les formats personnalisés, il est recommandé d'utiliser des ID> 100.
Sur la liste des tâches:
Il y a quelques jours, j'ai finalement eu le temps d'apprendre suffisamment de fonctionnalités GIT pour pouvoir travailler avec des branches. J'ai donc créé une branche de développement avec les dernières fonctionnalités que j'ai mentionnées dans certaines demandes / problèmes de traction. N'hésitez pas à jeter un œil. De cette façon, vous n'avez pas à attendre que le référentiel principal soit mis à jour.
Fermé une multitude de demandes de traction qui avaient été implémentées dans la mise à jour de mai 2024, implémentée deux autres éditoriaux de PR # 246 et # 253.
Après une longue période d'inactivité, j'ai décidé de reprendre le développement d'OpenXLSX. Le code a été nettoyé et un nombre important de bogues ont été corrigés. La bibliothèque a été testée sur Windows, MacOS et Linux, et devrait fonctionner sur toutes les plates-formes.
Je voudrais remercier sincèrement toutes les personnes qui ont contribué au projet, soit en signalant des bogues, en suggérant des fonctionnalités ou en soumettant des demandes de traction. Je tiens également à remercier toutes les personnes qui ont joué le projet et qui ont montré de l'intérêt pour le projet.
En particulier, je tiens à remercier Lars Uffmann (https://codeberg.org/lars_uffmann/) pour ses contributions au projet. Lars a passé beaucoup de temps et d'efforts pour nettoyer le code, corriger les bogues et implémenter de nouvelles fonctionnalités. Sans son aide, le projet n'aurait pas été dans l'État qu'il est aujourd'hui.
De nombreux langages de programmation ont la possibilité de modifier les fichiers Excel, soit nativement ou sous forme de bibliothèques open source. Cela inclut Python, Java et C #. Pour C ++, cependant, les choses sont plus dispersées. Bien qu'il existe certaines bibliothèques, elles sont généralement moins matures et ont un ensemble de fonctionnalités plus petit que pour d'autres langues.
Parce qu'il n'y a pas de bibliothèque open source qui a pleinement répondu à mes besoins, j'ai décidé de développer la bibliothèque OpenXLSX.
L'ambition est qu'OpenXLSX devrait être en mesure de lire, d'écrire, de créer et de modifier les fichiers Excel (données ainsi que de formatage), et le faire avec le moins de dépendances possible. Actuellement, OpenXLSX dépend des bibliothèques suivantes:
Ces bibliothèques sont toutes uniquement en tête et incluses dans le référentiel, c'est-à-dire qu'il n'est pas nécessaire de télécharger et de construire séparément.
De plus, la mise au point a été mise sur la vitesse , pas sur l'utilisation de la mémoire (bien qu'il existe des options pour réduire l'utilisation de la mémoire, au prix de la vitesse; plus à ce sujet plus tard).
OpenXLSX a été testé sur les plates-formes / compilateurs suivants. Notez qu'un '-' ne signifie pas qu'OpenXlsx ne fonctionne pas; Cela signifie simplement qu'il n'a pas été testé:
| GCC | Bruit | Msvc | |
|---|---|---|---|
| Fenêtre | Mingw | Mingw | + |
| Cygwin | - | - | N / A |
| Macos | + | + | N / A |
| Linux | + | + | N / A |
Les versions du compilateur suivant devraient être en mesure de compiler OpenXlsx sans erreurs:
Clang 7 devrait être en mesure de compiler OpenXlsx, mais apparemment, il y a un bogue dans l'implémentation de la variante STD ::, qui provoque des erreurs de compilateur.
Visual Studio 2017 devrait également fonctionner, mais n'a pas été testé.
OpenXlsx utilise CMake comme système de construction (ou générateur de système de construction, pour être exact). Par conséquent, vous devez d'abord installer CMake afin de construire OpenXlsx. Vous pouvez trouver des instructions d'installation sur www.cmake.org.
La bibliothèque OpenXLSX est située dans le sous-répertoire OpenXlsx de ce repo. Le sous-répertoire OpenXLSX est un projet CMake autonome; Si vous utilisez CMake pour votre propre projet, vous pouvez ajouter le dossier OpenXLSX en tant que sous-répertoire à votre propre projet. Alternativement, vous pouvez utiliser CMake pour générer des fichiers de fabrication ou des fichiers de projet pour une chaîne d'outils de votre choix. Les deux méthodes sont décrites dans ce qui suit.
De loin, le moyen le plus simple d'utiliser OpenXlsx dans votre propre projet est d'utiliser Cake vous-même, puis d'ajouter le dossier OpenXlsx comme sous-répertoire à l'arbre source de votre propre projet. Plusieurs projets CMake de soutien d'IDE, notamment Visual Studio 2019, JetBrains Clion et Qt Creator. Si vous utilisez Visual Studio, vous devez sélectionner spécifiquement le «projet CMake» lors de la création d'un nouveau projet.
Le principal avantage de l'inclusion de la bibliothèque OpenXlsx en tant que sous-dossier source, est qu'il n'est pas nécessaire de localiser spécifiquement les fichiers de bibliothèque et d'en-tête; CMake s'en occupera pour vous. De plus, la bibliothèque sera créée en utilisant la même configuration (débogage, version, etc.) que votre projet. En particulier, c'est un avantage sur Windows, où n'est-il pas possible d'utiliser les bibliothèques de libération dans un projet de débogage (et vice versa) lorsque les objets STL sont passés par l'interface de la bibliothèque, comme ils le sont dans OpenXlsx. Lorsque vous incluez la source OpenXlsx, ce ne sera pas un problème.
En utilisant la commande add_subdirectory() dans le fichier cMakelists.txt pour votre projet, vous pouvez accéder aux en-têtes et aux fichiers de bibliothèque d'OpenXlsx. OpenXlsx peut générer une bibliothèque partagée ou une bibliothèque statique. Par défaut, il produira une bibliothèque partagée, mais vous pouvez le modifier dans le fichier openxlsx cmakelists.txt. La bibliothèque est située dans un espace de noms appelé OpenXlsx; Par conséquent, le nom complet de la bibliothèque est OpenXLSX::OpenXLSX .
L'extrait suivant est un fichier minimum cMakelists.txt pour votre propre projet, qui inclut OpenXlsx en tant que sous-répertoire. Notez que l'emplacement de sortie des binaires est défini sur un répertoire commun. Sur Linux et MacOS, ce n'est pas vraiment requis, mais sur Windows, cela vous facilitera la vie, car vous devrez autrement copier le fichier de bibliothèque partagée OpenXlsx à l'emplacement de votre exécutable pour s'exécuter.
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)En utilisant ce qui précède, vous devriez être en mesure de compiler et d'exécuter le code suivant, qui générera un nouveau fichier Excel nommé 'Spreadsheet.xlsx':
# 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 ;
}Si vous souhaitez produire les binaires OpenXlsx et les inclure dans votre projet vous-même, cela peut être fait en utilisant CMake et une chaîne d'outils de compilateur de votre choix.
Dans la ligne de commande, naviguez dans le sous-répertoire OpenXlsx de la racine du projet et exécutez les commandes suivantes:
mkdir build
cd build
cmake ..
La dernière commande configurera le projet. Cela configurera le projet à l'aide de la chaîne d'outils par défaut. Si vous souhaitez spécifier la chaîne d'outils, tapez cmake -G "<toolchain>" .. avec <toolchain> étant la chaîne d'outils que vous souhaitez utiliser, par exemple "Unix Makefiles", "ninja", "xcode" ou "Visual Studio 16 2019". Voir la documentation CMake pour plus de détails.
Enfin, vous pouvez créer la bibliothèque à l'aide de la commande:
cmake --build . --target OpenXLSX --config Release
Vous pouvez modifier les arguments --target et --config ce que vous souhaitez utiliser.
Lors de la construction, vous pouvez l'installer en utilisant la commande suivante:
cmake --install .
Cette commande installera la bibliothèque et les fichiers d'en-tête sur l'emplacement par défaut de votre plate-forme (généralement / usr / local / on linux et macOS, et C: Program Files sur Windows). Vous pouvez définir un emplacement différent à l'aide de l'argument - Prefix.
Notez que selon la plate-forme, il peut ne pas être possible d'installer à la fois les bibliothèques de débogage et de publication. Sur Linux et MacOS, ce n'est pas un gros problème, car les bibliothèques de publication peuvent être utilisées pour les exécutables de débogage et de libération. Ce n'est pas le cas pour Windows, où la configuration de la bibliothèque doit être la même que celle de l'exécutable. Pour cette raison, sur Windows, il est beaucoup plus facile d'inclure simplement le dossier Source OpenXLSX en tant que sous-répertoire de votre projet CMake; Cela vous fera économiser beaucoup de maux de tête.
OpenXLSX est toujours en cours. Ce qui suit est une liste des fonctionnalités qui ont été implémentées et devraient fonctionner correctement:
Les caractéristiques liées à la mise en forme, les parcelles et les chiffres n'ont pas été mises en œuvre et ne sont pas prévues pour être dans un proche avenir.
Il convient de noter que la création d'objets const xldocuments ne fonctionne actuellement pas!
Le tableau ci-dessous est la sortie d'une référence (en utilisant la bibliothèque Google Benchmark), qui montre que l'accès en lecture / écriture peut être effectué à un taux d'environ 4 000 000 cellules par seconde. Les numéros de points flottants sont un peu plus bas, en raison de la conversion en / à partir des chaînes dans le fichier .xml.
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
Un fichier .xlsx est essentiellement un tas de fichiers .xml dans une archive .zip. En interne, OpenXlsx utilise la bibliothèque Miniz pour compresser / décompresser l'archive .zip, et il s'avère que Miniz a une limite supérieure concernant les tailles de fichiers qu'il peut gérer.
La taille de fichier maximale autorisée pour un fichier dans une archive (c'est-à-dire l'entrée dans une archive .zip, pas l'archive elle-même) est de 4 Go (non compressé). Habituellement, le plus grand fichier d'un fichier / archive .xlsx sera les fichiers .xml détenant les données de la feuille de calcul. C'est-à-dire que les données de la feuille de travail peuvent ne pas dépasser 4 Go. Ce que cela se traduit en termes de lignes et de colonnes dépend beaucoup du type de données, mais 1 048 576 lignes x 128 colonnes remplies d'entiers à 4 chiffres prendront environ. 4 Go. La taille des archives compressées dépend également des données conservées dans la feuille de calcul, ainsi que de l'algorithme de compression utilisé, mais un classeur avec une seule feuille de calcul de 4 Go aura généralement une taille compressée de 300-350 Mo.
La limitation de 4 Go n'est liée qu'à une seule entrée dans une archive, et non à la taille totale des archives. Cela signifie que si une archive contient plusieurs entrées avec une taille de 4 Go, Miniz peut toujours le gérer. Pour OpenXLSX, cela signifie qu'un classeur avec plusieurs grandes feuilles de travail peut toujours être ouvert.
OpenXlsx utilise la bibliothèque PUGIXML pour l'analyse et la manipulation des fichiers .xml dans l'archive .xlsx. PUGIXML est un analyseur Dom, qui lit l'ensemble du document .xml en mémoire. Cela rend l'analyse et la manipulation incroyablement rapidement.
Cependant, tous les choix ont des conséquences et l'utilisation d'un analyseur Dom peut également exiger beaucoup de mémoire. Pour les petites feuilles de calcul, cela ne devrait pas être un problème, mais si vous avez besoin de manipuler de grandes feuilles de calcul, vous devrez peut-être beaucoup de mémoire.
Le tableau ci-dessous donne une indication du nombre de colonnes de données peut être gérée par OpenXLSX (en supposant 1 048 576 lignes):
| Colonnes | |
|---|---|
| 8 Go de bélier | 8-16 |
| 16 Go de bélier | 32-64 |
| 32 Go de bélier | 128-256 |
Votre milage peut varier. Les performances d'OpenXlsx dépendront du type de données dans la feuille de calcul.
Notez également qu'il est recommandé d'utiliser OpenXLSX en mode 64 bits. Bien qu'il puisse être facilement utilisé en mode 32 bits, il ne peut accéder qu'à 4 Go de RAM, ce qui limitera gravement l'utilité lors de la gestion de grandes feuilles de calcul.
Si la consommation de mémoire est un problème pour vous, vous pouvez créer la bibliothèque OpenXLSX en mode compact (recherchez le fichier active_compact_mode dans le fichier CMakelists.txt), ce qui permettra le mode compact de PugixML. OpenXlsx utilisera alors moins de mémoire, mais fonctionne également plus lentement. Voir plus de détails dans la documentation PUGIXML ici. Un cas de test exécuté sur VM Linux avec 8 Go de RAM a révélé qu'OpenXLSX pourrait gérer une feuille de calcul avec 1 048 576 lignes x 32 colonnes en mode compact, contre 1 048 576 lignes x 16 colonnes en mode par défaut.
De loin, la plupart des questions que j'obtiennent sur OpenXlsx sur GitHub, est liée à Unicode. C'est apparemment (et naturellement) une source de grande confusion pour de nombreuses personnes.
Au début, j'ai décidé qu'OpenXLSX devrait se concentrer sur la partie Excel et ne pas être également un utilitaire de codage / conversion de texte. Par conséquent, toutes les entrées / sorties de texte vers OpenXLSX doivent être dans le codage UTF-8 ... sinon cela ne fonctionnera pas comme prévu. Il peut également être nécessaire que les fichiers de code source soient enregistrés au format UTF-8. Si, par exemple, un fichier source est enregistré au format UTF-16, tous les littéraux de chaîne seront également dans UTF-16. Donc, si vous avez des littéraux de chaîne à code dur dans votre code source, le fichier source doit également être enregistré au format UTF-8.
Toutes les manipulations et l'utilisation de la chaîne dans OpenXlsx utilisent la chaîne C ++ STD ::, qui codage agnostique, mais peut facilement être utilisée pour le codage UTF-8. En outre, Excel utilise le codage UTF-8 en interne (en fait, il peut être possible d'utiliser d'autres encodages, mais je n'en suis pas sûr).
Pour la raison ci-dessus, si vous travaillez avec d'autres encodages de texte, vous devez vous convertir à / depuis UTF-8 vous-même . Il existe un certain nombre d'options (par exemple, boost.nowide ou boost.Text). En interne, OpenXlsx utilise Boost.Nowide; Il dispose d'un certain nombre de fonctionnalités pratiques pour ouvrir des fichiers et convertir entre Std :: String et Std :: WString, etc. Je vous suggère également de regarder la présentation de James McNellis au CPPCON 2014, et de lire le blog de Joel Spolsky.
Unicode sur Windows est particulièrement difficile. Bien que l'UTF-8 soit bien pris en charge sur Linux et MacOS, la prise en charge de Windows est plus limitée. Par exemple, la production de caractères non ASCII (par exemple, les caractères chinois ou japonais) à la fenêtre terminale ressemblera à du charabia. Comme mentionné, vous devez parfois être conscient du codage de texte des fichiers source eux-mêmes. Certains utilisateurs ont eu des problèmes avec OpenXLSX se plantant lors de l'ouverture / création de fichiers .xlsx avec des noms de fichiers non ASCII, où il s'est avéré que le code source du programme de test était dans un codage non UTF-8, et donc la chaîne d'entrée à OpenXLSX était également non UTF-8. Pour rester sain d'esprit, je recommande que les fichiers de code source sont toujours dans les fichiers UTF-8; Tous les IDE que je connais peuvent gérer les fichiers de code source dans le codage UTF-8. Bienvenue dans le monde merveilleux d'Unicode sur Windows?
Un File Excel n'est essentiellement qu'un tas de fichiers .xml enveloppés dans une archive .zip. OpenXlsx utilise une bibliothèque tierce pour extraire les fichiers .xml de l'archive .zip. La bibliothèque par défaut utilisée par OpenXlsx est Zippy, qui est un wrapper orienté objet autour de Miniz. La bibliothèque Miniz est rapide et est uniquement en tête, ce qui est idéal pour OpenXLSX.
Cependant, il est possible d'utiliser une bibliothèque zippée différente, si vous le souhaitez. Dans de rares cas, vous pouvez rencontrer des problèmes de stabilité avec Miniz. Dans ces cas, il peut être utile d'essayer une bibliothèque zippée différente.
L'utilisation de la bibliothèque Zippy / Miniz ne nécessite aucun effort spécial; Cela fonctionnera directement hors de la boîte. L'utilisation d'une bibliothèque zippée différente, cependant, nécessitera un peu de travail.
Afin d'utiliser une bibliothèque zippée différente, vous devez créer une classe de wrapper conforme à l'interface spécifiée par la classe iziparchive. Notez que cela est implémenté en utilisant l'effacement de type , ce qui signifie qu'aucun héritage n'est requis; La classe a juste besoin d'avoir une interface conforme, c'est tout. Après cela, fournissez un objet de la classe et fournissez-le au constructeur OpenXlsx.
Pour voir un exemple de la façon dont cela se fait, jetez un œil à Demo1a dans le dossier Exemples. Cet exemple utilise une classe appelée Customzip (en utilisant libzip comme bibliothèque zip) qui peut être trouvée sous des exemples / external / customzip. Afin de créer l'exemple de programme, assurez-vous que Libzip (et ses dépendances) est installé sur votre ordinateur et activez l'option OpenXLSX_enable_libzip dans le fichier CMAKELIST.TXT dans la racine OpenXlsx.
Comme mentionné, le programme d'exemple Demo1a utilise Libzip. Libzip est une bibliothèque très stable et largement utilisée. Cependant, mon expérience est qu'il est assez lent pour les grands fichiers postaux, tels que les grandes feuilles de calcul. Pour cette raison, Libzip n'est peut-être pas la solution idéale, mais elle est utile pour montrer comment une bibliothèque zip différente peut être utilisée.
Dans le dossier «Exemples», vous trouverez plusieurs exemples de programmes, qui illustre comment utiliser OpenXlsx. L'étude de ces exemples de programmes est le meilleur moyen d'apprendre à utiliser OpenXLSX. Les exemples de programmes sont annotés, il devrait donc être relativement facile de comprendre ce qui se passe.
OpenXlsx peut désormais utiliser d'autres bibliothèques zip que la bibliothèque zippy / miniz par défaut. Voir Demo1a comme un exemple de la façon dont c'est fait
Cette version comprend des gammes de lignes et des itérateurs. Il prend également en charge l'attribution des conteneurs des valeurs cellulaires aux objets xlRow. Ceci est significativement plus rapide (jusqu'à X2) que d'utiliser des plages cellulaires ou d'accès aux cellules par références cellulaires.
L'architecture interne d'OpenXlsx a été considérablement repensée depuis la version précédente. La raison en est que la bibliothèque se transformait en une grosse boule de boue, et il était de plus en plus difficile d'ajouter des fonctionnalités et de corriger les bugs. Avec la nouvelle architecture, il sera (espérons-le) plus facile à gérer et à ajouter de nouvelles fonctionnalités.
En raison de la refonte de l'architecture, il y a quelques modifications à l'interface publique. Ces modifications, cependant, ne sont pas significatives, et il devrait être facile à mettre à jour:
Je me rends compte que ces modifications peuvent causer des problèmes à certains utilisateurs. Pour cette raison, la version précédente d'OpenXlsx peut être trouvée dans la branche "Legacy" de ce référentiel. Cependant, je vous recommande fortement de passer à la nouvelle version à la place.
Il apparaît que MS Office ne tolère aucun nœud XML de formatage avant le nœud XML <mergeCells> - afin de se débarrasser d'un message d'erreur, le dernier engagement modifie la fonction XLSheet::merges pour insérer un nœud <mergeCells> nouvellement créé directement après le nœud <sheetData> .
Ces valeurs par défaut manquantes pourraient entraîner des erreurs de suivi lorsque tout index de style de cette cellule a ensuite été supposé valable pour accéder audit style par index (exception si l'index n'était pas dans une plage valide). Tous les index de style disponibles dans un format cellulaire sont désormais zéro-initialisés (sans hypothèses ce que le style avec l'index 0 peut être configuré car, normalement, il s'agit de défauts - si vous voulez en être sûr, fournissez une cellule avec un format connu sous le nom de modèle CopyFrom à xlCellFormats :: Create).
XLDocument.hpp : Ajout de showWarnings() (paramètre par défaut) et suppressWarnings()XLStyles.hpp : Ajout du paramètre suppressWarnings au constructeur (par défaut: false )XLDocument::open suppressWarnings()XLDocument::open m_suppressWarningsXLException.hpp : ajout manquant #include <string>XLDocument::open créera une relation de classeur manquant dans _rels/.rels si, et seulement si, un classeur avec le chemin par défaut xl / workbook.xml existe dans les archivesXLDocument::create et XLDocument::saveAs Fonction interfaces, mais les a marqués comme [[deprecated]] . Les nouvelles interfaces nécessitent une spécification explicite de XLForceOverwrite ou XLDoNotOverwrite . Une fois que les définitions de fonction obsolètes peuvent être supprimées, XLDoNotOverwrite pourrait devenir le nouveau comportement par défautOpenXLSX/external/nowide/nowideDemo0 / le conserver dans le makefile comme véhicule d'essaiNotes à jourScripts créé avec xml-format.sh (Linting XML, utile pour analyser les contenus XLSX Zip dans un éditeur de texte)make-gnu.sh sur Scripts/make-gnu.shScripts/cmake-cleanup.sh pour préparer (pas exécuter!) Commandes qui suppriment tous les fichiers temporaires générés par CMakeScripts/demos-cleanup.sh pour supprimer tous les fichiers xlsx créés par les démosXLXmlData.hpp charge de void setSavingDeclaration(XLXmlSavingDeclaration const& savingDeclaration) class XLXmlSavingDeclarationNotes/todo-list.txt XLWorksheet permet désormais d'accéder à un objet en gérant les gammes de cellules fusionnées de la feuille de travail
XLMergeCells XLWorksheet::merges() - Accédez à la classe XLMergecells pour la feuille de calcul directementvoid mergeCells(XLCellRange const& rangeToMerge, bool emptyHiddenCells = false) - fusion cellules définies par rangetomergevoid mergeCells(const std::string& rangeReference, bool emptyHiddenCells = false) - fusion cellules définies par rangereferencevoid unmergeCells(XLCellRange const& rangeToUnmerge) - Cellules démêlées définies par Rangetounmergevoid unmergeCells(const std::string& rangeReference) - Cellules démêlées définies par rangereference XLMergeCells : Méthodes ajoutées
int32_t XLMergeCells::findMerge(const std::string& reference) - Recherchez une référence de correspondance de fusionbool mergeExists(const std::string& reference) - Testez si une fusion avec référence existeint32_t XLMergeCells::findMergeByCell(const std::string& cellRef) - Trouver une fusion contenant Std :: String CellRefint32_t XLMergeCells::findMergeByCell(XLCellReference cellRef) - Trouver une fusion contenant xlcellreference CellRefsize_t count() - obtenir le nombre de fusions définies dans la feuille de calculconst char* merge(int32_t index) - Obtenez la chaîne de référence de fusion à indexconst char* operator[](int32_t index) - surcharge d'opérateur [] en tant que raccourci vers :: fusionnerint32_t appendMerge(const std::string& reference) - Définissez une nouvelle fusion, invoquée par XLWorksheet :: Mergecellsvoid deleteMerge(int32_t index) - Supprimer la fusion avec l'indice donné de la feuille de travail (= cellules de me-furie Exemple supplémentaire d'utilisation de cette fonctionnalité à Demo10.cpp
XLDocument::open ignorera désormais les sous-dossiers inconnus (ils restent non modifiés et inaccessibles dans le zip en mémoire et restent dans les archives lors de la sauvegarde). Cela empêche de lancer une exception pour tout fichier XLSX écrit par une application "créative" qui a ajouté des éléments inconnus à cette bibliothèqueconstexpr à partir de const unsigned int pugi_parse_settings et l'a déplacé vers XLDocument.hpp afin que le const devienne disponible pour xlstyles et xlsharedstringsXLStyles - L'interface peut être trouvée dans OpenXLSX/headers/XLStyles.hppExamples/Demo10.cpp démontre l'utilisation des nouvelles fonctionnalités de fusion XlStyles et cellulesXLCellIterator non créé: peut désormais itérer sur une plage et tester XLCellIterator::cellExists avant d'y accéder. Cela permet de sauter des cellules inexistantes sans les créer.workbook##.xmlxl/workbook.xml ) est désormais accepté s'il est correctement référencé dans _rels/.relsbool OpenXLSX::enable_xml_namespaces() doit être utilisé pour activer la prise en charge de l'espace de noms avant d'ouvrir un document en utilisant EG un espace de noms x (comme SO: <x:row r="1"> ) partout partoutinsert_child_before("x:row", curRow ) dans le nœud <y:sheetData> détruira l'élément x: et insérer un élément de ligne nommé <y:row> , en utilisant l'espace de noms du nœud parentOpenXLSX/headers/XLXmlParser.hpp ) prendre comme dernier argument facultatif, un bool force_ns qui - si true - respectera un espace de noms transmis dans la fonction de création / accès de nœud. Un assistant const bool OpenXLSX::XLForceNamespace = true est disponible pour la lisibilité du codeXMLNode::insert_child_before("x:row", curRow, XLForceNamespace) dans le nœud <y:sheetData> comme ci-dessus, inséra un élément de ligne nommé x:rowid="rId##" où ## est le numéro de séquence, et lorsqu'un nouveau composant est ajouté au classeur, un nouvel ID de relation est déterminé en prenant la valeur existante la plus élevée dans le classeur et en y ajoutant +1. Au cours de l'étude de [# 254], un classeur a été utilisé (apparemment) entières aléatoires 64 bits, stockées sous la forme r:id="Rxx" , xx étant une représentation hexadécimale d'un entier 64 bits.OpenXLSX::UseRandomIDs() doit être invoqué pour changer la fonctionnalité de l'ID avant d'ouvrir un tel documentOpenXLSX::UseSequentialIDs() peut être utilisé pour restaurer la fonctionnalité d'identification de la relation par défaut (séquentielle) Remarque sur enable_xml_namespaces : la prise en charge de l'espace de noms est transparente et peut être utilisée avec des documents qui n'utilisent pas de telles espaces de noms. Cependant, il peut avoir un petit (<5%) impact sur les performances sur les grands classeurs et est donc facultatif à permettre.
ATTENTION AVEC UseRandomIDs : Veuillez noter qu'un mode mixte, où un document est ouvert avec un support d'identification aléatoire et un autre sans ID de relation séquentiel, n'est pas pris en charge pour le moment. Si vous devez travailler avec des documents de différents types, vous devez toujours configurer le comportement de l'ID de la relation souhaité pour le document suivant, travailler avec cela, fermer et modifier la configuration de l'ID de relation avant d'ouvrir le document suivant.
Veuillez ne pas tenir compte des exemples / Demo0.cpp et des exemples / Demo9.cpp pour l'instant (Demo0 est trivial et a été utilisé pour tester le support de classeur non standard, et Demo9 nécessite un examen avec de meilleurs commentaires). Demo9 présente comment utiliser le nouveau contenu XLCelLassignable pour copier-assign (comme Excel Copy & Paste).
XLCellIterator ne crée plus de cellules vides uniquement pour les itérations et fournit ::cellExists() pour tester si la cellule actuellement pointue est déjà dans la feuille de calcul XML, avant d'y accéderXLStylesXLWorksheet fournit désormais la prise en charge XLMergeCells pour la fusion / les gammes de cellules qui mettentDemo10.cpp propose de nombreux exemples sur la façon d'utiliser la nouvelle fonctionnalité XLSTYLEScustomXml , etc. dans l'archive XLSXXLProperties.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. En bref: