C++操作excel—OpenXLSX库
ffmpeger 发布于 2020-12-30

OpenXLSX的github地址:https://github.com/troldal/OpenXLSX

OpenXLSX是一个C++ 库 用于读写创建修改 Microsoft Excel 文件, 包括 .xlsx 格式.


内容

    New in version 0.2.0
    Motivation
    Compatibility
    Build Instructions
    Current Status
    Performance
    Caveats
        File Size
        Memory Usage
        Unicode
    Example Programs

New in version 0.2.0
OpenXLSX的内部架构自上一版本以来进行了重大的重新设计。原因是这个库正在变成一个大泥球,添加特性和修复bug变得越来越困难。有了新的体系结构,它(希望)将更易于管理和添加新特性。

由于架构的重新设计,公共接口有一些变化。但是,这些变化并不显著,应该很容易更新:

  • 所有内部对象现在都作为值而不是指针来处理,这与底层PugiXML库中采用的方法类似。这意味着从工作簿请求某个工作表时,结果工作表不会作为指针返回,而是作为支持复制和移动的对象返回。
  • 接口对象和实现对象之间的区别现在消失了,因为这使得管理更改变得非常困难。它试图实现pimpl习惯用法,但效果不是很好。将来,我可能会再次尝试实现pimpl,但前提是可以用更简单的方式实现。
  • 所有成员函数都已重命名为以小写字母(camelCase)开头,即成员函数WorksheetCount()重命名为WorksheetCount()。这样做主要是为了美观。

我意识到这些变化可能会给一些用户带来问题。因此,可以在这个存储库的“遗留”分支中找到以前版本的OpenXLSX。但是,我强烈建议您转换到新版本。

我意识到这些变化可能会给一些用户带来问题。因此,可以在这个存储库的“遗留”分支中找到以前版本的OpenXLSX。但是,我强烈建议您转换到新版本。

Motivation

许多编程语言都具有修改Excel文件的能力,无论是以本机方式还是以开源库的形式。这包括Python、Java和C。然而,对于C++来说,情况更为分散。虽然有一些库,但它们通常不太成熟,并且比其他语言的功能集更小。

因为没有完全符合我需求的开源库,所以我决定开发OpenXLSX库。

下面是我所知道的Excel文件的主要C++库的概要:

libxls

