Qt数据库应用20-csv文件转xls
一、前言
最近又多了个需求就是将csv格式的文件转xls,需求一个接着一个,还好都是真实的需求,而且都是有用的需求,并不是不靠谱的需求,不靠谱的需求就比如程序自动识别手机壳颜色自动换背景颜色或者边框颜色色系。csv转xls,因为很多软件或者网页为了跨平台做了极致简单的导出数据形式,那就是csv格式的文本数据,有些用户觉得这种格式用电子表格软件打开后,格式显得很拥挤不好看,所以需要自己的程序能够提供静态函数直接进行转换,里面有多少个字段,转成xls数据后也多少个字段,有多少行内容也就多少行内容,这样打开后就是标准的xls文件,带有一定格式。
之前封装的通用导出函数就支持直接传入数据集合和字段集合导出,所以这个需求的难点及主要工作量就是读取csv文件,取出字段集合和内容集合,最后赋值给数据导出结构体即可。如果是标准的csv文件,那还是很容易读取的,搞个QFile搭配QTextStream以文本流的形式一行行readLine读取,理想很好显示很打脸,自己按照标准csv要求导出的文件可以正常转换,而用户第三方软件导出的csv格式的文件死活无法ok,用记事本打开一看,居然是bom格式,而且里面穿插了非常多的无效空格以及不可见字符\x200B,bom字节也好,不可见字符也好,用普通的QString是打印不出来的,必须转成QByteArray然后再转成16进制字符串就能看到,bom是文本最开始前面三个固定字节0xEF、0xBB、0xBF,只要读取到文件前面存在这三个字节就说明是带bom的文件。
格式搞明白了,代码自然就出来了,通过readLine拿到数据后,传入正则表达式调用remove方法移除不可见字符,这样剩下的就是可见字符,然后判断当前是否读取的是第一行,是第一行则数据分割后传入列名字段名称集合中,其余都是一行行数据,按照要求的分隔符传入队列即可,最后一次性调用静态数据导出函数打完收工,完美!总结:遇到困难要迎难而上,只要功夫深,一定能找到问题所在,尤其是代码写的多了以后,遇到问题会有多种甚至几十种解决办法。
二、功能特点
- 组件同时集成了导出数据到csv、xls、pdf和打印数据。
- 所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便。
- 同时支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等数据源。
- 提供静态方法直接传入QTableView、QTableWidget控件,自动识别列名、列宽和数据内容。
- 每组功能都提供单独的完整的示例,注释详细,非常适合各阶段Qter程序员。
- 原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,支持嵌入式linux。
- 速度超快,9个字段10万行数据只需要2秒钟完成。
- 只需要四个步骤即可开始急速导出海量数据比如100W条记录到Excel。
- 同时提供直接写入数据接口和多线程写入数据接口,不卡主界面。
- 可设置标题、副标题、表名。
- 可设置导出数据的字段名、列名、列宽。
- 可设置末尾列自动拉伸填充,默认拉伸更美观。
- 可设置是否启用校验过滤数据,启用后符合规则的数据特殊颜色显示。
- 可指定校验的列、校验规则、校验值、校验值数据类型。
- 校验规则支持 精确等于==、大于>、大于等于>=、小于<、小于等于<=、不等于!=、包含contains。
- 校验值数据类型支持 整型int、浮点型float、双精度型double,默认文本字符串类型。
- 可设置随机背景颜色及需要随机背景色的列集合。
- 支持分组输出数据,比如按照设备分组输出数据,方便查看。
- 可设置csv分隔符、行内容分隔符、子内容分隔符。
- 可设置边框宽度、自动填数据类型,默认自动数据类型开启。
- 可设置是否开启数据单元格样式,默认不开启,不开启可以节约大概30%的文件体积。
- 可设置横向排版、纸张边距等,比如导出到pdf以及打印数据。
- 提供图文混排导出数据到pdf以及打印示例,自动分页,支持多图。
- 提供一个打印样板中同时包括横向纵向排版示例。
- 提供静态函数将控件截图导出到pdf文件。
- 提供静态函数将图片转成pdf文件。
- 提供静态函数将csv文件转成xls文件,支持列宽表名等参数设置。
- 针对每列可分别设置字段对齐样式、内容对齐样式,包括左对齐、居中对齐、右对齐。
- 灵活性超高,可自由更改源码设置对齐方式、文字颜色、背景颜色等。
- 支持任意excel表格软件,包括但不限于excel2003-2021、wps、openoffice等。
- 纯Qt编写,支持任意Qt版本+任意编译器+任意系统。
三、体验地址
- 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_dataout.zip
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
四、效果图

