Qt 将TableWidget表格数据保存为Excle、txt的方法

在我刚接触这一块时,下面这篇博文给了我很大帮助,在此表示感谢。

参考博文:https://blog.csdn.net/LJianDong/article/details/84565194

.pro文件添加

QT       += axcontainer

添加头文件

#include <QDesktopServices> 
#include <QUrl>       

1.保存为excel

void MainWindow::on_saveDataBtn_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(this,tr("Excle file"),QString("./test.xls"),tr("Excel Files(*.xls)"));    //设置保存的文件名
    if(fileName != NULL)
    {
        QAxObject *excel = new QAxObject;
        if(excel->setControl("Excel.Application"))
        {
            excel->dynamicCall("SetVisible (bool Visible)",false);
            excel->setProperty("DisplayAlerts",false);
            QAxObject *workbooks = excel->querySubObject("WorkBooks");            //获取工作簿集合
            workbooks->dynamicCall("Add");                                        //新建一个工作簿
            QAxObject *workbook = excel->querySubObject("ActiveWorkBook");        //获取当前工作簿
            QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
            QAxObject *cell;
            int rowCount = ui->tableWidget->rowCount();
            int columnCount = ui->tableWidget->columnCount();

            /*添加Excel表头数据*/
            for(int i = 1; i <= columnCount ; i++)
            {
                cell = worksheet->querySubObject("Cells(int,int)", 1, i);
                cell->setProperty("RowHeight", 40);
                cell->dynamicCall("SetValue(const QString&)", ui->tableWidget->horizontalHeaderItem(i-1)->data(0).toString());
            }
            /*将form列表中的数据依此保存到Excel文件中*/
            for(int j = 2; j <= rowCount + 1;j++)
            {
                for(int k = 1;k <= ui->tableWidget->columnCount();k++)
                {
                    cell = worksheet->querySubObject("Cells(int,int)", j, k);
                    cell->dynamicCall("SetValue(const QString&)",ui->tableWidget->item(j-2,k-1)->text()+ "\t");
                }
            }


 //以下是批量保存(当数据量较大时可以使用下面的方法,亲测4万个数据可以秒存)
 /*
            QList<QList<QVariant> > datas;
            QVariantList vars;

            for (int i = 2; i <= rowCount + 1; i++)
            {
                QList<QVariant> row;
                for(int j = 1; j <= columnCount; j++)
                {
                    row.append(ui->tableWidget->item(i - 2, j - 1)->text());
                    ui->progressBar->setValue(i);
                }
                datas.append(row);
            }

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

            QAxObject* range;
            QString asd = "A2:D" + QString::number(rowCount + 1); // A2:D100表示存储范围为A2到D100加1是表头占了一行
            //获取范围
            range = worksheet->querySubObject("Range(const QString&)", asd);
            //批量写入
            //range->dynamicCall("Value2", QVariant(vars));
            range->setProperty("Value2", QVariant(vars));                       //Value: 只支持存为office数据;Value2:支持office和WPS数据

            //设置字体大小
            //range->querySubObject("Font")->setProperty("Size", 30);
            delete range;
*/

            /*将生成的Excel文件保存到指定目录下*/
            workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(fileName)); //保存至fileName
            workbook->dynamicCall("Close()");                                                   //关闭工作簿
            excel->dynamicCall("Quit()");                                                       //关闭excel
            delete excel;
            excel = NULL;

            if (QMessageBox::question(NULL,QString::fromUtf8("完成"),QString::fromUtf8("文件已经导出,是否现在打开?"),QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
            {
                QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(fileName)));
            }
        }
    }
}

2.保存为txt

