Qt5.9.2读取excel

Qt5.9.2读取excel 转发请先留言

最近在学习Qt,想做个读写卡工具,卡号来自excel,相当于需要加载excel,这里记录一下读写excel的过程。

先上代码:
头文件代码如下:

#ifndef EXCELMANAGER_H
#define EXCELMANAGER_H

#include <QObject>
#include <QList>

struct ExcelRow
{
    //卡号码
    QString cardNum;

    //是否已经使用过了。

    bool usedStatus;
};

Q_DECLARE_METATYPE(ExcelRow);

class ExcelManager : public QObject
{
    Q_OBJECT
public:
    explicit ExcelManager(QObject *parent = nullptr);

public:

    QList<ExcelRow> ReadExcel(const QString &filePath);

    int RepairExcel(const QString &filePath,QString content,int row);//row 行 column 列

    int RepairExcelList(const QString &filePath,QList<QString> contents);

signals:
    void signalRefreshProBar(int);
    void signalShowProBar(bool);

public slots:
};

#endif // EXCELMANAGER_H

cpp代码如下:

#include "excelmanager.h"
#include <QFileDialog>
#include <QAxObject>
#include <QVariant>
#include <QList>
#include <QDebug>

#define EXCEL_USED "Used" // 卡号

ExcelManager::ExcelManager(QObject *parent) : QObject(parent)
{

}

int ExcelManager::RepairExcel(const QString &filePath,QString content,int row)//row 行 column 列
{
    QAxObject excel("Excel.Application"); //加载Excel驱动

    excel.setProperty("Visible", false); //不显示Excel界面,如果为true会看到启动的Excel界面

    excel.setProperty("DisplayAlerts", false);//不显示任何警告信息

    QAxObject* pWorkBooks = excel.querySubObject("WorkBooks");

    pWorkBooks->dynamicCall("Open (const QString&)", filePath);//打开指定文

    QAxObject* pWorkBook = excel.querySubObject("ActiveWorkBook");

    QAxObject* pWorkSheets = pWorkBook->querySubObject("Sheets");//获取工作表

    int nSheetCount = pWorkSheets->property("Count").toInt();  //获取工作表的数目

    if(nSheetCount > 0)
    {
        QAxObject* pWorkSheet = pWorkBook->querySubObject("Sheets(int)", 1);//获取第一张表

        //获取表中的数据到QVariant中
        QAxObject *usedRange=pWorkSheet->querySubObject("UsedRange");

        QVariant varData = usedRange->dynamicCall("Value2()");

        QVariantList var =varData.toList();

        QVariantList tmpTitle=var[1].toList();

        int tmpTitleIndex=-1;

        for(int i=0;i<tmpTitle.size();i++)
        {
            if(tmpTitle[i].toString()==EXCEL_USED)
            {
                tmpTitleIndex=i;

                break;
            }
        }

        if(tmpTitleIndex<0)
        {
            tmpTitleIndex=tmpTitle.size();

            pWorkSheet->querySubObject("Cells(int,int)",2,tmpTitleIndex)->setProperty("Value",EXCEL_USED);
        }

        pWorkSheet->querySubObject("Cells(int,int)",row,tmpTitleIndex+1)->setProperty("Value",content);// 设置单元格值

        pWorkBook->dynamicCall("Save()");

        pWorkBooks->dynamicCall("Close(Boolean)",false);

        excel.dynamicCall("Quit(void)");
        return 0;
    }

    pWorkBooks->dynamicCall("Close(Boolean)",false);

    excel.dynamicCall("Quit(void)");
    return -1;
}

