QT操作Excel

发布于:2025-03-31 ⋅ 阅读:(19) ⋅ 点赞:(0)

        在 Qt 程序中操作 Excel 文件的常用方法有QAxObject、QtXlsx开源库、CSV格式等。

一、QAxObject

使用 QAxObject (仅限 Windows,需安装 Excel)

1、环境配置

  1. 添加依赖
    在 .pro 文件中添加 QT += axcontainer 以支持 ActiveX 组件‌。
  2. 包含头文件
    #include <QAxObject>
    #include <QVariant>

2、读取数据(每个单元格)

//创建 Excel 实例
QAxObject *excel = new QAxObject("Excel.Application");
excel->dynamicCall("SetVisible(bool)", false);  // 隐藏 Excel 界面‌

//打开工作簿和工作表
QAxObject *workbooks = excel->querySubObject("WorkBooks");
QAxObject *workbook = workbooks->querySubObject("Open(QString)", "C:/test.xlsx");
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1);  // 选择第一个工作表‌

//读取数据(逐个单元格读取‌)
QAxObject *cell = worksheet->querySubObject("Cells(int,int)", 1, 1);  // 读取 A1 单元格
QVariant value = cell->dynamicCall("Value()");
delete cell;  // 手动释放内存‌

//释放资源
range->deleteLater();
workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
delete excel;  // 必须显式释放资源‌

3、批量读取数据(N个单元格) 

//创建 Excel 实例
QAxObject *excel = new QAxObject("Excel.Application");
excel->dynamicCall("SetVisible(bool)", false);  // 隐藏 Excel 界面‌

//打开工作簿和工作表
QAxObject *workbooks = excel->querySubObject("WorkBooks");
QAxObject *workbook = workbooks->querySubObject("Open(QString)", "C:/test.xlsx");
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1);  // 选择第一个工作表‌

//读取数据(高效处理大量数据)
QAxObject *range = worksheet->querySubObject("Range(QString)", "B1:C10000");  // 读取 B1 到 C10000 区域
QVariant data = range->property("Value");  // 获取二维数组形式的数据‌
QVariantList rows = data.toList();
foreach (const QVariant &row, rows) {
    QVariantList cols = row.toList();
    // 处理每行数据
}


//释放资源
range->deleteLater();
workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
delete excel;  // 必须显式释放资源‌

4、写入数据

#include <QAxObject>

void WriteExcel() {
    // 启动 Excel 应用
    QAxObject* excel = new QAxObject("Excel.Application");
    excel->setProperty("Visible", true); // 设置可见
    
    // 创建工作簿和工作表
    QAxObject* workbooks = excel->querySubObject("Workbooks");
    QAxObject* workbook = workbooks->querySubObject("Add");
    QAxObject* sheets = workbook->querySubObject("Worksheets");
    QAxObject* sheet = sheets->querySubObject("Item(int)", 1); // 第一个工作表
    
    // 写入数据到 A1 单元格
    QAxObject* cell = sheet->querySubObject("Range(QVariant)", "A1");
    cell->setProperty("Value", "Qt 写入的数据");
    
    // 保存并退出
    workbook->dynamicCall("SaveAs(const QString&)", "C:\\测试.xlsx");
    excel->dynamicCall("Quit()");
}

5、高级功能

1)插入单张图片

1.1)通过 Shapes.AddPicture 方法插入图片,需指定坐标、尺寸和链接方式‌。
坐标可通过单元格的 Left 和 Top 属性动态获取‌。

void insertImage(QAxObject* worksheet, const QString& imagePath, int row, int col) {
    // 获取目标单元格的坐标
    QAxObject* range = worksheet->querySubObject("Cells(int, int)", row, col);
    double left = range->property("Left").toDouble();
    double top = range->property("Top").toDouble();

    // 插入图片并设置属性
    QAxObject* shapes = worksheet->querySubObject("Shapes");
    QAxObject* picture = shapes->querySubObject(
        "AddPicture(const QString&, bool, bool, double, double, double, double)",
        imagePath,    // 图片路径
        false,        // LinkToFile: 不链接到外部文件
        true,         // SaveWithDocument: 图片随文档保存
        left,         // 左侧位置(单元格左边界坐标)
        top,          // 顶部位置(单元格顶部坐标)
        100,          // 宽度(单位:磅)
        80            // 高度(单位:磅)
    );
    
    // 释放资源
    delete picture;
    delete shapes;
    delete range;
}

1.2)动态调整图片位置和大小‌
结合单元格范围计算坐标: