工作过程中,需要通过代码读取excel文档信息,因此,经过搜索从网络下载开源库QXlsx来实现,从实际的验证过程中 , QXlsx支持windows、linux平台,不但能够读取excel文档,而且可以格式化excel文档,设置文档的字体类型,字体大小、字体颜色,对齐方式等 。
但是它有一个不好的地方,就是使用的时候 , QtCreator创建的工程中pro文件需要加入gui-private, Qt官方不推荐使用的 gui-private, 并且如果升级Qt版本,gui-private提供的接口就有可能不能使用或者被删除,Qt官方不保证gui-private的稳定 。
所以,决定消除QXlsx使用QZipReader和QZipWriter这种私有的方法,通过尝试和研究,最终成功解决了这个问题 。本文将记录其解决的过程方法,作为经验的积累和以后其他类似问题解决的借鉴 。

一、前期准备工作
通过阅读QXlsx中ZipReader和ZipWriter源代码 , ZipReader和ZipWriter类内部封装了Qt私有接口QZipReader和QZipWriter,而QZipReader的功能就是解压读取zip文件,QZipWriter写入文件并压缩成zip文件 。因此,如果需要消除QZipReader和QZipWriter,那么首先需要找到QZipReader和QZipWriter的代替品 , 然后实现ZipReader和ZipWriter的功能 。通过网络搜索找到Zip Utils简化版本的zip库,它支持C , 具体下载地址可以从网上搜索下载 。
1、如果是在linux系统上使用,需要添加ZIP_STD宏,例如我是在QtCreator工具上使用 , 那么在pro文件添加如下所示的信息

2、如果是在window上使用,经验证可能需要添加部分接口 , 有编译的问题,欢迎留言一起探讨 。
3、如果是在mac系统上使用,那么unzip.cpp文件中malloc.h需要修改为stdlib.h, 为了跨平台的使用,可以按照如下所示的方式进行修改

4、ZipReader的头文件定义

5、ZipWriter的头文件定义

二、读取类的消除
1、修改ZipReader头文件, 其中添加USE_LOCAL_ZIP是为了方便开启和关闭我们自己加入zip utils库,如果定义了USE_LOCAL_ZIP , 那么使用我们自己加入的zip utils库,否则使用原来的类 。另外对比ZipReader前后修改的头文件,可以发现主要的修改就是将QZipReader修改为HZIP 。
2、实现ZipReader类,其中需要注意的点:1> 传入的QIODevice需要先close, 再调用zip库的接口OpenZip才能打开成功; 2> QString类型的字符串转换为char *类型,需要先调用toUtf8 。



三、写入类的消除
1、修改ZipWriter头文件, 对比ZipWriter前后修改的头文件 , 可以发现主要的修改就是将QZipWriter修改为HZIP 。
2、实现ZipWriter类,其中需要注意的点:1> 传入的QIODevice需要先close, 再调用zip库的接口CreateZip才能创建成功; 2> QString类型的字符串转换为char *类型 , 需要先调用toUtf8 。


