用Qt开发已经九年了,期间用Qt作过很多的项目,在各类项目中有个功能很经常使用,尤为是涉及到数据记录存储的项目,那就是须要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询的数据,其中导出数据到Excel最多见,基本上有三种方法。
方法一使用QAxObject,小数据量还能够,数据量一大直接懵逼,性能指数级降低,并且不支持跨平台,只能在WIN上玩一玩,对于大量的linux开发者来讲,直接废了。
方法二使用第三方开源的QtXlsx,这个作的仍是能够,使用人群也比较多,听说不依赖office组件跨平台的,缺点就是不支持xls格式,只支持高版本的xlsx,使用稍微比较繁琐,用户更多的须要的是直接一个函数传入对应的数据便可,越简单越好。
方法三使用csv格式做为导出数据,纯文本的数据存储格式,默认逗号做为分隔符,也能够指定其余符号做为分隔符,csv格式也是各类表格软件都支持的格式,至关轻便,做为各大系统或者平台和编程语言之间交互数据仍是很是方便的,不少工业控制领域的软件都会采用这种格式,缺点就是太简单了,不能分组或者指定过滤条件特殊颜色显示等。
在对比了三种方式之后,决定本身造个轮子,主要是为了自身项目的须要写的,后面慢慢的客户需求多了,增长了通用经常使用场景的数据导出需求,目标要求至少包含三点:速度够快、使用够简洁、不依赖任何组件。
Demo示例地址:https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ 提取码:1jkp 名称:bin_dataout.ziplinux
//第一步:设置文件路径,标题等信息; QList<QString> columnNames; QList<int> columnWidths; columnNames << "防区号" << "防区名称" << "告警类型" << "告警内容" << "告警时间"; columnWidths << 65 << 100 << 120 << 150 << 180; QString file = qApp->applicationDirPath() + "/1.xls"; ExcelThread::Instance()->init(); ExcelThread::Instance()->setFileName(file); ExcelThread::Instance()->setSheetName("告警信息"); ExcelThread::Instance()->setTitle("全部告警信息"); ExcelThread::Instance()->setSubTitle(QString("%1 导出告警信息").arg(DATETIME)); ExcelThread::Instance()->setColumnNames(columnNames); ExcelThread::Instance()->setColumnWidths(columnWidths); //第二步:打开文件,启动线程; ExcelThread::Instance()->open(); ExcelThread::Instance()->start(); //第三步:逐行输入数据; QStringList list; list << "防区上线" << "防区离线" << "防区旁路" << "防区报警" << "防区故障"; for (int i = 0; i < logCount; i++) { int index = qrand() % 4; QStringList temp; temp.append(QString::number(i + 1)); temp.append("防区" + QString::number(i + 1)); temp.append("主机上报"); temp.append(list.at(index)); temp.append(DATETIME); ExcelThread::Instance()->appendContent(temp.join(";")); } //第四步:关闭文件,关闭线程; ExcelThread::Instance()->close(); ExcelThread::Instance()->stop();