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多秒就能 ...
随机推荐
- Redis实现幂等、防抖、限流等功能
本文章主要讲述如何使用Redis实现幂等.防抖.限流等功能. 幂等组件 import lombok.RequiredArgsConstructor; import org.springframewor ...
- C# 并发控制框架:单线程环境下实现每秒百万级调度
前言 在工业自动化和机器视觉领域,对实时性.可靠性和效率的要求越来越高.为了满足这些需求,我们开发了一款专为工业自动化运动控制和机器视觉流程开发设计的 C# 并发流程控制框架. 该框架不仅适用于各种工 ...
- 正态分布——“牛而B之”
1 问题: 什么是正态分布,为什么这么出名和重要? 1.1 名气大 为什么叫"正态分布",也有地方叫"常态分布",这两个名字都不太直观,但如果我们各取一字变为& ...
- Nuxt.js 应用中的 pages:extend 事件钩子详解
title: Nuxt.js 应用中的 pages:extend 事件钩子详解 date: 2024/10/25 updated: 2024/10/25 author: cmdragon excerp ...
- docker REPOSITORY 改名
创建新的名称: docker tag oldname:tag newname:tag 删除旧的名称: docker rmi oldname:tag
- 内网IP地址实现HTTPS加密访问教程
一.前期准备 确定内网IP地址: 确保有一个明确且固定的内网IP地址.动态IP地址可能不适合此场景,因为它们会频繁改变,导致SSL证书失效. 选择SSL证书颁发机构(CA): 选择一个受信任的CA,如 ...
- CodeForces Round 898 (div 4) H题解析
CodeForces Round 898 (div 4)H. Mad City 大致思路 对于有n条边和n个点,说明这个图里面只有一个环 并且两人同时开始和结束移动,所以可以得到当Valeri ...
- LLM应用实战: 给个公司简称,输出公司全称
1.背景 本qiang~本周在处理手头项目工作的时候,遇到了一个问题,就是友方提供了一个公司名称列表(量不小~,因此无法人工处理),且该公司名称列表均为简称,需要与库中的全称做一个映射匹配. 看似简单 ...
- 20241120 校内模拟赛 T3 题解
题目描述 给定一个数列 \(A\),数列的元素取值范围为 \([1,m]\). 请计算有多少个非空子区间满足以下条件:该区间内每个元素的出现次数都相同(没有出现的元素视为出现 \(0\) 次). 例如 ...
- 最全ECharts 实战大全(速记版+资源)
hello,大家好,我是程序员海军,公众号已经快一年多没更新了,没更新的这段时间,我去哪了呢.这两年经历了很多事情,主要情感上占据大部分时间, 从失恋 - 谈对象 - 再失恋. 言归正传,近期我负责的 ...