c++ xlsx 解析 xlsxio 编译

pre

  • 之前用的 xlnt,编译很简单,功能支持很多,但是运行速度很慢,解析200行的xlsx需要超过10s
  • 我们仅需要xlsx的简单格式,减少转csv的步骤而已;就打算换个纯文本解析的xlsx库
  • 语言版本 c++11;看到两个库:xlsxio & xlsx_drone (openXlsx 基于C++17,代码很工整但是我们用不了)

比较

xlsx_drone

xlsxio

  • https://github.com/brechtsanders/xlsxio
  • python的解析应该也是用的这个库,C语言版本
  • 先用bin版本试了下,xlsx_drone 的问题这个库是没有的,就开始弄这个库的编译(static版本),记录一下是中间还是遇到一些坑点的

xlsxio 编译

下载

zlib

  • 用的cmake,编译的 zlibstatic
  • find 一个 zconf.h 的文件拷贝到 zlib 头文件所在的目录
  • minizip 新建了个工程,把 contrib\minizip 的东西都加载进来,编译静态库使用
  • minizip linux 写了个简单的makefile编译静态库
    1
    2
    3
    project(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
    2
    sudo 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
      #ifdef _WIN32
      typedef int64_t ssize_t;
      #define strdup _strdup
      #endif
    • 注释掉了 xls2csv.c 的代码(win端没有getopt)
    • 指定工程编译 static library
------ 本文结束 ------
------ 版权声明:转载请注明出处 ------