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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav