QT中将excel中的数据快速的读取出来显示在tablewidget中/将tablewidget中的数据快速的写入excel中

QT中将excel中的数据快速的读取出来显示在tablewidget中/将tablewidget中的数据快速的写入excel中
之前写的程序是将tablewiget中的数据取一个存一个在excel中,就会反复的调用querySubObject函数。数据量大的时候,整个界面直接卡住了,一直等他运行完,实在是太慢了。所以改成了现在这种批量导出的方法,多写了几行代码,但速度真的是快多了。感谢前辈们的分享,有需要参考的请仔细阅读注释。
1.QT中将excel中的数据快速的读取出来显示在tablewidget中

//从excel快速读取至tabel表
void MainWindow::excel_read(QString &path,QTableWidget *tablewidget)
{
    QAxObject excel("Excel.Application");
    //不对excel进行显示
    excel.setProperty("Visible",false);
    //添加新的工作簿
    QAxObject *workbooks = excel.querySubObject("WorkBooks");
    //打开已存在的工作簿
    workbooks->dynamicCall("Open (const QString&)",QString(path));
    //获取活动工作簿
    QAxObject *workbook = excel.querySubObject("ActiveWorkBook");
    //获取第一个工作表
    QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);

    QAxObject *usedrange=worksheet->querySubObject("UsedRange");//获取整个worksheet的范围
    QVariant cell=usedrange->dynamicCall("value");//将worksheet的全部内容存储在QVariant变量中
    QList<QList<QVariant>> ret;//将Qvariant转换为QList>
    Qvariant2listlistVariant(cell,ret);

    for(int i=0;i<tablewidget->rowCount();i++)
    {
        for(int j=0;j<tablewidget->columnCount();j++)
        {
            QString strVal=ret.at(i).at(j).toString();
            //将单元格的内容放置在table表中
            tablewidget->setItem(i,j,new QTableWidgetItem(strVal));
            tablewidget->item(i,j)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
        }
    }

    workbook->dynamicCall("Close()");      //关闭工作簿
    excel.dynamicCall("Quit()");           //关闭excel
}
//将Qvariant转换为QList>
void MainWindow::Qvariant2listlistVariant(const QVariant &var,QList<QList<QVariant>> &ret)
{
    QVariantList varrows=var.toList();
    if(varrows.isEmpty())
    {
        return;
    }
    else {
        const int rowcount=varrows.size();//行数
        QVariantList rowdata;
        for(int i=0;i<rowcount;i++)
        {
            rowdata=varrows[i].toList();//将每一行的值存入到list中
            ret.push_back(rowdata);
        }
    }
}

2.将tablewidget中的数据快速的写入excel中

//快速将数据写入excel中
void MainWindow::excel_write(QString &path, QTableWidget *tablewidget)
{
    QAxObject excel("Excel.Application");
    //不对excel进行显示
    excel.setProperty("Visible",false);
    //获取工作薄集合
    QAxObject *workbooks = excel.querySubObject("WorkBooks");
    //新建一个工作簿
    workbooks->dynamicCall("Add");
    //获取当前工作簿
    QAxObject *workbook = excel.querySubObject("ActiveWorkBook");
    //获取第一个工作表
    QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);

    //将tablewidget中的内容添加到excel中
    char m=0X40+tablewidget->columnCount();//0X41表示'A'
    QString range=QString("A1:%1%2").arg(m).arg(tablewidget->rowCount()+1);//根据tablewidget获得excel的范围
    QAxObject *cell=worksheet->querySubObject("Range(const QString&)",range);//设置excel的范围

    QList<QList<QVariant>> all_data;//用于存储tablewidgt中的所有数据
    for(int k=0;k<=tablewidget->rowCount();k++)
    {
        QList<QVariant> row_data;
        for(int j=0;j<tablewidget->columnCount();j++)
        {
            if(k==0)
            {
                row_data.append(tablewidget->horizontalHeaderItem(j)->text());//表头
            }
            else {
                row_data.append(tablewidget->item(k-1,j)->text());//数据
            }
        }
        all_data.append(row_data);
    }
    QVariant res;
    castListListVariant2Variant(all_data, res);//将QList > 转为QVariant
    cell->setProperty("Value",res);

    //将生成的excel文件保存到指定目录下
    workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(path));//转换地址的表示方式
    workbook->dynamicCall("Close()");      //关闭工作簿
    excel.dynamicCall("Quit()");           //关闭excel
}
//把QList > 转为QVariant,用于快速写入的
void MainWindow::castListListVariant2Variant(const QList<QList<QVariant> > &cells, QVariant &res)
{
    QVariantList vars;
    const int rows = cells.size();//获取行数
    for(int i=0;i<rows;++i)
    {
        vars.append(QVariant(cells[i]));//将list(i)添加到QVariantList中 QVariant(cells[i])强制转换
    }
    res = QVariant(vars);//强制转换
}

你可能感兴趣的:(QT学习)