第一步:确定存储路径,代码如下
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