Qt读取excel的代码,已经封装好了


核心代码:

QAxObject* excel = new QAxObject("Excel.Application");
    excel->setProperty("Visible", false);
    QAxObject* workbooks = excel->querySubObject("WorkBooks");
    workbooks->dynamicCall("Open (const QString&)", QString("c:\\副本1.xls")); //filename
    QAxObject* workbook = excel->querySubObject("ActiveWorkBook");
    QAxObject* worksheets = workbook->querySubObject("WorkSheets");
    QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", 1); //worksheet number
    QAxObject* usedrange = worksheet->querySubObject("UsedRange");
    QAxObject* rows = usedrange->querySubObject("Rows");
    QAxObject* columns = usedrange->querySubObject("Columns");
    int intRowStart = usedrange->property("Row").toInt();
    int intColStart = usedrange->property("Column").toInt();
    int intCols = columns->property("Count").toInt();
    int intRows = rows->property("Count").toInt();
    QAxObject * cell;
    for (int i = intRowStart; i < intRowStart + intRows; i++)
    {
        for (int j = intColStart; j < intColStart + intCols; j++)
        {
            cell = excel->querySubObject("Cells(Int, Int)", i, j );
            QVariant cellValue = cell->dynamicCall("value");

            cout << "Content " << cellValue.toString().toStdString() << endl; //value of the cell
        }
    }
    excel->setProperty("DisplayAlerts", 0);
    workbook->dynamicCall("Save(void)");
    workbook->dynamicCall("Close (Boolean)", false);
    excel->setProperty("DisplayAlerts",1);

    delete excel;


========================================

========================================


封装好的类如下:


--

readexcel.h

#ifndef READEXCEL_H
#define READEXCEL_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 


class Position
{
public:
    Position() {
        m_row = 0;
        m_col = 0;
    }

    Position(int row, int col) {
        m_row = row;
        m_col = col;
    }
public:
    int m_row;
    int m_col;

public:
    bool operator<(const Position & ct) const   // 两个const是必需的。
    {
        if (m_row < ct.m_row) {
            return true;
        } else if (m_row == ct.m_row) {
            if ( m_col < ct.m_col ) {
                return true;
            }
        }
        return false;
    }
};

class ReadExcel
{
public:
    ReadExcel();
    ~ReadExcel();

public:
    //打开excel文件
    bool openExcel(const QString& filename);
    //获取 指定单元格的数据
    std::string getCellData(const int& row, const int& col);
    //获取 行数,列数
    void getInfo(int& row, int& col) const;

private:
    void getALLfromExcel();

private:
    int m_row;    //行
    int m_col;    //列
    QString m_filename;
    QAxObject* m_excel;
    std::map m_mapdata;
    Position p;
};

#endif // READEXCEL_H


--

readexcel.cpp

#include "readexcel.h"
#include 
#include 

ReadExcel::ReadExcel()
    :m_row(0), m_col(0), m_filename("")
{
    m_excel = new QAxObject("Excel.Application");
}

ReadExcel::~ReadExcel()
{
    if (!m_mapdata.empty()) {
        m_mapdata.clear();
    }
    delete m_excel;
}

//
bool ReadExcel::openExcel(const QString &filename)
{
    if (filename.isEmpty()) {
        m_row = 0;
        m_col = 0;
        return false;
    }
    QFile file(filename);
    if (!file.exists()){
        m_row = 0;
        m_col = 0;
        return false;
    };
    if (!m_mapdata.empty()) {
        m_mapdata.clear();
    }
    m_filename = filename;
    try {
        getALLfromExcel();
    } catch (...) {
        return false;
    }

    return true;
}

void ReadExcel::getInfo(int &row, int &col) const
{
    row = m_row;
    col = m_col;
}

std::string ReadExcel::getCellData(const int &row, const int &col)
{
    if (row >= 1 && row <= m_row && col >= 1 && col <= m_col) {
        p.m_row = row;
        p.m_col = col;
        return m_mapdata[p];
    } else {
        return NULL;
    }
}

void ReadExcel::getALLfromExcel()
{
    m_excel->setProperty("Visible", 0);
    QAxObject* workbooks = m_excel->querySubObject("WorkBooks");
    workbooks->dynamicCall("Open (const QString&)", m_filename);
    QAxObject* workbook = m_excel->querySubObject("ActiveWorkBook");
    QAxObject* worksheets = workbook->querySubObject("WorkSheets");
    QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", 1); //worksheet number
    QAxObject* usedrange = worksheet->querySubObject("UsedRange");
    QAxObject* rows = usedrange->querySubObject("Rows");
    QAxObject* columns = usedrange->querySubObject("Columns");
    int intRowStart = usedrange->property("Row").toInt();
    int intColStart = usedrange->property("Column").toInt();
    int intCols = columns->property("Count").toInt();
    int intRows = rows->property("Count").toInt();
    m_row = intRows;
    m_col = intCols;
    QAxObject * cell;
    for (int i = intRowStart; i < intRowStart + intRows; i++)
    {
        for (int j = intColStart; j < intColStart + intCols; j++)
        {
            Position pos(i, j);
            cell = m_excel->querySubObject("Cells(Int, Int)", i, j );
            QVariant cellValue = cell->dynamicCall("value");
            m_mapdata.insert(std::pair(pos, cellValue.toString().toStdString()));
        }
    }
    m_excel->setProperty("DisplayAlerts", 0);
    workbook->dynamicCall("Save(void)");
    workbook->dynamicCall("Close (Boolean)", false);
    m_excel->setProperty("DisplayAlerts",1);
}







----




你可能感兴趣的:(Qt读取excel的代码,已经封装好了)