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