La bibliothèque QXlsx est un outil tiers incontournable pour les développeurs Qt souhaitant lire et générer des fichiers Microsoft Excel (.xlsx). Contrairement à d'autres solutions, elle ne nécessite pas l'installation de Microsoft Office sur la machine cible, car elle manipule directement le format XML sous-jacent.
1. Mise en place de l'environnement
Pour les systèmes Linux (Ubuntu/Debian), il est impératif d'installer les fichiers de développement privés de Qt pour compiler la bibliothèque :
sudo apt install qtbase5-private-dev
Intégration au projet
Après avoir téléchargé les sources de QXlsx, vous pouvez l'intégrer selon votre moteur de production :
Via qmake (.pro) :
include(libs/qtxlsx/src/xlsx/xlsx.pri)
Via CMake (CMakeLists.txt) :
add_subdirectory(libs/qtxlsx)
target_link_libraries(mon_application Qt5::Xlsx)
2. Création et écriture de données
L'exemple suivant illustre la création d'un classeur, l'insertion de valeurs textuelles, numériques et l'ajout d'une formule de calcul.
#include <QCoreApplication>
#include "xlsxdocument.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QXlsx::Document doc;
// Insertion de contenus variés
doc.write("A1", "Libellé");
doc.write("B1", "Valeur");
doc.write("A2", "Quantité");
doc.write("B2", 500);
// Utilisation de formules Excel
doc.write("B3", "=SUM(B2, 100)");
if (doc.saveAs("rapport_ventes.xlsx")) {
qDebug() << "Fichier généré avec succès.";
}
return 0;
}
3. Lecture d'un fichier existant
Pour extraire des données d'un fichier Excel, il suffit d'instancier l'objet Document avec le chemin du fichier.
#include <QCoreApplication>
#include "xlsxdocument.h"
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QXlsx::Document monTableau("rapport_ventes.xlsx");
if (monTableau.load()) {
QVariant celluleA1 = monTableau.read("A1");
QVariant celluleB2 = monTableau.read("B2");
qDebug() << "Entête :" << celluleA1.toString();
qDebug() << "Valeur numérique :" << celluleB2.toDouble();
}
return 0;
}
4. Mise en forme et mise en page
QXlsx permet de personnaliser l'apparence des cellules pour produire des documents professionnels.
Styles et formats
QXlsx::Format styleEntete;
styleEntete.setFontColor(Qt::darkGreen);
styleEntete.setFontBold(true);
styleEntete.setHorizontalAlignment(QXlsx::Format::AlignHCenter);
doc.write("A1", "Titre Stylisé", styleEntete);
Fusion de cellules et dimensions
// Fusionner de la cellule A2 à C3
doc.mergeCells("A2:C3");
doc.write("A2", "Zone Fusionnée");
// Ajuster la taille des colonnes et lignes
doc.setColumnWidth(1, 25); // Colonne A
doc.setRowHeight(1, 40); // Ligne 1
5. Insertion de graphiques
Il est possible d'intégrer des représentations visuelles directement liées aux données des cellules.
// Données pour le graphique
doc.write("E1", 10);
doc.write("E2", 25);
doc.write("F1", 15);
doc.write("F2", 30);
// Création d'un graphique linéaire
QXlsx::Chart *graphique = doc.insertChart(5, 5, QSize(400, 300));
graphique->setChartType(QXlsx::Chart::CT_Line);
graphique->addSeries(QXlsx::CellRange("E1:F2"));
6. Optimisation des performances
Lors de l'écriture massive de données (plusieurs milliers de lignes), l'appel répété à la méthode générique write() peut ralentir l'exécution car la bibliothèque doit détecter le type de donnée à chaque appel. Pour gagner en efficacité, il est recommandé d'utiliser les méthodes spécifiques de la feuille de calcul (Worksheet).
#include <QElapsedTimer>
void ecritureRapide(QXlsx::Document &doc) {
QXlsx::Worksheet *feuille = static_cast<QXlsx::Worksheet*>(doc.currentSheet());
QElapsedTimer chrono;
chrono.start();
for(int r = 1; r <= 50000; ++r) {
for(int c = 1; c <= 10; ++c) {
// Utilisation d'une méthode typée pour éviter les tests internes
feuille->writeString(r, c, "Donnée");
}
}
qDebug() << "Temps d'exécution (ms) :" << chrono.elapsed();
}
L'utilisation de méthodes typées comme writeString() ou writeNumeric() sur l'objet Worksheet permet généralement de réduire le temps de traitement de plus de 25% par rapport à la méthode standard.