Qt5对Excel表格简单、高效处理方法

2021年9月30日 26点热度 0条评论 来源: lesliefish

由于经常用Qt对Excel中的一些数据进行处理,最终综合出一套简单好用的读、写数据方案。
主要代码如下(完整测试项目地址见本文最下方):

bool ExcelManger::Test(QString &path)
{
    QAxObject *excel = NULL;    //本例中,excel设定为Excel文件的操作对象
    QAxObject *workbooks = NULL;
    QAxObject *workbook = NULL;  //Excel操作对象
    excel = new QAxObject("Excel.Application");
    excel->dynamicCall("SetVisible(bool)", true); //true 表示操作文件时可见,false表示为不可见
    workbooks = excel->querySubObject("WorkBooks");


    //————————————————按文件路径打开文件————————————————————
    workbook = workbooks->querySubObject("Open(QString&)", path);
    // 获取打开的excel文件中所有的工作sheet
    QAxObject * worksheets = workbook->querySubObject("WorkSheets");


    //—————————————————Excel文件中表的个数:——————————————————
    int iWorkSheet = worksheets->property("Count").toInt();
    qDebug() << QString("Excel文件中表的个数: %1").arg(QString::number(iWorkSheet));


    // ————————————————获取第n个工作表 querySubObject("Item(int)", n);——————————
    QAxObject * worksheet = worksheets->querySubObject("Item(int)", 1);//本例获取第一个,最后参数填1


    //—————————获取该sheet的数据范围(可以理解为有数据的矩形区域)————
    QAxObject * usedrange = worksheet->querySubObject("UsedRange");

    //———————————————————获取行数———————————————
    QAxObject * rows = usedrange->querySubObject("Rows");
    int iRows = rows->property("Count").toInt();
    qDebug() << QString("行数为: %1").arg(QString::number(iRows));

    //————————————获取列数—————————
    QAxObject * columns = usedrange->querySubObject("Columns");
    int iColumns = columns->property("Count").toInt();
    qDebug() << QString("列数为: %1").arg(QString::number(iColumns));

    //————————数据的起始行———
    int iStartRow = rows->property("Row").toInt();
    qDebug() << QString("起始行为: %1").arg(QString::number(iStartRow));

    //————————数据的起始列————————————
    int iColumn = columns->property("Column").toInt();
    qDebug() << QString("起始列为: %1").arg(QString::number(iColumn));


    //——————————————读出数据—————————————
    //获取第i行第j列的数据
    //假如是第6行,第6列 对应表中F列6行,即F6
    QAxObject *range1 = worksheet->querySubObject("Range(QString)", "F6:F6");
    QString strRow6Col6 = "";
    strRow6Col6 = range1->property("Value").toString();
    qDebug() << "第6行,第6列的数据为:" + strRow6Col6;

    //列的转换函数如下地址,第6列转为F列,第29列转为AC列
    http://blog.csdn.net/y396397735/article/details/78312124


    //—————————————写入数据—————————————
    //获取F6的位置
    QAxObject *range2 = worksheet->querySubObject("Range(QString)", "F6:F6");
    //写入数据, 第6行,第6列
    range2->setProperty("Value", "中共十九大");
    QString newStr = "";
    newStr = range2->property("Value").toString();
    qDebug() << "写入数据后,第6行,第6列的数据为:" + newStr;

    //!!!!!!!一定要记得close,不然系统进程里会出现n个EXCEL.EXE进程
    workbook->dynamicCall("Save()");
    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");
    if (excel)
    {
        delete excel;
        excel = NULL;
    }

    return true;
}

根据自己的操作实践结果:
处理前:

处理后:

应用程序输出:

"Excel文件中表的个数: 3"
"行数为: 9"
"列数为: 5"
"起始行为: 5"
"起始列为: 2"
"第6行,第6列的数据为:66666"
"写入数据后,第6行,第6列的数据为:中共十九大"

完整项目、测试文件路径地址:
https://github.com/lesliefish/Qt/tree/master/QtExcel

    原文作者:lesliefish
    原文地址: https://blog.csdn.net/y396397735/article/details/78306550
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。