Qt读取解析Excel(可以直接使用)

7 篇文章 3 订阅
这个博客主要介绍了如何在C++中利用Qt库的ActiveQt模块,通过COM接口与Excel交互,实现对Excel文件的读取、写入、获取工作表信息以及单元格内容等功能。内容涵盖打开、设置可见性、获取工作表、读取单元格数据、获取行列数、保存和关闭文件等操作。
摘要由CSDN通过智能技术生成

前提条件:需要在“.pro”文件中添加:QT += axcontainer

ExcelEngine.h

#ifndef EXCELENGINE_H
#define EXCELENGINE_H
#include <ActiveQt/QAxObject>
#include <Windows.h>
#include <QFile>
#include <QStringList>
#include <QString>

class ExcelEngine
{
public:
    ExcelEngine(void);
    ExcelEngine(const QString file_Name);
    ~ExcelEngine(void);
    
    // 打开Excel
    bool open(bool visible = false,bool display_Alerts = false);    

    // 通过Index获取sheet工作表
    QAxObject *getWorkSheet(int Sheet_Index);

    // 通过SheetName获取sheet工作表
    QAxObject *getWorkSheet(QString sheet_Name);

    // 通过索引值获取工作表(workSheet)的表明
    QString getWorkSheetNameByIndex(int inedx);

    // 获取WorkSheets工作表名列表
    QStringList getWorkSheetNameList(void);

    // 获取单元格内容
    QString getCellString(int workSheet_Index,int row,int column);

    // 获取单元格内容
    QString getCellString(QString workSheet_Name,int row,int column);

    // 获取workSheet的行数
    int getWorkSheetRows(QString workSheet_Name);

    // 获取workSheet的行数
    int getWorkSheetRows(int  workSheet_Index);

    // 获取workSheet的列数
    int getWorkSheetColumns(QString workSheet_Name);

    // 获取workSheet的列数
    int getWorkSheetColumns(int workSheet_Index);

    // 保存(写操作时需要要保存)
    bool save(void);

    // 关闭资源(释放资源)
    void close(void);

private:
    // 设置窗体是否可见
    bool setVisible(bool visible = false);

    // 释放资源
    void release(void);

private:
    bool m_IsOpened;

    // EXCEL程序指针
    QAxObject *m_Excel;

    // 工作簿集
    QAxObject *m_WorkBooks;

    // 当前活动的工作簿
    QAxObject *m_WorkBook;

    // 当前活动工作簿的工作表集(即所有的sheet表)
    QAxObject *m_WorkSheets;

    // 工作簿(m_WorkBook)中工作表(workSheet)的个数
    int m_WorkSheetCount;

    // 文件名
    QString m_FileName;

};

#endif // EXCELENGINE_H

ExcelEngine.cpp

#include "ExcelEngine.h"

ExcelEngine::ExcelEngine(void):
    m_IsOpened(false),
    m_Excel(nullptr),
    m_WorkBooks(nullptr),
    m_WorkBook(nullptr),
    m_WorkSheets(nullptr),
    m_WorkSheetCount(0),
    m_FileName()
{
    // 打开当前进程的COM并释放相关资源
    OleInitialize(0);
}

ExcelEngine::ExcelEngine(const QString file_Name):
    m_IsOpened(false),
    m_Excel(nullptr),
    m_WorkBooks(nullptr),
    m_WorkBook(nullptr),
    m_WorkSheets(nullptr),
    m_WorkSheetCount(0),
    m_FileName(file_Name)
{
    // 打开当前进程的COM并释放相关资源
    OleInitialize(0);
}

ExcelEngine::~ExcelEngine(void)
{
    release();
    // 关闭当前进程的COM并释放相关资源
    OleUninitialize();
}

