QT读写Excel

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

最近学习QT发现QT中并没有封装直接读写Excel的库,但是有很多三方库以及一个官方库QAxObject。就根据查阅的资料写了一个简单的操作excel的函数


提示:以下是本篇文章正文内容,下面案例可供参考

一、配置 cmakelists.txt

由于我用的是QT 6.5.2,使用QAxObject需要对项目文件进行配置。相关配置如下:

// 使用 find_package 找到 AxContainer 模块
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets AxContainer)    
// 链接 ActiveX 模块
target_link_libraries(demo4 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::AxContainer)  

2.读Excel

代码如下(示例):

QString OperateExcel::ReadExcel(uint line, uint row)    // 读excel数据,并转换为字符串
{
    QAxObject *excel = new QAxObject(this); //建立excel操作对象
    excel->setControl("Excel.Application"); //连接Excel控件
    excel->setProperty("Visible", false); // 显示窗体
    excel->setProperty("DisplayAlerts", false);//显示警告
    QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿
    QString str = QFileDialog::getOpenFileName(this,"打开",
                                QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),"Excel 文件(*.xls *.xlsx)");  // 获取打开文件地址
    workbooks->dynamicCall("Open(const QString&)", str);//打开刚才选定的excel

    QAxObject *workbook = excel->querySubObject("ActiveWorkBook");  // 获取当前活动的工作蒲对象
    QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);   // 获取工作簿中的第一个工作表对象
    QAxObject *usedRange = worksheet->querySubObject("UsedRange");  // 获取工作表中使用的区域对象
    QVariant var = usedRange->dynamicCall("Value"); //将所有的数据读取刀QVariant容器中保存
    delete usedRange;   // 释放内存
    QVariantList array = var.toList();  // 将容器中数据转换为数组,行数据
    workbooks->dynamicCall("Close()"); //关闭工作簿
    excel->dynamicCall("Quit()"); //退出进程
    QList<QVariant> dataList = array[line].toList();    // 列数据
    QString data = dataList[row].toString();
    qDebug() << line<< "行"<< row<< "列"<< ":"<< data;

    return data;
}

3.写Excel


void OperateExcel::WriteExcel(const QString& path, const QString& data, int line, int row)
{
    QAxObject* excel = new QAxObject("Excel.Application"); // 创建 Excel 应用程序对象
    excel->setControl("Excel.Application"); // 设置控制对象为 Excel 应用程序
    excel->setProperty("Visible", false);
    excel->setProperty("DisplayAlerts", false);
    QAxObject* workbooks = excel->querySubObject("WorkBooks"); // 获取工作簿集合
    QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", path); // 打开指定路径的工作簿
    QAxObject* sheet = workbook->querySubObject("WorkSheets(int)", 1); // 获取工作表

    // 获取要写入数据的单元格范围
    QString cellRange = QString("%1%2").arg(QChar('A' + row - 1)).arg(line);
    QAxObject* cell = sheet->querySubObject("Range(const QString&)", cellRange);

    if (NULL == cell || cell->isNull()) // 检查范围是否有效
    {
        delete cell;
        delete sheet;
        delete workbook;
        delete workbooks;
        delete excel;
        return;
    }

    cell->dynamicCall("SetValue(const QVariant&)", QVariant(data)); // 将数据写入单元格
    workbook->dynamicCall("Save");  // 保存工作簿
    workbook->dynamicCall("Close (Boolean)", false); // 关闭工作簿
    excel->dynamicCall("Quit(void)"); // 关闭 Excel 应用程序

    // 释放内存
    delete cell;
    delete sheet;
    delete workbook;
    delete workbooks;
    delete excel;
}

总结

由于也是最近开始学习QT,同时也学习一下C++,肯定有不对的地方。大家可以一起交流

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值