QT 利用QAxObject大数据读写excel文件

本文分享了使用QT的QAxObject对象处理大数据Excel文件的经验,通过QAxObject实现快速读写,尤其在大量读写单元格时,通过QVariant提升效率,一万行数据仅需500毫秒。GitHub项目代码链接提供详细实现。
摘要由CSDN通过智能技术生成

       不知不觉已经加入CSDN很久了,但从来没有发过文章,最近开发了一个小工具踩了很多坑,主要是QT操作大数据Excel文件,现在和大家分享一下。

        查阅了大部分资料,大数据读写excel文件用QAxObject对象最快,借鉴了一些读写excel文件的demo,所以本文也采用了这种方法。

         对于代码的解释,大部分我都写在注释里了,有不明白或者建议的话,欢迎大家提出来。

         话不多说,上代码。

 

完整项目代码GitHub地址:https://github.com/ChinaSweetMilk/qtexcel

读写单元格时,常用以下这种方法:

// 根据行号、列号读取某个单元格内容
QAxObject* pCell = m_pWorksheet->querySubObject("Cells(int, int)", iirow, icolumn);
QString    strCell = pCell->property("Value").toString();

// 根据行列值读取某个单元格内容
QAxObject* pCell = pWorksheet->querySubObject("Range(QString)", strnumber);
QString    strCell = pCell->property("Value").toString();


// 根据行号、列号写入某个单元格内容
QAxObject* pCell = m_pWorksheet->querySubObject("Cells(int, int)", irow, icolumn);
QString    pCell->setProperty("Value", strvalue);

// 根据行列值读取某个单元格内容
QAxObject* pCell = m_pWorksheet->querySubObject("Range(QString)", strnumber);
QString    pCell->setProperty("Value", strvalue);

读取单个单元格内容时,可以使用以上方法,一秒大概能读写200行左右。但是需要大量读写单元格时,以上方法将会变得十分缓慢,所以这时需要用到QVariant,一次读取或写入整个工作表。采用以下方法,能将效率大大提高,一万行大概500毫秒。这个版本还没采用多线程读写,后面加入效率还可以提高。

 

以下是一次读取工作表全部内容的方法:

void ExcelOperator::readAll(QList<QList<QVariant> > &res)
{
    QVariant var;

    if (m_pWorksheet != NULL && ! m_pWorksheet->isNull())
    {
        // 获取该sheet的数据范围
        QAxObject * ax_usedRange = m_pWorksheet->querySubObject("UsedRange");
        if(NULL == ax_usedRange || ax_usedRange->isNull())
        {
            return;
        }

        // 获取该sheet的数据内容
        var = ax_usedRange->dynamicCall("Value");
        delete ax_usedRange;
    }

    this->castVariant2ListListVariant(var, res);

    return;
}

void ExcelOperator::castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res)
{
    QVariantList varRows = var.toList();

    if(varRows.isEmpty())
    {
        return;
    }

    const int rowCount = varRows.size();
    QVariantList rowData;

    for(int i=0;i<rowCount;++i)
    {
        rowData = varRows[i].toList();
        res.push_back(rowData);
    }
}
以下是一次写入工作表全部内容的方法:
bool ExcelOperator::writeCurrentSheet(const QList<QList<QVariant> > &cells)
{
    if(cells.size() <= 0)
        return false;

    if(NULL == this->m_pWorksheet || this->m_pWorksheet->isNull())
        return false;

    // 获取写入内容行数
    int irow = cells.size();
    // 获取写入内容列数
    int icol = cells.at(0).size();

    QString strRang;
    // 获取写入矩形内容最右边列标识
    convertToColName(icol, strRang);
    // 获取写入矩形内容最右边右下角单元格标识
    strRang += QString::number(irow);
    // 获取写入矩形内容写入范围
    strRang = "A2:" + strRang;

    qDebug()<< strRang;
    QAxObject *range = this->m_pWorksheet->querySubObject("Range(const QString&)", strRang);

    if(NULL == range || range->isNull())
    {
        return false;
    }

    bool succ = false;

    QVariant var;
    castListListVariant2Variant(cells,var);

    // 将数据写入到sheet
    succ = range->setProperty("Value", var);

    delete range;
    return succ;
}

void ExcelOperator::castListListVariant2Variant(const QList<QList<QVariant> > &listcells, QVariant &varres)
{
    QVa
  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt中使用QAxObject来创建Excel文件的步骤如下: 首先,确保你已经安装了Microsoft Office软件,并且拥有Excel的许可证。 然后,你需要在Qt项目中添加以下代码段: ```cpp #include <QAxObject> ... QAxObject* excel = new QAxObject("Excel.Application", this); // 创建Excel应用程序对象 excel->dynamicCall("SetVisible(bool)", false); // 设置Excel应用程序不可见 QAxObject* workbooks = excel->querySubObject("Workbooks"); // 获取工作簿集合对象 QAxObject* workbook = workbooks->querySubObject("Add"); // 创建新工作簿 QAxObject* worksheets = workbook->querySubObject("Worksheets"); // 获取工作表集合对象 QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1); // 获取第一个工作表 QAxObject* cells = worksheet->querySubObject("Cells"); // 获取单元格集合对象 // 在A1单元格中写入数据 QAxObject* cell = cells->querySubObject("Item(int,int)", 1, 1); cell->dynamicCall("SetValue(const QVariant&)", "Hello, Excel!"); workbook->dynamicCall("SaveAs(const QString&)", "C:/path/to/excel.xlsx"); // 保存工作簿 workbook->dynamicCall("Close()"); // 关闭工作簿 excel->dynamicCall("Quit()"); // 退出Excel应用程序 ``` 上述代码中,我们使用QAxObject来创建Excel应用程序对象、工作簿、工作表、单元格等。你可以根据需要进行更多的操作,比如设置单元格格式、写入更多数据等。 最后,记得在结束程序前释放资源,可以在程序退出时执行以下代码: ```cpp delete excel; ``` 请确保将代码中的文件路径替换为你希望保存Excel文件的路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值