Qt 使用QtXlsx库处理Excel文件

发布于:2025-08-05 ⋅ 阅读:(14) ⋅ 点赞:(0)

在这里插入图片描述

一、QtXlsx库介绍

QtXlsx是一个基于Qt框架的开源库,用于读写Microsoft Excel文件(.xlsx格式)。它无需安装Microsoft Office或Excel组件,通过纯C++实现,支持跨平台(Windows/Linux/macOS)。以下是核心功能和使用方法:


1、核心功能

  1. 基本读写操作

    • 创建工作簿/工作表
    • 读写单元格数据(文本、数字、日期)
    • 支持公式计算(如$$ \text{SUM}(A1:A10) $$
    • 合并单元格
  2. 格式设置

    • 字体样式(大小、颜色、加粗)
    • 单元格填充(背景色、渐变)
    • 边框样式(实线、虚线)
    • 对齐方式(居中、自动换行)
  3. 高级功能

    • 插入图片(PNG/JPG)
    • 生成图表(柱状图、折线图)
    • 处理超链接
    • 加密/解密工作簿

2、安装方法

  1. 源码编译
    git clone https://github.com/QtExcel/QtXlsxWriter.git
    cd QtXlsxWriter
    qmake
    make
    make install
    
  2. Qt项目配置
    .pro文件中添加:
    include(/path/to/QtXlsxWriter/src/xlsx.pri)
    

3、基础代码示例

写入Excel文件

#include <QtXlsx>
int main() {
    QXlsx::Document xlsx;
    xlsx.write("A1", "Hello QtXlsx!");  // 写入文本
    xlsx.write("B1", 3.14);             // 写入数字
    xlsx.write("C1", QDate::currentDate()); // 写入日期
    xlsx.saveAs("Demo.xlsx");           // 保存文件
    return 0;
}

读取Excel文件

QXlsx::Document xlsx("Demo.xlsx");
QString text = xlsx.read("A1").toString(); // 读取A1单元格
double num = xlsx.read("B1").toDouble();    // 读取B1数字

4、格式设置示例

QXlsx::Format headerFormat;
headerFormat.setFontBold(true);
headerFormat.setFontColor(Qt::blue);
headerFormat.setPatternBackgroundColor(QColor("#FFFF00")); // 黄色背景

xlsx.write("A1", "Header", headerFormat);
xlsx.mergeCells("A1:C1"); // 合并单元格

5、注意事项

  1. 兼容性

    • 仅支持.xlsx格式(Excel 2007+),不支持旧版.xls
    • 部分复杂公式(如数组公式)可能无法解析。
  2. 性能优化

    • 大批量数据写入时,使用QXlsx::CellRange批量操作提升效率。
    • 避免频繁保存文件,应在完成所有操作后调用saveAs()
  3. 依赖项

    • 需Qt 5.0+,核心模块仅依赖QtCoreQtGui
  4. 常见问题

    • 中文乱码:确保文件编码为UTF-8,使用QString::fromUtf8()处理文本。
    • 图表渲染:需手动调用xlsx.insertChart()并指定数据范围。

6、应用场景

  • 自动化报表生成
  • 数据导出/导入工具
  • 科研数据处理(如导出 y = sin ⁡ ( x ) y = \sin(x) y=sin(x)计算结果)
  • 企业级数据管理系统

通过灵活的组合,QtXlsx可满足从基础数据导出到复杂格式报表的全场景需求,且无需额外依赖Office组件。

二、编译QtXlsx库

1、获取QtXlsx源代码

首先需要获取QtXlsx的源代码:
从GitHub克隆仓库:git clone https://github.com/dbzhang800/QtXlsxWriter.git
或者直接下载最新发布版本:https://github.com/dbzhang800/QtXlsxWriter/releases

2、使用qmake编译

1、打开Qt命令行工具(对应你使用的Qt版本)
2、进入QtXlsxWriter目录
3、执行以下命令:

qmake
make
make install

默认安装路径为/usr/local,你可以通过修改.pro文件中的target.path来更改安装路径。

3、使用CMake编译(推荐Qt5.15+)

mkdir build
cd build
cmake ..
make
sudo make install

三、在Qt项目中使用QtXlsx

1、在.pro文件中添加配置

# 添加包含路径和链接库
INCLUDEPATH += /usr/local/include/QtXlsx
LIBS += -L/usr/local/lib -lQtXlsx

# 对于Windows系统可能需要指定具体路径
win32 {
    INCLUDEPATH += C:/QtXlsx/include/QtXlsx
    LIBS += -LC:/QtXlsx/lib -lQtXlsx
}

2、基本使用示例

a、示例1:创建一个简单的Excel文件

#include <QtXlsx/QtXlsx>
#include <QDebug>

void createSimpleXlsx()
{
    QXlsx::Document xlsx;
    
    // 写入数据
    xlsx.write("A1", "Hello Qt!");
    xlsx.write("A2", 12345);
    xlsx.write("B1", QDate::currentDate());
    
    // 设置单元格样式
    QXlsx::Format format;
    format.setFontBold(true);
    format.setFontColor(Qt::blue);
    format.setPatternBackgroundColor(Qt::yellow);
    xlsx.write("A3", "Styled Text", format);
    
    // 保存文件
    if (xlsx.saveAs("Test.xlsx")) {
        qDebug() << "Excel文件创建成功!";
    } else {
        qDebug() << "保存失败!";
    }
}

b、示例2:读取Excel文件

void readXlsxFile(const QString &filename)
{
    QXlsx::Document xlsx(filename);
    
    if (!xlsx.load()) {
        qDebug() << "无法打开文件:" << filename;
        return;
    }
    
    // 读取单元格数据
    qDebug() << "A1内容:" << xlsx.read("A1");
    qDebug() << "A2内容:" << xlsx.read("A2").toInt();
    
    // 遍历工作表
    foreach(QString sheetName, xlsx.sheetNames()) {
        qDebug() << "工作表:" << sheetName;
        
        xlsx.selectSheet(sheetName);
        for (int row = 1; row <= 10; ++row) {
            for (int col = 1; col <= 5; ++col) {
                QVariant value = xlsx.cellAt(row, col);
                if (value.isValid()) {
                    qDebug() << QString("R%1C%2:").arg(row).arg(col) << value;
                }
            }
        }
    }
}

c、示例3:高级功能 - 添加图表

void createXlsxWithChart()
{
    QXlsx::Document xlsx;
    
    // 写入示例数据
    for (int i = 1; i <= 5; ++i) {
        xlsx.write(i, 1, i);     // A1-A5: 1-5
        xlsx.write(i, 2, i*i);   // B1-B5: 平方
    }
    
    // 创建图表
    QXlsx::Chart *chart = xlsx.insertChart(3, 4, QSize(300, 300));
    chart->setChartType(QXlsx::Chart::CT_Scatter);
    chart->addSeries(QXlsx::CellRange("A1:A5"), QXlsx::CellRange("B1:B5"));
    
    // 保存文件
    xlsx.saveAs("ChartExample.xlsx");
}

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到