在个人工程中使用OpenXLSX

介绍

OpenXLSX 是一个用于读取、编写、创建和修改 MicrosoftExcel 文件的 C + + 库,格式为.xlsx。

引入 OpenXLSX

OpenXLSX 可以被两种方式引入,分别是作为子项目集成进当前项目,以及全局安装为公共库并在此项目中引用

第一种方式适合需要修改 OpenXLSX 源码的情况,第二张方式适合 linux 或者 macos 系统。

集成进当前项目

下面这段话是 OpenXLSX 官方文档的机翻,简单描述了作为子项目集成进来的优点。

到目前为止,在您自己的项目中使用 OpenXLSX 最简单的方法是使用 CMake 自己,然后将 OpenXLSX 文件夹作为子目录添加到您自己项目的源代码树中。一些 IDE 支持 CMake 项目,最著名的是 Visual Studio 2019、 JetBrains CLion 和 Qt Creator。如果使用 VisualStudio,则必须在创建新项目时专门选择“ CMake project”。

将 OpenXLSX 库作为源子文件夹包含在内的主要好处是,不需要专门定位库和头文件; CMake 将为您解决这个问题。此外,库将使用与项目相同的配置(调试、发布等)来构建。特别是在 Windows 上,当 STL 对象通过库接口传递时,不可能在 Debug 项目中使用发布库(反之亦然) ,就像在 OpenXLSX 中一样。当包含 OpenXLSX 源代码时,这将不是一个问题。

通过在项目的 CMakeLists.txt 文件中使用 add _ subdirectory ()命令,您可以访问 OpenXLSX 的头文件和库文件。OpenXLSX 可以生成共享库或静态库。默认情况下,它将生成一个共享库,但是您可以在 OpenXLSX CMakeLists.txt 文件中更改该库。该库位于名为 OpenXLSX 的命名空间中; 因此该库的全名为 OpenXLSX: : OpenXLSX。

1、克隆代码至当前项目根目录

官方 github :

https://github.com/troldal/OpenXLSX?tab=readme-ov-file#integrating-into-a-cmake-project-structure

我的个人项目是 hnswlib ,项目位于

/home/hnswlib-master/OpenXLSX

因此我需要 cd 到项目根目录,然后执行克隆

git clone https://github.com/troldal/OpenXLSX.git OpenXLSX

2、修改项目的 CMakeLists.txt

这是官方文档给出的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cmake_minimum_required(VERSION 3.15)
project(MyProject)

set(CMAKE_CXX_STANDARD 17)

# Set the build output location to a common directory
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)

add_subdirectory(OpenXLSX)

add_executable(MyProject main.cpp)
target_link_libraries(MyProject OpenXLSX::OpenXLSX)

在 Linux 上,只需要修改这几项配置:

1
2
3
4
add_subdirectory(OpenXLSX)

add_executable(MyProject main.cpp)
target_link_libraries(MyProject OpenXLSX::OpenXLSX)

作为公共库安装到本机

如果您希望生成 OpenXLSX 二进制文件并将其包含在您的项目中,可以使用 CMake 和您选择的编译器工具链来完成。

在 Linux 上,这种集成方式可能更简单。

1、克隆项目到本机

和上面方法一样,不过克隆的位置可以自行选择。

2、编译

在命令行中,导航项目根目录的 OpenXLSX 子目录,并执行以下命令:

1
2
3
mkdir build
cd build
cmake ..

最后执行编译指令。这将使用默认工具链配置项目。如果要指定工具链,请键入 cmake-G“ < toolchain >”。.使用 < toolchain > 作为您希望使用的工具链,例如“ Unix Makefile”、“ Ninja”、“ Xcode”或“ Visual Studio 162019”。有关详细信息,请参阅 CMake 文档。

直接使用以下命令构建库一般没有问题:

1
cmake --build . --target OpenXLSX --config Release

3、安装

构建结束后,使用以下命令安装:

1
cmake --install .

这个命令将把库和头文件安装到平台上的默认位置(通常是/usr/local/on Linux and MacOS,以及 C: Program Files on Windows)。可以使用—— prefix 参数设置不同的位置。

请注意,根据不同的平台,可能无法同时安装调试库和发布库。在 Linux 和 MacOS 上,这不是一个大问题,因为发布库可以用于调试和发布可执行文件。对于 Windows 来说则不是这样,在 Windows 中,库的配置必须与链接到库的可执行文件的配置相同。出于这个原因,在 Windows 上,将 OpenXLSX 源文件夹作为子目录包含到 CMake 项目中要容易得多,这将为您省去很多麻烦。

4、引入

在自己的项目中修改 CMAKE 配置,添加库依赖,具体指令如下:

1
find_package(OpenXLSX REQUIRED)

测试

官方给出的测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <OpenXLSX.hpp>

using namespace OpenXLSX;

int main() {

XLDocument doc;
doc.create("Spreadsheet.xlsx");
auto wks = doc.workbook().worksheet("Sheet1");

wks.cell("A1").value() = "Hello, OpenXLSX!";

doc.save();

return 0;
}

可以通过新建测试文件,来测试是否集成成功。

一些问题

c++ 版本

hnswlib 默认使用的 c++ 版本为 11 ,而 OpenXLSX 的编译版本为 17 。使用主项目的 11 版本进行编译会爆出很多 C++17 语言特性不支持的错误。

因此,需要手动修改 cmake 中的编译器语言版本为 17 。具体修改如下:

1
2
3
4
5
6
7
8
9
# Examples and tests
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
option(HNSWLIB_EXAMPLES "Build examples and tests." ON)
else()
option(HNSWLIB_EXAMPLES "Build examples and tests." OFF)
endif()
if(HNSWLIB_EXAMPLES)
set(CMAKE_CXX_STANDARD 17) # 修改版本为17,适配 OpenXLSX

vsc 智能提示

如果在 VSC 中使用 OpenXLSX 库,可能会出现智能提示问题。

主要原因是 vsc 的智能提示在解析子项目的时候存在问题,这里可以通过添加引用路径的方式解决.具体修改如下

  1. ctrl + shift + p 打开 C/C++: 编辑配置(UI)

  2. 找到 包含路径 项,添加下面这行路径

1
${workspaceFolder}/OpenXLSX/**