libxls库(https://sourceforge.net/projects/libxls/)是一个C库,用于读取旧版Excel文件格式的文件.xls。它不能用于编写或修改Excel文件。

xlslib

xlslib库(https://sourceforge.net/projects/xlslib/是一个C/C++库,用于在遗留Excel文件格式.xLS中创建文件。它不能用于读取或修改Excel文件。

libxlsxwriter

libxlsxwriter库(https://libxlsxwriter.github.io)是用于创建.xlsx文件的C库。它不能用于读取或修改Excel文件。

LibXL

LibXL图书馆(http://www.libxl.com)可以读取、写入、创建和修改.xls和.xlsx格式的Excel文件。它是最具特色的完整库,它具有C、C++、C、Delphi等接口。不过,它只能购买。

QtXlsx

在开源库中,QtXlsx库(https://github.com/dbzhang800/QtXlsxWriter)是最完整的功能。然而,它是基于Qt框架的。虽然出于应用程序编程的目的,我非常喜欢Qt,但我不认为它是低级库的最佳选择。

XLNT

最近,我在GitHub上找到了XLNT库(https://github.com/tfussell/xlnt). 当我开始开发OpenXLSX时,它是不可用的。老实说,如果有,我就不会开始OpenXLSX了。它有一个更大的功能集,可能有更少的错误。但是,我决定继续开发OpenXLSX,因为我相信在某些方面它比XLNT更好。首先,OpenXLSX能够更好地处理非常大的电子表格(最多一百万行)。

Ambition

我们的目标是OpenXLSX应该能够读、写、创建和修改Excel文件(数据和格式),并且尽可能少的依赖性。OpenXLSX目前依赖于以下第三方库:

  • PugiXML
  • Zippy (C++ wrapper around miniz)
  • Boost.Nowide (for opening files with non-ASCII names on Windows)

这些库包含在存储库中,即不需要单独下载和构建。

Compatibility

OpenXLSX已经在以下平台/编译器上进行了测试。请注意,'-'并不意味着OpenXLSX不工作;它只是意味着它还没有经过测试:


GCC Clang
MSVC
Windows
N/A
- +
MinGW
+ + N/A
MSYS
+ N/A
N/A
Cygwin
- - N/A
MacOS
+ + N/A
Linux
+ + N/A
以下编译器版本应该能够编译OpenXLSX而不会出错:

  • GCC: Version 7
  • Clang: Version 8
  • MSVC: Visual Studio 2019

clang7应该能够编译OpenXLSX,但是显然std::variant的实现中有一个bug,它会导致编译器错误。


Build Instructions

OpenXLSX使用CMake作为构建系统。如果您使用GNU makefile(例如,在Linux、MacOS、MinGW或MSYS上),您可以通过导航到OpenXLSX存储库的根目录,从命令行构建OpenXLSX,然后执行以下命令:

mkdir build
cd build
cmake ..
make

根据您的系统,您可能需要向cmake提供其他命令。此外,如果使用MinGW makefiles,则可能需要运行“mingw32 make”而不是“make”。

如果您使用IDE,例如VisualStudio或Xcode,则可以为cmake提供-G标志,后跟您需要的构建系统。有关详细信息,请参见CMake文档。

如果愿意,还可以使用cmakegui应用程序。

Current Status

创建/打开/保存文件
读/写/修改单元格内容
复制单元格和单元格区域
复制工作表
范围和迭代器
与格式、绘图和图形相关的功能尚未实现,也不打算在不久的将来实现。

需要注意的是,创建constxldocument对象目前不起作用!

Performance

下表是一个基准测试的输出(使用Google基准测试库),它显示读/写访问可以以每秒2000000个单元的速度完成。由于与.xml文件中的字符串之间的转换,浮点数稍微低一些。

 Run on (16 X 2300 MHz CPU s)
CPU Caches:
  L1 Data 32 KiB (x8)
  L1 Instruction 32 KiB (x8)
  L2 Unified 256 KiB (x8)
  L3 Unified 16384 KiB (x1)
Load Average: 3.14, 2.14, 1.80
---------------------------------------------------------------------------
Benchmark                 Time             CPU   Iterations UserCounters...
---------------------------------------------------------------------------
BM_WriteStrings        3959 ms         3959 ms            1 items=8.38861M items_per_second=2.1189M/s
BM_WriteIntegers       3605 ms         3604 ms            1 items=8.38861M items_per_second=2.32744M/s
BM_WriteFloats         6601 ms         6600 ms            1 items=8.38861M items_per_second=1.27092M/s
BM_WriteBools          3714 ms         3714 ms            1 items=8.38861M items_per_second=2.25893M/s
BM_ReadStrings         3707 ms         3707 ms            1 items=8.38861M items_per_second=2.26303M/s
BM_ReadIntegers        3487 ms         3486 ms            1 items=8.38861M items_per_second=2.40618M/s
BM_ReadFloats          5930 ms         5929 ms            1 items=8.38861M items_per_second=1.4148M/s
BM_ReadBools           3489 ms         3489 ms            1 items=8.38861M items_per_second=2.40448M/s
Caveats

File Size

一个.xlsx文件本质上是一堆.zip存档中的.xml文件。在内部,OpenXLSX使用miniz库来压缩/解压.zip归档文件,结果发现miniz对于它可以处理的文件大小有一个上限。

存档中的文件(即.zip存档中的en条目,而不是存档本身)的最大允许文件大小为4 GB(未压缩)。通常,.xlsx文件/归档文件中最大的文件是保存工作表数据的.xml文件。一、 例如,工作表数据不能超过4 GB。对于那些填充了大约854-76行的整数类型,将转换为1044-76行的整数。压缩存档的大小还取决于工作表中保存的数据,以及使用的压缩算法,但单个工作表为4 GB的工作簿通常压缩大小为300-350 MB。

4GB限制只与存档中的一个条目有关,而与存档的总大小无关。这意味着,如果一个归档文件包含多个大小为4GB的条目,miniz仍然可以处理它。对于OpenXLSX,这意味着仍然可以打开包含多个大工作表的工作簿。

Memory Usage

OpenXLSX使用PugiXML库解析和操作.xlsx归档文件中的.xml文件。PugiXML是一个DOM解析器,它将整个.xml文档读入内存。这使得解析和操作速度非常快。

然而,所有的选择都有其后果,使用DOM解析器也可能需要大量内存。对于小型电子表格来说,这应该不是问题,但是如果您需要操纵大型电子表格,则可能需要大量内存。

下表给出了OpenXLSX可以处理多少列数据(假设1048576行):


Columns
8 GB RAM
8-16
16 GB RAM
32-64
32 GB RAM
128-256
你的种族可能不同。OpenXLSX的性能将取决于电子表格中的数据类型。

另请注意,建议在64位模式下使用OpenXLSX。虽然它可以很容易地在32位模式下使用,但它只能访问4GB的RAM,这将严重限制在处理大型电子表格时的实用性。


ffmpeger
关注 私信
文章
63
关注
0
粉丝
0