Manipulation de fichiers Excel avec la bibliothèque QXlsx sous Qt

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.

Étiquettes: Qt QXlsx C++ Excel libreoffice

Publié le 29 juillet à 04h12