• QT中导出 Qt Tablewidget表格数据导出到 .csv文件


    Qt Tablewidget表格数据的导出和导入
    前期准备:

    pro文件加入
    QT += axcontainer

    在头文件加入#include

    网上还有写#include

    版本不同,可能代码写法不同,自己测试。

    一. xls/xlsx文件数据导入TableWidget表格

    我们右击导入按钮,转到槽,添加被点击后的代码

    QString strData;
    void MainWindow::on_pushButton_17_clicked()
    {
    	//首先我们需要创建一个文件选择对话框
        QString curPash =QDir::currentPath(); //获取当前路径
        QString dlgTitle="选择表格文件";
        //xls和xlsx格式的文件都可以,xlsx兼容xls,注意每一种类型后面要加两个分号
        QString filter="表格文件(*.xls *.xlsx);;xls文件(*.xls);;xlsx文件(*.xlsx);;所有文件(*.*)";
        //创建文件选择对话框
        QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPash,filter);
        if(fileList.count()<1)
            return;
        for(int i = 0;i<fileList.count();i++)
        {
        	//保存文件地址
            strData = fileList.at(i);
        }
        //连接Excel控件
        QAxObject excel("Excel.Application");
        //不显示任何警告信息
        excel.setProperty("Visible",false);
        //获取工作簿集合
        QAxObject *workbooks = excel.querySubObject("WorkBooks");
        workbooks->dynamicCall("Open (const QString&)",str);
        //获取活动工作簿
        QAxObject *workbook = excel.querySubObject("ActiveWorkBook");
        //获取工作表集合的工作表1,即sheet1
        QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);
        QAxObject *range; //获取cell的值
        QString strVal="hull";
        QStringList header;
        //设置初始表格行列都为0
        ui->tableWidget->setRowCount(0); //设置行数为0
        ui->tableWidget->setColumnCount(0); //设置列数为0
     
        int count =0;
        for(int i = 1;i<row;i++)
        {
        	//注意setRowCount里面的函数不是追加,而是总数,很多人最开始都把这个函数以为是总数,造成程序经常崩溃
            ui->tableWidget->setRowCount(ui->tableWidget->rowCount()+1);
            for(int j = 1;j<column;j++)
            {
                if(i == 1)
                {
                    ui->tableWidget->setColumnCount(ui->tableWidget->columnCount()+1);
                    range = worksheet->querySubObject("Cells(int,int)",i,j); //获取cell的值
                    strVal = range->dynamicCall("Value2()").toString();
                    header<<strVal;
                    //设置表格头
                }
                else
                {
                    probar->setValue(++count);
                    range = worksheet->querySubObject("Cells(int,int)",i,j); //获取cell的值
                    strVal = range->dynamicCall("Value2()").toString();
                    ui->tableWidget->setItem(i-2,j-1,new QTableWidgetItem(strVal));
                }
            }
            if(i == 1)
            {
                ui->tableWidget->setHorizontalHeaderLabels(header);
            }
        }
        ui->tableWidget->setRowCount(ui->tableWidget->rowCount()-1);
        }
    }
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    二. tableWidget表格数据导出为xls/xlsx文件

    我们右击导入按钮,转到槽,添加被点击后的代码

    void MainWindow::on_pushButton_23_clicked()
    {
        //获取保存路径
           QString filepath=QFileDialog::getSaveFileName(this,tr("Save"),".",tr(" (*.xlsx)"));
           if(!filepath.isEmpty()){
               QAxObject *excel = new QAxObject(this);
               //连接Excel控件
               excel->setControl("Excel.Application");
               //不显示窗体
               excel->dynamicCall("SetVisible (bool Visible)","false");
               //不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
               excel->setProperty("DisplayAlerts", false);
               //获取工作簿集合
               QAxObject *workbooks = excel->querySubObject("WorkBooks");
               //新建一个工作簿
               workbooks->dynamicCall("Add");
               //获取当前工作簿
               QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
               //获取工作表集合
               QAxObject *worksheets = workbook->querySubObject("Sheets");
               //获取工作表集合的工作表1,即sheet1
               QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);
               //设置表头值
               for(int i=1;i<ui->tableWidget->columnCount()+1;i++)
               {
                   //设置设置某行某列
                   QAxObject *Range = worksheet->querySubObject("Cells(int,int)", 1, i);
                   Range->dynamicCall("SetValue(const QString &)",ui->tableWidget->horizontalHeaderItem(i-1)->text());
               }
               //设置表格数据
               for(int i = 1;i<ui->tableWidget->rowCount()+1;i++)
               {
                   for(int j = 1;j<ui->tableWidget->columnCount()+1;j++)
                   {
                       QAxObject *Range = worksheet->querySubObject("Cells(int,int)", i+1, j);
                       Range->dynamicCall("SetValue(const QString &)",ui->tableWidget->item(i-1,j-1)->data(Qt::DisplayRole).toString());
                   }
               }
               workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath
               workbook->dynamicCall("Close()");//关闭工作簿
               excel->dynamicCall("Quit()");//关闭excel
               delete excel;
               excel=NULL;
               qDebug() << "\n导出成功啦!!!";
           }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    三 Qt如何将数据保存成CSV文件

    3.1 csv文件

    csv文件是逗号分隔值(Comma-Separated Values,CSV)文件的缩写,其文件以纯文本形式存储表格数据(数字和文本),各个字段用逗号进行分割,采用回车进行换行。由于采用纯文本记录,csv文件可以很方便的被文本处理工具、excel等工具识别。

    3.2 Qt中导出csv文件

    在Qt中打开与保存csv文件十分方便,直接按照普通文本的形式操作,用QTextStream进行标准化的读写,还是很简单。

    #include 
    #include 
    #include 
     
    //显示所选表所有内容
    void MainWindow::on_pushButton_clicked()
    {
        /
         初始化:最好放在 构造函数中执行?
        for(int row = 0; row < 4; row++)
        {
            for(int col = 0; col < 3; col++)
            {
                if(ui->tableWidget->item(row,col)==nullptr || ui->tableWidget->item(row,col)->text().isEmpty())
                {
                    ui->tableWidget->setItem(row,col,new QTableWidgetItem);
                    //...
                }
            }
        }
    /
         方法1:获取创建的csv文件名
        QString fileName = QFileDialog::getSaveFileName(this, tr("Excel file"), qApp->applicationDirPath (),
     
                                                        tr("Files (*.csv)"));
        if (fileName.isEmpty())
            return;
     
        //打开.csv文件
        QFile file(fileName);
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
        {
            std::cerr << "Cannot open file for writing: "
                      << qPrintable(file.errorString()) << std::endl;
            return;
        }
        QTextStream out(&file);
     
    /
    //     方法2: 打开指定的 .csv文件
    //    QFile file("200000.csv");
    //    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
    //    {
    //        qDebug()<<"Cannot open file for writing";
    //        return;
    //    }
    //    QTextStream out(&file);
     
         创建表头
        out << tr("信息,") << tr("数字,") <<"\n";
     
        QString string;
        //写入内容
        for(int i = 0; i < 4; i++)
        {
            //             QString string = ui->tableWidget->item(i, col)->text();
            //             out << "test" << "," << i << "\n";
     
            for(int col = 0; col < 3; col++)
     
            {
                string ="";
                string = ui->tableWidget->item(i, col)->text();
                 下面语句,可以直接访问,不需要执行ui->tableWidget->setItem(row,col,new QTableWidgetItem);
                /// 但还不知道是否有其他的副作用。
                //string = ui->tableWidget->model()->index(i, col).data().toString();
     
                out << string << ","; // 写入文件
                //out << "\n";
            }
            out << "\n";
        }
        //关闭文件
        file.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    #include 
    #include 
    #include 
    
            
    
    void MainWindow::on_pushButton_clicked()
    {
        //1.选择导出的csv文件保存路径
        QString csvFile = QFileDialog::getExistingDirectory(this);
        if(csvFile.isEmpty())
            return;
        
        //2.文件名采用系统时间戳生成唯一的文件
        QDateTime current_date_time =QDateTime::currentDateTime();
        QString current_date =current_date_time.toString("yyyy_MM_dd_hh_mm_ss");
        //csvFile += tr("/%1_DTUConfigInfo_export_%2.csv").arg(username).arg(current_date);
        csvFile += tr("/DTUConfigInfo_export_%2.csv").arg(current_date);
        
        
        //3.用QFile打开.csv文件 如果不存在则会自动新建一个新的文件
        QFile file(csvFile);
        if ( file.exists())
        {
            //如果文件存在执行的操作,此处为空,因为文件不可能存在
        }
        file.open( QIODevice::ReadWrite | QIODevice::Text );
        statusBar()->showMessage(tr("正在导出数据。。。。。。"));
        QTextStream out(&file);
        
        //4.获取数据 创建第一行
        out<<tr("UID,")<<tr("sysID,")<<tr("UsrID,")<<tr("MeterNum,")<<tr("CMD,\n");//表头
        //其他数据可按照这种方式进行添加即可
        
        //5.写完数据需要关闭文件
        file.close();   
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    四 总结

    Qt中csv文件的导入与导出
    CSV

    1.简介:
    全称:Comma Separated Values。

    是“逗号分隔值”的英文缩写,通常是纯文本文件,一般用wordWPS或是记事本打开。

    2.规则:
    (1)开头不留空,以行为单位。

    (2)可含或不含列名,含列名则居文件第一行。

    (3)一行数据部跨行,无空行。

    (4)以半角逗号作分隔符,列为空也要表达其存在。

    (5)列内容如存在半角逗号(即,)则用半角引号(即"“)将该字段值包含起来。内容如存在半角逗号(即,)则用半角引号(即”")将该字段值包含起来。

    (6)列内容如存在半角引号(即")则应替换成半角双引号(“”)转义,并用半角引号(即"")将该字段值包含起来。

    (7)文件读写时引号,逗号操作规则互逆。

    (8)内码格式不限,可为 ASCII、Unicode 或者其他。

    (9)不支持特殊字符

  • 相关阅读:
    接口幂等性
    Shell 实现文件基本操作(sed-编辑、awk-匹配)
    【JavaScript】null 和 undefined 的区别
    蓝牙低能耗安全连接 – 数值比较
    采用PHP开发的一套(项目源码)医疗安全(不良)事件报告系统源码:统计分析,持续整改,完成闭环管理
    Springboot + Sqlite实战(离线部署成功)
    百万消息量IM系统技术要点分享
    Java实现---动态修改定时任务的执行时间
    axios的post请求所有传参方式
    【软考-中级】系统集成项目管理工程师-立项管理历年案例
  • 原文地址:https://blog.csdn.net/qq_42817360/article/details/133854648