五、相关代码
QString DataOther::csvToXls(DataContent &dataContent, const QString &csvFile, const QString &xlsFile, bool quatation, const QString &spliter)
{
//为空则同名文件
QString fileName = xlsFile;
if (fileName.isEmpty()) {
fileName = csvFile;
fileName.replace("." + QFileInfo(csvFile).suffix(), ".xls");
}
//内容集合
QStringList content;
//字段名称
QList<QString> columnNames;
//字段宽度
QList<int> columnWidths;
//读取csv文件的内容
QFile file(csvFile);
if (file.open(QIODevice::ReadOnly | QFile::Text)) {
//采用文件流的形式读取速度最快
QTextStream stream(&file);
DataCsv::initTextStream(csvFile, &stream);
stream.seek(0);
//循环读取文件
int row = 0;
while (!stream.atEnd()) {
QString line = stream.readLine();
if (line.isEmpty()) {
continue;
}
//删除特殊字符,这个字符会导致读取不到内容TNND
QString pattern = "[\\x200B]";
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
line.remove(QRegularExpression(pattern));
#else
line.remove(QRegExp(pattern));
#endif
row++;
QStringList list = line.split(spliter);
//第一行是字段
if (row == 1) {
int count = list.count();
for (int i = 0; i < count; ++i) {
//去掉空字段名
QString columnName = list.at(i);
if (columnName.isEmpty()) {
continue;
}
columnNames << columnName;
//设置过则取设置好的
if (dataContent.columnWidths.count() > i) {
columnWidths << dataContent.columnWidths.at(i);
} else {
columnWidths << 70;
}
}
continue;
}
QString separator = dataContent.separator;
//每行数据作为一个整体字符串带分割符 ; 存入
content << list.join(separator);
}
}
if (content.count() > 0) {
//填充内容
dataContent.content = content;
//设置列名列宽
dataContent.columnNames = columnNames;
dataContent.columnWidths = columnWidths;
//设置文件名
dataContent.fileName = fileName;
//调用静态函数导出
DataXls::saveXls(dataContent);
}
return fileName;
}
Qt数据库应用20-csv文件转xls的更多相关文章
- 从数据库中导出.csv文件
需求: 本次将数据库中的数据导出成.csv文件(office可以打开), //数据的生成,根据你所选中的数据进行生成 //params:$activity_id -> 活动的id //param ...
- Qt:输出为CSV文件时汉字乱码
参考 (18条消息) QT5写csv文件,文件打开后中文显示乱码的问题解决_yanzi150207348的博客-CSDN博客 解决方法 1.在文件开头写一段: #if _MSC_VER >= 1 ...
- 数据库数据导出CSV文件,浏览器下载
直接上代码: def download(request): # 从数据库查询数据 data_list = Info.objects.all() # 定义返回对象 response = HttpResp ...
- 【C#】用C#通过读取数据库方式读取CSV文件
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...
- 链接sql数据库并输出csv文件
__author__ = 'chunyang.wu' #作者:SelectDB # -*- coding: utf-8 -*- import MySQLdb import os os.environ[ ...
- Oracle数据库导入csv文件(sqlldr命令行)
1.说明 Oracle数据库导入csv文件, 当csv文件较小时, 可以使用数据库管理工具, 比如DBevaer导入到数据库, 当csv文件很大时, 可以使用Oracle提供的sqlldr命令行工具, ...
- 从数据库中导出数据到.csv文件
考虑到csv文件比xls文件格式容易控制,所以在这次导出中用的是.csv格式. protected function exportInfo($arr, &$err){ $nameInfo = ...
- csv文件数据导出到mongo数据库
from pymongo import MongoClientimport csv# 创建连接MongoDB数据库函数def connection(): # 1:连接本地MongoDB数据库服务 co ...
- C# .csv文件转为Excel格式;Excel格式转换为.csv
using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windo ...
- 【MySQL】CSV 文件导入MySQL
此问题是前几天整理数据的时候碰到的,数据存在 CSV文件中(200多万记录),通过python 往数据库中导入太慢了,后来使用MySQL 中自带的命令 LOAD DATA INFILE, 30多秒就能 ...
随机推荐
- google 搜索技巧
size qq.com inurl : size 指定网站 inurl 这个网站的指定内容 filetype 指定搜索的文件类型
- npm/yarn是什么,他们的区别 ? & node.js 又是个啥
是什么? npm(全称Node Package Manager,即 node 包管理器) ,是Node.js默认的包管理系统 ; 区别: yarn 的速度开快,因为yarn 是并行安装,npm是串行安 ...
- KubeSphere 社区双周报| 2024.08.16-08.29
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- 在 Ubuntu 22.04 上安装 KubeSphere 实战教程
作者:老 Z,中电信数智科技有限公司山东分公司运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes.KubeSphere.DevOps.OpenStack.Ans ...
- windows涉及所有协议及默认端口
名称 协议 端口 说明 echo tcp/udp 7 echo服务 discard tcp/udp 9 用于连接测试的空服务 systat tcp/udp 11 链接端口系统状态 daytime tc ...
- springboot-实现excle文件导出的单元格相同内容合并
导出excle文件中的单元格有些需要合并如何操作 例如:左边的表格想合并单元格成右边的表格更加便于观看 一.依赖文件 <!-- excle操作--> <depen ...
- css动画效果(边框线条流动效果)
1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa6FxrVbiamfvb7b0H4qcDzZRwq3PqvXfuMDaPZ44VUic1h2WR ...
- 思科 ISE 3.4 发布新增功能概览
思科 ISE 3.4 发布,新增功能概览 目录 Active Directory 首选 DC 选择 保留使用设置 本地化 ISE 安装 FQDN 到 SGT 映射 思科 ISE 和 TrustSe ...
- php日志分割
为了方便查看php错误日志信息,将php的日志按照时间进行分割,器脚本如下 phpPid='/usr/local/webserver/php-5.3.27/var/run/php-fpm.pid' p ...
- 3.13 Linux建立软硬链接文件(ln命令)
如果要想说清楚 ln 命令,则必须先解释下 ext 文件系统(Linux 文件系统)是如何工作的.我们在前面讲解了分区的格式化就是写入文件系统,而我们的 Linux 目前使用的是 ext4 文件系统. ...