// 打开Excel,如果不存在则创建
bool ExcelEngine::open(bool visible ,bool display_Alerts )
{
    // 检测文件名是否为空
    if (m_FileName.isEmpty())
    {
        // 返回异常(文件名不存在)
        return false;
    }

    QFile file(m_FileName);
		
    if (file.exists())
    {
        // 文件存在,但没有以只读状态打开成功
        if (!file.open(QIODevice::ReadOnly))
        {
            // 返回异常(文件存在但是未能以只读状态打开)
            return false;
        }

        file.close();
    }
    else
    {
        // 返回异常(文件不存在)
        return false;
    }

    // Excel的程序对象指针
    m_Excel = new QAxObject;

    // 链接Excel控件(用Office的Excel打开Excel文档)
    bool isOpened = m_Excel->setControl("Excel.Application");

    if (!isOpened)
    {
        // 用WPS打开Excel文件
        isOpened = m_Excel->setControl("ket.Application");

        // 如果Office和WPS都无法打开则返回false
        if (!isOpened)
        {
            // 返回异常(Excel和WPS打开excel文件均未成功)
            return false;
        }
    }

    // 不显示窗体
    m_Excel->dynamicCall("SetVisible(bool)", visible);

    // 不显示警告
    m_Excel->setProperty("DisplayAlerts", display_Alerts);

    // 获取Excel工作簿集合对象
    m_WorkBooks = m_Excel->querySubObject("WorkBooks");

    // 打开Excel文件
    m_WorkBooks->dynamicCall("Open(const QString &)",m_FileName);

    // 当前活动工作簿
    m_WorkBook = m_Excel->querySubObject("ActiveWorkBook");

    if (m_WorkBook == nullptr)
    {
        // 返回异常(当前活动工作簿打开失败)
        return false;
    }

    // 工作表集
    m_WorkSheets = m_WorkBook->querySubObject("WorkSheets");

    // 工作表的个数
    m_WorkSheetCount = m_WorkSheets->dynamicCall("Count").toInt();


    if(m_WorkSheets == nullptr)
    {
        // 返回异常(当前表格集WorkSheets不存在,打开失败!)
        return false;
    }

    m_IsOpened = true;
    return m_IsOpened;
}

// 设置窗体是否可见
bool ExcelEngine::setVisible(bool visible )
{
    if (m_Excel == nullptr)
    {
        return false;
    }
    else
    {
        m_Excel->dynamicCall("SetVisible(bool)", visible);
        return true;
    }
}

// 获取索引出的sheet(第一个就是1,不是0)
QAxObject *ExcelEngine::getWorkSheet(int sheet_Index)
{
    QAxObject *workSheet = m_WorkBook->querySubObject("Worksheets(int)",sheet_Index);
    return workSheet;
}

// 通过SheetName获取sheet
QAxObject *ExcelEngine::getWorkSheet(QString sheet_Name)
{
    QAxObject *workSheet = m_WorkBook->querySubObject("Worksheets(QString)",sheet_Name);
    return workSheet;
}

// 获取单元格内容
QString ExcelEngine::getCellString(int workSheet_Index,int row,int column)
{
    QAxObject *workSheet = getWorkSheet(workSheet_Index);

    if(workSheet == nullptr)
    {
        return "";
    }

    QAxObject *range = workSheet->querySubObject("Cell(int,int)",row,column);

    if(range == nullptr)
    {
        return "";
    }

    QString cellTdext = range->dynamicCall("Value2()").toString();

    return cellTdext;
}

// 获取单元格内容
QString ExcelEngine::getCellString(QString workSheet_Name,int row,int column)
{
    QAxObject *workSheet = getWorkSheet(workSheet_Name);

    if(workSheet == nullptr)
    {
        return "";
    }

    QAxObject *range = workSheet->querySubObject("Cells(int,int)",row,column);

    if(range == nullptr)
    {
        return "";
    }

    QString cellTdext = range->dynamicCall("Value2()").toString();

    return cellTdext;
}

// 获取workSheet的行数
int ExcelEngine::getWorkSheetRows(QString workSheet_Name)
{
    QAxObject *workSheet = getWorkSheet(workSheet_Name);

    if(workSheet == nullptr)
    {
        return 0;
    }

    // 获取权限
    QAxObject *usedrange = workSheet->querySubObject("Usedrange");
    int rows = usedrange->querySubObject("Rows")->property("Count").toInt();
    return rows;
}

