Qt保存数据到Excel改进方法


第一步:确定存储路径,代码如下

QString fileName = QFileDialog::getSaveFileName(QWidget *parent,"保存",
                        QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)+"xxxxxxx”,"Excel 文件(*.xls *.xlsx)");

其中第三个参数表示存储路径+文件名称,可以只写其中一个,当只写文件名的时候,文件会保存到默认文件夹中。

第二步:新建工作簿,代码如下

if(fileName!="")
{
        QAxObject *excel = new QAxObject;
        excel->setControl("Excel.APPlication");

        excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体
        excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
        QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合
        workbooks->dynamicCall("Add");//新建一个工作簿
        QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿
        QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
     QAxObject *cell;//表格 }

第三步:设置表格中的内容,代码如下

            QString str="通道"+QString::number(i+1);
            cell=worksheet->querySubObject("Cells(int,int)", 1, 3*i+2);
            cell->dynamicCall("SetValue(const QString&)", str);

可以通过worksheet->querySubObject("Cells(int, int)", row, col)来给表格设置内容,不过这种方法效率很低,而且慢,下面将介绍一种批量快速添加数据的方法

QAxObject *range=worksheet->querySubObject("Range(const QString&)","A1:C100");

这里我们首先需要确定需要添加数据的范围,例如"A1:C100"表示在Excel中,从表格A1开始添加数据,一直添加到表格C100为止(3*100个数据)。

在确定了range大小之后,我们还需要一个QVariant对象来做参数。因此我们需要将模型中的数据保存到QVariant对象中。

一共分两步1.将模型中的数据读取出来,存放到QList<QList<QVariant> >中,在将QList<QList<QVariant> >转换为QVariant,代码如下

QVariant Widget::datatovariant(WaveModel *model)
{
    QList<QList<QVariant> > datas;
    QVariantList vars;
    QModelIndex index;
    int rownum,colnum,num;//模型行数列数以及模型的某个位置的值
    rownum=model->rowCount();
    colnum=model->columnCount();
    for(int i=0;i<rownum;i++)
    {
        QList<QVariant> row;
        for(int j=0; j<colnum; j++)
        {
            index=model->index(i,j,QModelIndex());
            num=model->data(index,Qt::DisplayRole).toInt();
            row.append(num);
        }
        datas.append(row);
    }//通过循环将model的数据存入到QList<QList<QVariant> > datas,然后再转换为QVariant

    for(int i=0 ; i<rownum; i++)
    {
        vars.append(QVariant(datas[i]));
    }

    return QVariant(vars);
}

上面这个函数将model中的数据保存到QVariant对象中。

第四步:批量添加数据到excel,代码如下

        if(ui->checkBox_1->isChecked())
        {
            QVariant var=datatovariant(model1);
            int i = model1->rowCount();
            QString str="A3:C"+QString::number(2+i);
            QAxObject *range=worksheet->querySubObject("Range(const QString&)",str);
            range->setProperty("Value",var);//批量添加数据
       //上面这一行代码只支持office的数据保存,如果想要同时支持office和wps,则需要对参数做如下修改
       //range->setProperty("Value2",var);

       range->querySubObject("Interior")->setProperty("Color",QColor(255,250,130));//批量设置表格背景色 }

第五步:在数据添加好了之后,对excel进行保存,代码如下

        workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(fileName));//保存至fileName
        workbook->dynamicCall("Close()");//关闭工作簿
        excel->dynamicCall("Quit()");//关闭excel
        delete excel;
        excel=nullptr;
        QMessageBox::information(this,tr("提示"),tr("数据已保存"));

至此,保存数据到excel基本结束,其中,最重要的过程就是将数据保存到QVariant里面,因此,只要完成了这一步,几乎可以将任何数据保存到excel中。

 

补充:https://blog.csdn.net/weixin_43712770/article/details/103479749


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM