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

2023-10-17 16:20

本文主要是介绍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,即sheet1QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);QAxObject *range; //获取cell的值QString strVal="hull";QStringList header;//设置初始表格行列都为0ui->tableWidget->setRowCount(0); //设置行数为0ui->tableWidget->setColumnCount(0); //设置列数为0int 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,即sheet1QAxObject *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));//保存至filepathworkbook->dynamicCall("Close()");//关闭工作簿excel->dynamicCall("Quit()");//关闭exceldelete 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)不支持特殊字符

这篇关于QT中导出 Qt Tablewidget表格数据导出到 .csv文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226566

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议