// 获取workSheet的行数
int ExcelEngine::getWorkSheetRows(int  workSheet_Index)
{
    QAxObject *workSheet = getWorkSheet(workSheet_Index);

    if(workSheet == nullptr)
    {
        return 0;
    }

    // 获取workSheet表中的有效区域
    QAxObject *usedrange = workSheet->querySubObject("Usedrange");
    int rows = usedrange->querySubObject("Rows")->property("Count").toInt();
    return rows;
}

// 获取workSheet的列数
int ExcelEngine::getWorkSheetColumns(QString workSheet_Name)
{
    QAxObject *workSheet = getWorkSheet(workSheet_Name);

    if(workSheet == nullptr)
    {
        return 0;
    }

    // 获取workSheet表中的有效区域
    QAxObject *usedrange = workSheet->querySubObject("Usedrange");
    int columns = usedrange->querySubObject("Columns")->property("Count").toInt();
    return columns;
}

// 获取workSheet的列数
int ExcelEngine::getWorkSheetColumns(int workSheet_Index)
{
    QAxObject *workSheet = getWorkSheet(workSheet_Index);

    if(workSheet == nullptr)
    {
        return 0;
    }

    // 获取workSheet表中的有效区域
    QAxObject *usedrange = workSheet->querySubObject("Usedrange");
    int columns = usedrange->querySubObject("Columns")->property("Count").toInt();
    return columns;
}


// 通过索引值获取工作表(workSheet)的表名
QString ExcelEngine::getWorkSheetNameByIndex(int workSheet_Inedx)
{
    QAxObject *workSheet = getWorkSheet(workSheet_Inedx);

    if(workSheet == nullptr)
    {
        return "";
    }

    QString sheetName = workSheet->dynamicCall("Name").toString();
    return sheetName;
}

// 获取WorkSheets工作表的表名列表
QStringList ExcelEngine::getWorkSheetNameList(void)
{
    QStringList workSheetsList;

    for(int i = 1;i<=m_WorkSheetCount;i++)
    {
        QAxObject *workSheet = getWorkSheet(i);
        QString sheetName = workSheet->dynamicCall("Name").toString();

        workSheetsList.append(sheetName);
    }

    return workSheetsList;
}

// 保存(用于写操作)
bool ExcelEngine::save(void)
{
    if(!m_IsOpened)
    {
        return false;
    }

    QFile file(m_FileName);

    if(file.exists())
    {
        m_WorkBook->dynamicCall("Save()");
    }else
    {
        return false;
    }

    return true;
}

// 关闭资源(释放资源)
void ExcelEngine::close(void)
{
    release();   
}