2.1 这是Qt Android 版代码
QString str;
    QTableWidgetItem *cellItem;

    QDateTime qtimeObj = QDateTime::currentDateTime();//获取时间
    QString alltext;
    //创建JZJCdate文件夹
    QDir *folder = new QDir;
    bool exist = folder->exists("/storage/emulated/0/JZJCdate");
    if(exist)
    {
        //QMessageBox::warning(this, tr("createDir"), tr("Dir is already existed!"));
    }
    else
    {
        //创建文件夹
        bool ok = folder->mkdir("/storage/emulated/0/JZJCdate");
        if(ok)
            QMessageBox::warning(this, tr("CreateDir"), tr("<font size='26' color='green'>Create Dir success!</font>"));
        else
            QMessageBox::warning(this, tr("CreateDir"), tr("<font size='26' color='red'>Create Dir fail!</font>"));
    }
    //存储文件到JZJCdate文件夹内
    QString fileName;
    fileName = tr("/storage/emulated/0/JZJCdate/JZJC数据文件%1.txt").arg(qtimeObj.toString("yyyyMMddhhmmss"));

    QFile file(fileName);
    if(!file.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        QMessageBox::warning(this,tr("错误"),tr("<font size='26' color='red'>打开文件失败,数据保存失败!</font>"));
        return;
    }
    else
    {
        if(!file.isReadable())
        {
            QMessageBox::warning(this,tr("错误"),tr("<font size='26' color='red'>该文件不可读,数据保存失败!</font>"));
        }
        else
        {
            QTextStream out(&file);


            for (int i = 0; i < ui->tableWidget->rowCount(); i++) //逐行处理
            {
                str = QString::asprintf("第 %d 行: ",i+1);
                for (int j = 0; j<ui->tableWidget->columnCount(); j++)
                {
                    cellItem = ui->tableWidget->item(i,j); //获取单元格的item
                    str += cellItem->text()+"   ";         //字符串连接
                }
                str += '\n';
                file.write(str.toUtf8());               //读完一行写一次数据
            }
            out<<alltext<<endl<<QObject::tr("\n date end");
            QMessageBox::warning(this,tr("信息"),tr("<font size='26' color='green'>信息存储成功!\n可在系统根目录文件'JZJCdate'文件夹中查看!</font>"));
        }
    }
    file.close();
2.2 下面是windows版代码
存储为xls文件
        QDateTime time;
        QString temp;
        time = QDateTime::currentDateTime();
        temp = time.toString("yyyy-MM-dd hhmmss");

        QString fileName = QFileDialog::getSaveFileName(this,tr("Excel file"), QString("./%1%2.xls").arg(temp).arg("_lxjc"), tr("Excel Files(*.xls)"));    //设置保存的文件名
        if(fileName != NULL)
        {
            QAxObject *excel = new QAxObject;
            if(excel->setControl("Excel.Application"))
            {
                excel->dynamicCall("SetVisible (bool Visible)",false);
                excel->setProperty("DisplayAlerts",false);
                QAxObject *workbooks = excel->querySubObject("WorkBooks");            //获取工作簿集合
                workbooks->dynamicCall("Add");                                        //新建一个工作簿
                QAxObject *workbook = excel->querySubObject("ActiveWorkBook");        //获取当前工作簿
                QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
                QAxObject *cell;

                /*添加Excel表头数据*/
                for(int i = 1; i <= ui->tableWidget->columnCount(); i++)
                {
                    cell = worksheet->querySubObject("Cells(int,int)", 1, i);
                    cell->setProperty("RowHeight", 40);
                    cell->dynamicCall("SetValue(const QString&)", ui->tableWidget->horizontalHeaderItem(i-1)->data(0).toString());
                }
                /*将form列表中的数据依此保存到Excel文件中*/
                for(int j = 2; j <= ui->tableWidget->rowCount()+1;j++)
                {
                    for(int k = 1; k <= ui->tableWidget->columnCount();k++)
                    {
                        cell = worksheet->querySubObject("Cells(int,int)", j, k);
                        cell->dynamicCall("SetValue(const QString&)", ui->tableWidget->item(j-2,k-1)->text()+ "\t");
                    }
                }
                /*将生成的Excel文件保存到指定目录下*/
                workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(fileName)); //保存至fileName
                workbook->dynamicCall("Close()");                                                   //关闭工作簿
                excel->dynamicCall("Quit()");                                                       //关闭excel
                delete excel;
                excel = NULL;

                if (QMessageBox::question(NULL, QString::fromUtf8("完成"),QString::fromUtf8("文件已经导出,是否现在打开?"), QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
                {
                    QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(fileName)));
                }
            }
        }

ps:保存为txt的方法也是参考网友的,但是现在没有找到原文链接了,若有问题请与我联系。

  • 18
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值