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

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

pro文件加入
QT += axcontainer

在头文件加入#include<ActiveQt/QAxObject>

网上还有写#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);
    }
}
 

二. 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导出成功啦!!!";
       }
}

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

3.1 csv文件

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

3.2 Qt中导出csv文件

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

#include <QFileDialog>
#include <QTextStream>
#include <iostream>
 
//显示所选表所有内容
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();
}
#include <QFileDialog>
#include <QDateTime>
#include <QTextStream>

        

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();   
}

四 总结

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

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

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

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

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

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

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

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

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

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

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

(9)不支持特殊字符

猜你喜欢

转载自blog.csdn.net/qq_42817360/article/details/133854648
今日推荐