int ExcelManager::RepairExcelList(const QString &filePath, QList<QString> contents)
{
    QAxObject excel("Excel.Application"); //加载Excel驱动

    excel.setProperty("Visible", false); //不显示Excel界面,如果为true会看到启动的Excel界面

    excel.setProperty("DisplayAlerts", false);//不显示任何警告信息

    QAxObject* pWorkBooks = excel.querySubObject("WorkBooks");

    pWorkBooks->dynamicCall("Open (const QString&)", filePath);//打开指定文

    QAxObject* pWorkBook = excel.querySubObject("ActiveWorkBook");

    QAxObject* pWorkSheets = pWorkBook->querySubObject("Sheets");//获取工作表

    int nSheetCount = pWorkSheets->property("Count").toInt();  //获取工作表的数目

    if(nSheetCount > 0)
    {
        QAxObject* pWorkSheet = pWorkBook->querySubObject("Sheets(int)", 1);//获取第一张表

        //获取表中的数据到QVariant中
        QAxObject *usedRange=pWorkSheet->querySubObject("UsedRange");

        QVariant varData = usedRange->dynamicCall("Value2()");

        QVariantList var =varData.toList();

        const int rowCount=var.size();

        QVariantList tmp;

        QVariantList tmpTitle;

        int tmpTitleIndex=-1;

        QString tmpStr;

        tmpTitle=var[1].toList();

        for(int i=0;i<tmpTitle.size();i++)
        {
            if(tmpTitle[i].toString()==EXCEL_USED)
            {
                tmpTitleIndex=i;

                break;
            }
        }

        if(tmpTitleIndex<0)
        {
            tmpTitleIndex=tmpTitle.size();

            pWorkSheet->querySubObject("Cells(int,int)",2,tmpTitleIndex+1)->setProperty("Value",EXCEL_USED);
        }

        emit signalShowProBar(true);

        for(int i=2;i<rowCount;++i)
        {
            int per=i*1.0/rowCount*100;

            emit signalRefreshProBar(per);

            tmp=var[i].toList();

            if(tmp.size()>0)
            {
                tmpStr=tmp[0].toString();

                if(contents.contains(tmpStr))
                {
                    //找到一样内容的栏
                    pWorkSheet->querySubObject("Cells(int,int)",i+1,tmpTitleIndex+1)->setProperty("Value","1");// 设置单元格值
                }
            }
        }

        pWorkBook->dynamicCall("Save()");

        pWorkBooks->dynamicCall("Close(Boolean)",false);

        excel.dynamicCall("Quit(void)");

        emit signalShowProBar(false);

        return 0;
    }

    pWorkBooks->dynamicCall("Close(Boolean)",false);

    excel.dynamicCall("Quit(void)");

    return -1;
}


QList<ExcelRow> ExcelManager::ReadExcel(const QString &filePath)
{
    QList<ExcelRow> result;

    QAxObject excel("Excel.Application"); //加载Excel驱动

    excel.setProperty("Visible", false); //不显示Excel界面,如果为true会看到启动的Excel界面

    excel.setProperty("DisplayAlerts", false);//不显示任何警告信息

    QAxObject* pWorkBooks = excel.querySubObject("WorkBooks");

    pWorkBooks->dynamicCall("Open (const QString&)", filePath);//打开指定文

    QAxObject* pWorkBook = excel.querySubObject("ActiveWorkBook");

    QAxObject* pWorkSheets = pWorkBook->querySubObject("Sheets");//获取工作表

    int nSheetCount = pWorkSheets->property("Count").toInt();  //获取工作表的数目

    if(nSheetCount > 0)
    {
        QAxObject* pWorkSheet = pWorkBook->querySubObject("Sheets(int)", 1);//获取第一张表

        //获取表中的数据到QVariant中
        QAxObject *usedRange=pWorkSheet->querySubObject("UsedRange");

        QVariant varData = usedRange->dynamicCall("Value2()");

        QVariantList var =varData.toList();

        const int rowCount=var.size();

        QVariantList tmp;

        QVariantList tmpTitle;

        int tmpTitleIndex=-1;

        QString tmpStr;

        tmpTitle=var[1].toList();

        for(int i=0;i<tmpTitle.size();i++)
        {
            if(tmpTitle[i].toString()==EXCEL_USED)
            {
                tmpTitleIndex=i;

                break;
            }
        }

        emit signalShowProBar(true);


        for(int i=2;i<rowCount;++i)
        {
            tmp=var[i].toList();

            if(tmp.size()>0)
            {
                int per=i*1.0/rowCount*100;

                //qDebug()<<per;

                emit signalRefreshProBar(per);

                tmpStr=tmp[0].toString();

//                qDebug()<<tmpStr;

                ExcelRow rowStruct;

                rowStruct.cardNum=tmpStr;

                QVariant tmpData=tmp[tmpTitleIndex];

                rowStruct.usedStatus=(tmpTitleIndex<0)?false:(tmp[tmpTitleIndex].toInt()==1);

                result.append(rowStruct);
            }
        }

        pWorkBook->dynamicCall("Save()");

        pWorkBooks->dynamicCall("Close(Boolean)",false);

        excel.dynamicCall("Quit(void)");

        emit signalShowProBar(false);

        return result;
    }
}

这个地方需要注意的是,关闭excel,如果你电脑上装了福昕这个pdf软件的话,最好卸载了,否则你会发现进程并没有关闭。

关于保存,注意两个参数的区别,一个是pWorkBook,一个是pWorkBooks,如果都协程pWorkBooks的话,保存不会成功的。

最后出一张界面设计图:
在这里插入图片描述
一张最后效果图。
在这里插入图片描述

就这样吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章