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
    评论
Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的功能和工具来简化应用程序的开发过程。在Qt中,可以使用Qt的QAxObject类来读取Excel文件内容。 以下是使用Qt读取Excel文件内容的步骤: 1. 首先,需要在Qt项目中包含Qt的相关头文件和库文件。可以在.pro文件中添加如下代码: ``` QT += axcontainer ``` 2. 创建一个QAxObject对象,并使用其setControl()方法设置为"Excel.Application",表示要操作Excel应用程序。 3. 调用QAxObject的dynamicCall()方法打开Excel文件,可以使用文件路径作为参数。 4. 获取Excel中的工作簿(Workbook)对象,可以使用QAxObject的querySubObject()方法获取。 5. 获取工作簿中的工作表(Worksheet)对象,可以使用QAxObject的querySubObject()方法获取。 6. 使用工作表对象的range()方法获取指定范围的单元格(Range)对象。 7. 使用Range对象的value()方法获取单元格的值。 下面是一个示例代码,演示了如何使用Qt读取Excel文件内容: ```cpp #include <QAxObject> void readExcelFile(const QString& filePath) { QAxObject* excel = new QAxObject("Excel.Application"); excel->dynamicCall("SetVisible(bool)", false); excel->setProperty("DisplayAlerts", false); QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filePath); QAxObject* worksheets = workbook->querySubObject("Worksheets"); QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1); // 第一个工作表 QAxObject* usedRange = worksheet->querySubObject("UsedRange"); QAxObject* rows = usedRange->querySubObject("Rows"); QAxObject* columns = usedRange->querySubObject("Columns"); int rowCount = rows->property("Count").toInt(); int columnCount = columns->property("Count").toInt(); for (int row = 1; row <= rowCount; ++row) { for (int column = 1; column <= columnCount; ++column) { QAxObject* cell = worksheet->querySubObject("Cells(int,int)", row, column); QVariant value = cell->property("Value"); qDebug() << value.toString(); delete cell; } } delete columns; delete rows; delete usedRange; delete worksheet; delete worksheets; workbook->dynamicCall("Close()"); delete workbook; delete workbooks; excel->dynamicCall("Quit()"); delete excel; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值