当前位置: 首页 > news >正文

QT操作Excel

        在 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)动态调整图片位置和大小‌
结合单元格范围计算坐标:


                
http://www.dtcms.com/a/99643.html

相关文章:

  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的缓存技术:使用 Redis 提升性能
  • NodeJs之http模块
  • 学成在线--day02
  • 深度学习篇---模型训练评估参数
  • Tabby二:使用笔记 - 保姆级教程
  • C#的CSV 在8859-1下中乱码和技巧
  • 猜猜我用的是哪个大模型?我的世界游戏界面简单的模拟效果
  • 网络华为HCIA+HCIP 策略路由,双点双向
  • OSPF练习
  • Let’s Encrypt 宣布推出短期证书与 IP 地址支持,推动 Web 安全迈向新高度
  • 无线通信技术(二):ITU、3GPP及传统波段对无线频谱的划分
  • AutoDev 2.0 正式发布:智能体 x 开源生态,AI 自动开发新标杆
  • 计算机组成原理笔记(六)——2.2机器数的定点表示和浮点表示
  • React Router精通:轻松创建动态单页应用
  • 动态IP:网络世界的“变色龙”如何改变你的在线体验?
  • 革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall
  • Baklib知识中台驱动智能架构升级
  • HTML布局
  • HTML文档流
  • Turtle事件处理(键盘与鼠标交互)
  • 基于单片机的智能家居设计(论文+源码)
  • RabbitMQ 技术详解:异步消息通信的核心原理与实践
  • wordpress的cookie理解
  • 【AI学习】机器学习算法
  • 内网渗透-ICMP隧道
  • javaScript Vue2的高级用法
  • 微型导轨和普通导轨有哪些区别?
  • 如何在ms-swift 微调训练deepseekvl2时使用sageattention
  • flutter优秀项目推荐
  • 【Spring Boot 与 Spring Cloud 深度 Mape 之五】微服务守门神:Spring Cloud Gateway 核心详解与实战