pre
- 之前用的 xlnt,编译很简单,功能支持很多,但是运行速度很慢,解析200行的xlsx需要超过10s
- 我们仅需要xlsx的简单格式,减少转csv的步骤而已;就打算换个纯文本解析的xlsx库
- 语言版本 c++11;看到两个库:xlsxio & xlsx_drone (openXlsx 基于C++17,代码很工整但是我们用不了)
比较
xlsx_drone
- https://github.com/damian-m-g/xlsx_drone
- 因为xlsxio相关的依赖没有在工程里,这个比较轻巧就先用了这个,但是后来发现一些cell解析不出来
xlsxio
- https://github.com/brechtsanders/xlsxio
- python的解析应该也是用的这个库,C语言版本
- 先用bin版本试了下,xlsx_drone 的问题这个库是没有的,就开始弄这个库的编译(static版本),记录一下是中间还是遇到一些坑点的
xlsxio 编译
下载
- xlsxio https://github.com/brechtsanders/xlsxio
- zlib https://github.com/madler/zlib
- expat https://libexpat.github.io/
zlib
- 用的cmake,编译的 zlibstatic
- find 一个 zconf.h 的文件拷贝到 zlib 头文件所在的目录
- minizip 新建了个工程,把 contrib\minizip 的东西都加载进来,编译静态库使用
- minizip linux 写了个简单的makefile编译静态库
1
2
3project(minizip C)
set(CMAKE_POSITION_INDEPENDENT_CODE ON) // .a库会被.so引用
add_library(minizip STATIC zip.c unzio.c mztools.c ioapi.c)
expat
- 也是用的cmake,windows静态库编译简单
- linux CMakeList.txt
- 改了
set(_EXPAT_SHARED_LIBS_DEFAULT OFF)
- 靠前面的位置加了
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
- 改了
xlsxio
- 创建一个 3rd 的目录,把前面编译好的
libz.a, libminizip.a, libexpat.a
拷贝进来 - Makefile
INCS
行 添加前面三个库头文件的位置 (minizip
只用到contrib
这一级就好) - Makefile
LDFLAGS
行 添加-L./3rd
- Makefile
ZIPLIB_LDFLAGS
行 添加-lz
- Makefile
STATIC_CFLAGS
行 添加-fPIC
- 基本改了这些就可以正常编译了
libxls 编译
xls 和 xlsx
- 是两个东西,对于解析来说 xls是二进制的格式(解析代码也看到了大小端的处理),xlsx是基于xml的压缩格式
- xls 支持宏,这是当前需要支持这个版本的需求来源
下载
编译
- install 里的描述看 linux 编译很简单
- 依赖项:
1
2sudo yum install autoconfig-archive
sudo yum install gettext-devel - 按照文档说明执行:
1
2
3./bootstrap
./configure CFLAGS=-fPIC CXXFLAGS=-fPIC --prefix=/xxx/libxls-1.6.2/install --enable-static=yes
make & make install - windows 端想开个工程不用cygwin,报错看到少 config.h,这个是 configure 命令生成的文件;没敢冒险用 cygwin 把这个文件跑出来,其实这个文件和linux下的基本是一致的
- 其他windows端的修改:
- xlstypes.h
1
2
3
4
typedef int64_t ssize_t; - 注释掉了 xls2csv.c 的代码(win端没有getopt)
- 指定工程编译 static library
- xlstypes.h