【QT】QtXlsx安装使用

QtXlsx介绍

QtXlsx是一个可以读取和写入Excel文件的库。它不需要Microsoft Excel,可以在Qt5支持的任何平台上使用。 这里一定是需要QT5支持的。

  • 生成一个新的 .xlsx 文件
  • 从现有的 .xlsx 文件中提取数据
  • 编辑现有的 .xlsx 文件

区别于QAxObject不同的是,QAxObject需要WPS或者Office控件的支持,而且读写有卡顿,若是电脑上安装了PDF工具,也有可能会在调用的时候出现一些非正常错误。

QtXlsx + Qt配置

  1. 安装perl

    这里选择官网下载安装即可(懒人安装方法,这里不列举或者腾讯应用中下载一个老版本)。
    官网地址:https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions

    安装是否成功,可以打开命令提示符(CMD)查看,如下图即安装OK:
    在这里插入图片描述
    如果提示找不到命令,则是未安装成功!

  2. QtXlsx源码下载

    源码地址:https://github.com/dbzhang800/qtxlsxwriter
    在这里插入图片描述
    下载之后得到如图所示文件
    在这里插入图片描述
    打开 Qt 5.14.2 (MinGW 7.3.0 32-bit)按照如下图示操作即可(根据自己Qt版本选择就行)。

  3. MinGW32配置
    进入刚才解压后的文件夹找到src如图:
    在这里插入图片描述
    切换到当前目录下面
    在这里插入图片描述
    执行如下指令即可。

qmake src.pro
mingw32-make
mingw32-make install

等待命令完成!

然后进入自己的项目.pro文件添加
QT += xlsx
下一步就是项目里面头文件导入
#include “xlsxdocument.h”
使用参考简单示例

简单使用示例

bool MainWindow::saveDataToExcel(const QString _strFilePath, QString _strFileName)
{
    
    
    // 检查路径下是否存在PGFile文件夹,存在则跳过,不存在就创建
    QString folderPath = _strFilePath + QString("/PGFile");
    qDebug()<< folderPath;

    // 创建QDir对象
    QDir dir;

    // 检查文件夹是否存在
    if(dir.exists(folderPath)) {
    
    
        qDebug()<< "文件夹已存在,跳过,请忽略错误";
    } else {
    
    
        // 尝试创建文件夹
        if(dir.mkpath(folderPath)) {
    
    
            // success
        } else {
    
    
            QMessageBox::information(this,QStringLiteral("错误提示"),QStringLiteral("PGFile文件夹创建失败"));
            return false;
        }
    }

    // 创建excel文件名
    QString excelName = folderPath + QString("/") + _strFileName;

#if 1   // 使用xlsx可以不依赖wps或者office,但是QAxObject依赖,并且很卡顿
    // 创建xlsx文件
    QXlsx::Document xlsx;

    RKQPoint writePoint;
    // 遍历需要写入的文件
    for(int i = 0; i < m_saveVec.size(); i++) {
    
    
        // 创建A行
        QString aString = QString("A%1").arg(i+1);
        xlsx.write(aString, m_saveVec[i].point_x);

        // 创建B行
        QString bString = QString("B%1").arg(i+1);
        xlsx.write(bString, m_saveVec[i].point_y);
    }

    // 写入excel文件
    xlsx.saveAs(excelName);
#else
    // 创建Excel应用对象
    QAxObject* excel = new QAxObject("Excel.Application");
    if(excel) {
    
    
        // 打开Excel文件
        QAxObject* workBooks = excel->querySubObject("workBooks");
        QAxObject* workBook = workBooks->querySubObject("Open(const QString&)",excelName);

        if(workBook) {
    
    
            // 获取第一个工作表
            QAxObject* workSheets = workBook->querySubObject("workSheets");
            QAxObject* workSheet = workSheets->querySubObject("Item(int)",1);

            if(workSheet) {
    
    
                // 将数据转换为QVariantList和QVariantMap
                QVariantList rows;
                for(int i = 0; i < m_saveVec.size(); ++i) {
    
    
                    QVariantMap row;
                    row["Gray"] = m_saveVec[i].point_x;
                    row["Power"] = m_saveVec[i].point_y;
                    rows.append(row);
                }

                // 写入数据到Excel表
                for(int n = 0; n < m_saveVec.size(); ++n) {
    
    
                    QAxObject* range = workSheet->querySubObject("Cells(int,int)",n+1, 1);
                    range->dynamicCall("SetValue(const QVariant&)",m_saveVec[n].point_x);
                    delete range;

                    range = workSheet->querySubObject("Cells(int,int)",n+1, 2);
                    range->dynamicCall("SetValue(const QVariant&)",m_saveVec[n].point_y);
                    delete range;
                }

                // 保存Excel文件
                workBook->dynamicCall("SaveAs(const QString&)",excelName);

                workSheet->dynamicCall("Activate()");
                workBook->dynamicCall("Close()");
                excel->dynamicCall("Quit()");

                delete workSheet;
                delete workSheets;
                delete workBook;
            }
        }

        delete workBooks;
        delete excel;
    }
#endif

    qDebug()<< "保存成功!";
    return true;
}

项目用到了QAxObject和QtXlsx,记录一下。

猜你喜欢

转载自blog.csdn.net/m0_43458204/article/details/131602395