第一步:確定存儲路徑,代碼如下
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