一、前言

本片文章主要记录和分享一下qt使用qxlsx开源文件读写xlsx表格文件用法。

目录

  • 一、前言
  • 二、环境
  • 三、正文
    • 1.读取指定xlsx文件
    • 2.保存xlsx文件
    • 3.保存xlsx文件内容过大崩溃解决方案一
    • 4.保存xlsx文件内容过大崩溃解决方案二
  • 四、结语

二、环境

windows
linux
qt5.7

三、正文

首先安装和部署qxlsx文件我就不说了,网上很多很多,都是开源的pri文件夹,直接复制再pro文件调用添加即可。

1.读取指定xlsx文件

本样例是读取某个表格1、2列内容,读取全部1、2列有的内容,除去第一行标题行,只保留内容

        QString path=qApp->applicationDirPath()+"/code.xlsx";QFile file(path);if(!file.exists())massage_dialog(1,"提示","xxx信息!",1);else{QStringList code_nums;code_nums.clear();QStringList code_name;code_name.clear();QXlsx::Document xlsx(path);QXlsx::Workbook *workBook = xlsx.workbook();QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(workBook->sheet(0));ulong xlsxrows=workSheet->dimension().rowCount();//读取文件行数ulong xlsxcloums=workSheet->dimension().columnCount();//读取文件列数for (int i=1;i<=xlsxrows;i++){code_nums.append(workSheet->cellAt(i, 1)->value().toString());code_name.append(workSheet->cellAt(i, 2)->value().toString());}code_nums.removeFirst();//去掉第一行标题行code_name.removeFirst();//去掉第一行标题行xlsx.deleteLater();

2.保存xlsx文件

本样例是保存表格内容到指定名称的文件(新建),并生成某一列数据的曲线,从坐标1到坐标2

   QXlsx::Document xlsx;xlsx.addSheet(title_name[i]);xlsx.selectSheet(title_name[i]);///写大标题,标题在第一行QXlsx::Format formatTitle;formatTitle.setFontBold(true);// 粗体formatTitle.setFontColor(QColor(Qt::black));//文字颜色formatTitle.setFontSize(20);//字体大小formatTitle.setBorderStyle(QXlsx::Format::BorderThin);//边框样式,细网格线formatTitle.setPatternBackgroundColor(Qt::lightGray);//单元格背景色formatTitle.setFillPattern(QXlsx::Format::PatternSolid);//填充样式formatTitle.setHorizontalAlignment(QXlsx::Format::AlignHCenter);//文本水平居中xlsx.mergeCells(QXlsx::CellRange(1,1,1,20), formatTitle);//合并单元格 第一行第1列到第一行第15列合并成一格QString code="未知设备";if(!ui->lineEdit->text().isEmpty())code=ui->lineEdit->text();xlsx.write(1,1,"设备号:"+code+",信号名称:"+title_name[i]+",数据组数:"+QString::number(r_groupdata.size()));//给合并后的单元格写数据, 注意参数 (1,1,"title")///写小标题,标题在第一行QXlsx::Format format1;format1.setBorderStyle(QXlsx::Format::BorderThin);//边框样式,细网格线format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);//文本水平居中xlsx.write(2,1,"信号值",format1);xlsx.write(2,2,"时间戳",format1);///写内容,从第三行开始,1-2列QXlsx::Format format2;format2.setBorderStyle(QXlsx::Format::BorderThin);//边框样式,细网格线format2.setHorizontalAlignment(QXlsx::Format::AlignHCenter);//文本水平居中//可以先按行写, 也可以按列写//...for (ulong row = 0; row < r_groupdata.size(); row++){xlsx.write(row+3,1,r_groupdata[row].box_zhidong[2],format2);//档位开始xlsx.write(row+3,2,r_groupdata[row].box_time.toString("yyyy-MM-dd hh:mm:ss"),format2);//时间}//生成曲线Chart * Crom = xlsx.insertChart( 3, 5, QSize(1200, 800) );Crom->setChartType( Chart::CT_ScatterChart );//CT_ScatterChartCrom->addSeries( CellRange(QString("A3:A%1").arg(r_groupdata.size()+2)) );Crom->setAxisTitle( Chart::Left, QString("数值") );Crom->setAxisTitle( Chart::Bottom, QString("时间线") );Crom->setChartTitle( QString(title_name[i]) );//保存数据bool res=false;res = xlsx.saveAs(dir+historydir+"/信号"+QString("%1").arg(i+1,2,10,QChar('0'))+"-"+title_name[i]+QString("-%1数据包.xlsx").arg(r_groupdata.size()));xlsx.deleteLater();MySleep(10000,1000);

mysleep函数如下

//延时usetime:非阻塞时间  waittime:阻塞时间
void MySleep(uint usetime,ulong waittime)
{QCoreApplication::processEvents(QEventLoop::AllEvents, usetime);//进入此函数内给之前数据usetime毫秒时间处理,处理完立马退出执行之后,超时立马退出QThread::msleep(waittime);//阻塞延时waittime毫秒
}

3.保存xlsx文件内容过大崩溃解决方案一

在使用qxlsx保存文件时,会遇到有的时候保存数据量过大时程序崩溃的问题, 这种问题由于源码过于复杂原因未深入研究寻找原因,暂时使用其他方式解决,方案一就是将数据按列分开保存, 假如数据有30列,有20万行,就1列保存一个xlsx文件,然后循环30列保存,中间加上mysleep延时函数,这样在保存一列之后再中间的等待时间会释放已经申请的内存,然后保存第二列再用,再任务管理器中看现象就是内存500M→1500M→500M→1500M。。。

4.保存xlsx文件内容过大崩溃解决方案二

方案二就是按行保存,再保存超过一定行数之后就换另外一个文件保存
下面是一部分示例代码,我通过spinBox设置单个文件保存行数,10000行为步长

//导出excel
void MainWindow::on_pushButton_4_clicked()
{QString dir = QFileDialog::getExistingDirectory(this, tr("选择信息导出文件目录"),"/home",QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);if(dir.isEmpty())QMessageBox::information(this,"提示","路径为空!设置保存报告路径失败!");else{bool exist;QDir *folder = new QDir();QString historydir="/histroy"+QDateTime::currentDateTime().toString("yyyy-MM-dd hh-mm-ss");exist = folder->exists(dir+historydir);//文件夹是否存在if(!exist)folder->mkdir(dir+historydir);//不存在创建文件夹// 设置excel表头(第一行数据)QString groupname[27]={"时间","识别号","ID","度","度","角度","速","速度","半径","状态","卫星定位状态","状态","数","期","状态","状态","温度","据状态","据状态","模式态","路态","模式","指令","路件名","路编号","返航确认果","上态"};QStringList titleList;titleList.clear();for(int i=0;i<27;i++)titleList.append(groupname[i]);bool res;ulong allnum=ui->tableWidget->rowCount();ulong thisnum=0,afternum=0;QVector<ulong> savelistcount;char count=allnum/ui->spinBox->value();for(int i=0;i<count;i++)savelistcount.append(ui->spinBox->value());savelistcount.append(allnum%ui->spinBox->value());for(int time=0;time<savelistcount.size();time++){thisnum=afternum;afternum+=savelistcount.at(time);qDebug()<<thisnum<<afternum;QXlsx::Document xlsx;xlsx.setColumnWidth(1,10);//第一行,20列宽for (int i = 0; i < titleList.size(); i++){xlsx.write(1, i+1, titleList.at(i));//这里写第一行,第n列数据//开始写第n行数据for(int j = thisnum;j<afternum;j++){xlsx.write(j+2-thisnum,i+1,ui->tableWidget->item(j,i)->text());}}// 最后,保存文件res=xlsx.saveAs(dir+historydir+"/"+QDateTime::currentDateTime().toString("yyyy-MM-dd hh-mm-ss")+QString("(%1)").arg(time+1)+".xlsx");xlsx.deleteLater();QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);//进入此函数内给之前数据usetime毫秒时间处理,处理完立马退出执行之后,超时立马退出QThread::msleep(1000);//阻塞延时waittime毫秒}if(res)QMessageBox::information(this,"提示","保存excel成功!");elseQMessageBox::information(this,"提示","保存excel失败!");}
}

其中所有数据再控件tabelwidget中
当个文件行数在控件spinBox中

四、结语

新年第二篇文章,收尾一个去年计划中发表文章和实现功能。

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取相关推荐

  1. jeecg 关于.xlsx.xls表格文件导入后提示框功能(后台设置提示框)

    导入成功后: 导入时格式错误提示: 当导入模板错时提示 当标题有错误时提示 直接上代码: package org.jeecgframework.web.cgform.service.excel;imp ...

  2. php写excel文件_利用PHPExcel实现Excel文件的写入和读取

    作为一个原本的Java党,用过PHP才知道,原来对于Excel文件的写入和读取原来可以这么简单! 利用PHP实现对于Excel的读取,主要借助于PHPExcel插件来完成. PHPExcel下载地址: ...

  3. python如何读写文件-python文件的写入和读取

    1.txt,xls,doc等文件的使用 f=open("filename","w") 打开一个用于写入的文件,要写入内容时使用f.write("内容& ...

  4. c#中文件的写入与读取

    在我们做名片管理时用到了对于名片的存储与读入问题.首先我们需要获取当前的路径引用using System.IO;命名空间.我们在写入之前先把card类型的一条记录转化成string类型的数组方便写入. ...

  5. VC++中对文件的写入和读取

    VC++中对文件的写入和读取 本文介绍两种方法对文件进行读取和写入操作:1.采用fstream类:2.采用CStdioFile类. CStdioFile继承自CFile,一个CStdioFile对象代 ...

  6. PHP文件的写入与读取基础

    1.PHP文件的写入与读取基础 先看图片与代码: 具体代码文本: <?php /* 关于用到的函数文章会讲到*/ $myfile = "../uploads/file.txt" ...

  7. python读取txt文件写入-python txt文件的写入和读取

    1.文件的打开 使用open () 函数 打开文件.他有两个参数,文件路径或文件名和文件的打开方式. "r" 只读模式,不能编辑和删除文件内容. "w" 写入模 ...

  8. 将xls表格文件转为xml文件以及json格式的文件,支持2010xls解析

    项目需求,要通过数据库将数据以xls文件格式导出.直接解析xls的文件是没法解析的,所以需要通过解析成xml或者json格式文件后进一步处理.2003版本的Excel有65536的限制.搞了个java ...

  9. 生成xslx文件,写入并读取

    #本地生成xslx文件, 写入数据,再读取文件,把里面的数据列出来 import openpyxl import datetime import os,sysdef write_xsls(): wb ...

最新文章

  1. webalizer日志分析软件的安装
  2. summary+plan
  3. php源码安装空白,源代码安装完成后,页面一片空白?
  4. 我的技术回顾那些与ABP框架有关的故事-2017年
  5. jq匹配偶数行_jquery怎么实现奇偶行不同背景颜色?
  6. 开源:Swagger Butler 1.1.0发布,利用ZuulRoute信息简化配置内容
  7. ga tsp matlab,遗传算法(GA)求解TSP问题MATLAB程序
  8. 【Antlr】Antlr 在语法中嵌入任意动作
  9. Microsoft Dynamics CRM 2015 之安装SQL Server 2012过程中出现“启用windows功能NetFx3时出错...
  10. 孙鑫MFC笔记之八--文档串行化
  11. 读Zepto源码之Data模块
  12. mysql 要完 知乎_必知必会 MySQL笔记(未完)
  13. java自己写框架_用java自己动手写个简单RCP框架
  14. 特征选择和特征提取,及其分类
  15. 火车头伪原创接口【基于ai伪原创】
  16. Iphone快捷指令示例:自动更换墙纸并叠放近期日程在墙纸上
  17. 敌兵布阵——线段树单点修改区间查询
  18. Vue.js实现点击左右按钮图片切换
  19. Aspose.Words 复制表格并将复制的表格插入原有表格后面
  20. 支付宝崩了,七夕红包发得太多?

热门文章

  1. 实战 .Net 数据访问层 - 23
  2. CS架构 企业ERP系统源码 Winform财务设备生产采购进销存源码
  3. 串联滞后校正对系统的影响_什么是相位超前校正、滞后校正、滞后超前校正,对系统性能的影响...
  4. 软件设计---抽象类与接口
  5. Top DBA Shell Scripts for Monitoring the Database
  6. python 贼拉拉牛逼之思维导图
  7. Windows10家庭版如何获取最高管理员权限
  8. 2.13Epd 中景园2.13寸电子墨水屏 显示原理(局部刷新指令)
  9. 视觉注意力机制——SENet、CBAM、SKNet
  10. 漫谈快速控制原型设计(RCP)