// 释放资源
void ExcelEngine::release(void)
{
    m_IsOpened = false;

    if(m_WorkBook != nullptr)
    {
        m_WorkBook->dynamicCall("Close(QVariant)",0);
        delete m_WorkBook;
        m_WorkBook = nullptr;
    }

    if(m_WorkBooks != nullptr)
    {
        m_WorkBooks->dynamicCall("Close(QVariant)",0); // 报错(QAxBase: Error calling IDispatch member Close: Bad parameter count)
        delete m_WorkBooks;
        m_WorkBooks = nullptr;
    }

    if(m_Excel != nullptr)
    {
        m_Excel->setProperty("DisplayAlerts", false);
        m_Excel->dynamicCall("Quit()");
        delete m_Excel;
        m_Excel = nullptr;
    }
}

  • 20
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
### 回答1: 要解析Excel表格,您可以使用Python的pandas库。pandas提供了一组用于读取和操作表格数据的函数和数据结构。 以下是一个简单的示例,展示如何使用pandas从Excel表格中读取数据: ```python import pandas as pd # 读取Excel表格中的数据 df = pd.read_excel('example.xlsx') # 打印表格中的前5行 print(df.head()) ``` 在上面的示例中,我们使用了pandas的`read_excel`函数来读取名为`example.xlsx`的Excel表格。然后,我们使用`head`函数来打印表格中的前5行数据。 如果您需要更多的操作,例如选择特定的列或行,可以使用pandas的DataFrame数据结构来执行这些操作。以下是一个示例: ```python import pandas as pd # 读取Excel表格中的数据 df = pd.read_excel('example.xlsx') # 选择特定的列 column_names = ['Name', 'Age'] selected_columns = df[column_names] # 选择特定的行 selected_rows = df[df['Age'] > 30] # 打印所选的数据 print(selected_columns) print(selected_rows) ``` 在上面的示例中,我们首先使用`read_excel`函数来读取Excel表格中的数据。然后,我们使用DataFrame的索引功能来选择我们感兴趣的列和行。最后,我们使用`print`函数打印我们选择的数据。 这只是pandas的一小部分功能,如果您需要更多的操作,可以参考pandas的官方文档。 ### 回答2: QT是一个跨平台的开发框架,可以轻松解析Excel表格。我们可以使用QAxObject类和COM接口来完成这个任务。 首先,我们需要在项目中引入`#include <QAxObject>`来使用QAxObject类。然后,我们可以使用QAxObject类的`setControl()`方法来设置Excel应用程序的CLSID,用`new`关键字创建一个QAxObject对象。 接下来,我们可以使用QAxObject类的`setProperty()`方法来设置Excel应用程序的属性。例如,可以使用`setProperty("Visible", false)`将Excel应用程序设置为不可见状态,以便在后台解析Excel表格。然后,可以使用`dynamicCall()`方法调用Excel应用程序的`Workbooks`对象,通过`Open()`方法打开Excel表格。 打开表格后,我们可以使用QAxObject类的`querySubObject()`方法获取`Sheets`对象,并使用`dynamicCall()`方法调用该对象的`Item()`方法,通过索引获取指定的工作表。 获取工作表后,我们可以使用QAxObject类的`querySubObject()`方法获取`Range`对象,并使用`dynamicCall()`方法调用该对象的`Value()`方法,将表格数据存储在一个二维QVariant类型的数组中。 最后,我们可以通过循环遍历二维数组,将每个单元格的值提取出来并进行处理。 完成Excel表格解析后,我们可以调用QAxObject类的`dynamicCall()`方法调用Excel应用程序的`Quit()`方法,关闭Excel应用程序。 总的来说,使用QT解析Excel表格可以很方便地处理表格数据,提取所需信息,并进行相应的操作。QT的跨平台性使得我们可以在不同操作系统上使用相同的代码来解析Excel表格,提高了开发效率。 ### 回答3: QT是一种开发框架,它提供了许多功能模块和工具,用于创建高性能、跨平台的应用程序。其中一个常用的功能是解析Excel表格。 在QT中,我们可以使用QAxObject类来实现解析Excel表格的功能。首先,我们需要通过QAxObject的构造函数创建一个Excel应用程序的实例。然后,我们可以使用该实例来打开一个Excel文件,通过QAxObject的setProperty函数来设置打开文件的路径。接下来,我们可以使用QAxObject的querySubObject函数来获取工作簿对象,并使用工作簿对象获取工作表对象。然后,我们可以使用工作表对象的range函数获取单元格区域,并使用QAxObject的dynamicCall函数来获取单元格的值。 例如,以下是一个使用QT解析Excel表格的简单示例代码: ```cpp #include <QAxObject> #include <QDebug> int main() { QAxObject* excel = new QAxObject("Excel.Application"); excel->dynamicCall("SetVisible(bool)", false); excel->setProperty("DisplayAlerts", false); QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", "C:/path/to/excel/file.xlsx"); QAxObject* worksheets = workbook->querySubObject("Worksheets"); QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1); QAxObject* range = worksheet->querySubObject("Range(const QString&)", "A1:B2"); QVariant value = range->dynamicCall("Value"); qDebug() << value; workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); delete excel; return 0; } ``` 上述代码首先创建一个Excel应用程序的实例,并设置不显示警告对话框。然后,打开一个Excel文件,并获取第一个工作表。接下来,通过指定单元格区域"A1:B2"来获取该区域的值,并将结果打印输出。 通过上述示例代码,我们可以看到,使用QT解析Excel表格是相对简单的。它提供了许多灵活而强大的功能,可以帮助我们轻松地处理和分析Excel表格中的数据。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘猫掸子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值