注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

Qt下读取excel文件  

2017-05-11 03:10:50|  分类: QT5.x与QML |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
xx.pro:
QT += axcontainer #//使用axcontainer时;

ReadExcelClass.h =>

#ifndef READEXCELCLASS_H
#define READEXCELCLASS_H

#include <QVariant>
#include <QString>

struct SheetData
{
    SheetData():Index(0),Name(""){}
    SheetData(uint index,const QString& name)
    {
        Index = index; Name = name;
    }
    uint    Index;
    QString Name;
};
struct ExcelData
{
    ExcelData():Row(0),Col(0),Data(QVariant()){}
    ExcelData(uint row,uint col,const QVariant& data)
    {
        Row = row; Col = col; Data = data;
    }
    uint Row;
    uint Col;
    QVariant Data;
};

class QAxObject;
class ReadExcelClass
{
public:
    ReadExcelClass();
    ~ReadExcelClass();

public: //about excel;
    bool                LoadExcelFile(const QString& file); //加载excel文件;
    bool                IsExcelEmpty(); //excel文件是否为空;
    int                 Count(); //excel文件中有多少个sheet;
    void                Clear(); //清空excel对象;
    QList<SheetData>    AllSheets(); //获取所有sheet的名称;
public: //about sheet;
    bool                IsSheetEmpty(uint sheetIndex); //判断sheet是否为空;
    int                 Rows(uint sheetIndex); //sheetIndex从0开始,表示第几个工作表(sheet)共有多少行;
    int                 Columns(uint sheetIndex); //sheetIndex从0开始,表示第几个工作表(sheet)共有多少列;
    QList<ExcelData>    ReadAll(uint sheetIndex);//sheetIndex从0开始;表示读取第几个表单/工作表(sheet)的所有内容;
private:
    QAxObject*      m_ExcelObject; //excel对象;
};

#endif // READEXCELCLASS_H


ReadExcelClass.cpp =>
#include "ReadExcelClass.h"

#include <QString>
#include <QMessageBox>
#include <QFileInfo>
#include <QAxObject>

ReadExcelClass::ReadExcelClass():m_ExcelObject(NULL){}

ReadExcelClass::~ReadExcelClass()
{
    if(m_ExcelObject)
    {
        m_ExcelObject->clear();
        m_ExcelObject->deleteLater();
    }
}

bool ReadExcelClass::LoadExcelFile(const QString &file)
{
    QFileInfo info(file);
    if(info.exists() && info.isFile())
    {
        QAxObject* excel = new QAxObject("Excel.Application");
        if(!excel)
        {
            QMessageBox::critical(NULL,"Err","excel loss object!");
            return false;
        }

        excel->dynamicCall("SetVisible(bool)",false);
        QAxObject* workbooks = excel->querySubObject("WorkBooks");
        m_ExcelObject = workbooks->querySubObject("Open(QString,QVariant)",file);
        if(!m_ExcelObject)
        {
            QMessageBox::critical(NULL,"Err","open excel file failed!");
            return false;
        }
        return true;
    }
    return false;
}

bool ReadExcelClass::IsExcelEmpty()
{
    if(m_ExcelObject)
    {
        return m_ExcelObject->isNull();
    }
    return true;
}

int ReadExcelClass::Count()
{
    if(m_ExcelObject)
    {
        QAxObject* sheets = m_ExcelObject->querySubObject("Sheets");
        if(sheets)
            return sheets->property("Count").toInt();
    }
    return 0;
}

void ReadExcelClass::Clear()
{
    if(m_ExcelObject)
    {
        m_ExcelObject->clear();
    }
}

QList<SheetData> ReadExcelClass::AllSheets()
{
    QList<SheetData> resList;
    if(m_ExcelObject)
    {
        int nCount = Count();
        for(int i=0;i<nCount;i++)
        {
            QAxObject* sheet = m_ExcelObject->querySubObject("WorkSheets(int)",i+1);
            if(sheet)
            {
                QString name = sheet->property("Name").toString();
                resList.append(SheetData(i,name));
            }
        }
    }
    return resList;
}

bool ReadExcelClass::IsSheetEmpty(uint sheetIndex)
{
    if(m_ExcelObject)
    {
        QAxObject* sheet = m_ExcelObject->querySubObject("WorkSheets(int)",sheetIndex+1);
        if(!sheet)
            return true;
        else
            return sheet->isNull();
    }
    return true;
}

int ReadExcelClass::Rows(uint sheetIndex)
{
    if(m_ExcelObject)
    {
        QAxObject* sheet = m_ExcelObject->querySubObject("WorkSheets(int)",sheetIndex+1); //工作表第一个从1开始算起,为统一编程,sheetIndex从0开始,下同;
        if(sheet && !sheet->isNull())
        {
            QAxObject* rows = NULL;
            QAxObject* usedrange = sheet->querySubObject("UsedRange");//获取该sheet的使用范围对象;
            if(usedrange && (rows=usedrange->querySubObject("Rows")) )
                return rows->property("Count").toInt();
        }
    }
    return 0;
}

int ReadExcelClass::Columns(uint sheetIndex)
{
    if(m_ExcelObject)
    {
        QAxObject* sheet = m_ExcelObject->querySubObject("WorkSheets(int)",sheetIndex+1);
        if(sheet && !sheet->isNull())
        {
            QAxObject* columns = NULL;
            QAxObject* usedRange = sheet->querySubObject("UsedRange");//获取该sheet的使用范围对象;
            if(usedRange && (columns=usedRange->querySubObject("Columns")) )
                return columns->property("Count").toInt();
        }
    }
    return 0;
}

QList<ExcelData> ReadExcelClass::ReadAll(uint sheetIndex)
{
    QList<ExcelData> resList;
    QAxObject *sheet = NULL;
    if(m_ExcelObject && (sheet=m_ExcelObject->querySubObject("WorkSheets(int)",sheetIndex+1)) )
    {
        QAxObject *usedrange = NULL, *rows = NULL, *columns = NULL;
        if ( (usedrange = sheet->querySubObject("UsedRange"))
            && (rows = usedrange->querySubObject("Rows"))
            && (columns = usedrange->querySubObject("Columns")) )
        {
            int nRowBeg = usedrange->property("Row").toInt(); //工作表中的行起始以1开始算起;
            int nColBeg = usedrange->property("Column").toInt(); //工作表中的列起始以1开始算起;
            int nRowCount = rows->property("Count").toInt();
            int nColCount = columns->property("Count").toInt();
            if(nRowCount>0 && nColCount>0 && nRowBeg>0 && nColBeg>0 )
            {
                for(int i=nRowBeg;i<nRowBeg+nRowCount;i++)
                {
                    for(int j=nColBeg;j<nColBeg+nColCount;j++)
                    {
                        QVariant data = sheet->querySubObject("Cells(int,int)",i,j)->dynamicCall("Value2()");
                        resList.append(ExcelData(i-1,j-1,data)); //工作表中的行列起始以1开始算起,为统一编程,行列均以0开始标记;
                    }
                }
            }
        }
    }
    return resList;
}
  评论这张
 
阅读(6)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017