吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2866|回复: 24
收起左侧

[C&C++ 原创] C++操作xlsx初体验:OpenXLSX(建议使用)、libxl

  [复制链接]
hans7 发表于 2024-4-25 23:24
本帖最后由 hans7 于 2024-4-25 23:37 编辑

引言

C++操作xlsx着实麻烦,所以为此精心创作一篇文章也是很OK的吧。

本文GitHub传送门作者:hans774882968以及hans774882968以及hans774882968

本文52pojie:https://www.52pojie.cn/thread-1917834-1-1.html

本文juejin:https://juejin.cn/post/7361687968518635554

本文CSDN:https://blog.csdn.net/hans774882968/article/details/138202684

本文打算体验的库:

  • libxl。要氪金,否则使用的功能会受限。这里我就不氪了。
  • OpenXLSX

体验结果:建议使用OpenXLSX

环境

  1. Windows10 64位
  2. g++.exe (x86_64-win32-seh-rev1, Built by MinGW-Builds project) 13.1.0
  3. VSCode+CMake插件+CMake Tools插件。本项目是用CMake Tools插件创建的,过程不赘述。

如何下载高版本g++

咕果一下,找到一个现成的

VSCode修改CMake Tools插件使用的g++版本

左侧导航栏点击CMake的图标,左上角的PROJECT STATUS处有一个树形组件,其中有Configure节点,节点下有一项GCC 13.1.0 x86_64-w64-mingw32,hover会出现铅笔,点击即可修改。若没有看到你想选的编译器,可以先选择[Scan for kits]让插件先帮你找下。

执行哪个二进制文件

同上找到树形组件,其中有DebugLaunch节点,hover会出现铅笔,点击即可修改你想执行的二进制文件。

libxl

libxl官方文档并没有给出VSCode+CMake Tools如何配置,但可以参考eclipsecpp的配置文档。添加的配置如下:

# 路径必须用左斜杠分隔
include_directories(D:/libxl-4.3.0.14/include_cpp)
target_link_libraries(libxl_read_xlsx_demo D:/libxl-4.3.0.14/lib64/libxl.lib)
target_link_libraries(libxl_write_xlsx_demo D:/libxl-4.3.0.14/lib64/libxl.lib)

另外需要注意,一定记得把bin64/libxl.dll复制到exe文件所在的文件夹下,否则能编译成功,但运行时会静默失败。

示例代码看官方文档就会写了,这里就不贴出来了,只列出一些注意点。

一、Book* book = xlCreateXMLBook();用于读写07及以后版本的xlsx。

二、cmake生成的二进制文件在build文件夹下,而我的示例xlsx在根目录下,所以考虑先getcwd再拼接出所求路径:

#include <bits/stdc++.h>
#include <direct.h>
// 省略其他头文件
using namespace std::filesystem;

string get_inp_xlsx_path() {
  char* cwd_buffer = getcwd(NULL, 0);
  path p = canonical(path(cwd_buffer) / ".." / "inp" / "example.xlsx");
  return p.string();
}

三、调用canonical前需要保证路径的文件/文件夹存在。为此,我们引入了utils.h utils.cpp,并修改cmake

add_executable(libxl_write_xlsx_demo libxl_write_xlsx_demo.cpp utils.cpp utils.h)

OpenXLSX

参考其GitHub的README,我选用了最简单的方式(和参考链接1一样的方式):先复制源码到项目根目录,然后配置cmake:

add_executable(opxl_read_xlsx_demo opxl_read_xlsx_demo.cpp)
add_executable(opxl_write_xlsx_demo opxl_write_xlsx_demo.cpp utils.cpp utils.h)

add_subdirectory(OpenXLSX)

target_link_libraries(opxl_read_xlsx_demo OpenXLSX::OpenXLSX)
target_link_libraries(opxl_write_xlsx_demo OpenXLSX::OpenXLSX)

最后导入:

#include <OpenXLSX.hpp>
using namespace OpenXLSX;

于是就遇到了报错:uint32_t等未定义,需要导入cstdint。我搜索报错信息,只找到了这个issue。于是我就按照报错提示,给若干.hpp手动添加了#include <cstdint>。幸运的是,添加后就能编译成功了。

示例代码看官方Demo就会写了,这里就不贴出来了,只列出一些注意点。

一、官方Demo似乎没有给读取Excel的API,这里说一下:

void read_example_xlsx() {
  string xlsx_path = get_inp_xlsx_path();
  XLDocument doc;
  doc.open(xlsx_path);
  auto wks = doc.workbook().worksheet("Sheet1");
  read_data(wks);
}

二、和libxl不同,OpenXLSX写入的公式不会在打开Excel时自己计算好结果。libxl官方说这不是bug,是feature:

Nota that OpenXLSX does not calculate the results of a formula. If you add a formula to a spreadsheet using OpenXLSX, you have to open the spreadsheet in the Excel application in order to see the results of the calculation.

三、同理,日期写入后打开Excel文档,也是一个浮点数,需要手动调格式才能看到日期。

参考资料

  1. 配置OpenXLSX:https://blog.csdn.net/weixin_44569865/article/details/131623832

免费评分

参与人数 3吾爱币 +2 热心值 +3 收起 理由
hzh193536 + 1 + 1 热心回复!
OIOIIOOI + 1 鼓励转贴优秀软件安全工具和文档!
笙若 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cao777 发表于 2024-4-26 11:33
libxl性能很强大 对各版本vs都支持很好 就是需要氪金 而且需要引入dll库 编译时需要加入lib文件 我个人感觉还是不安全
openxsl我还是第一次听说 得空了解下
我现在用的其他方案替代的 不用第三方dll不用lib 性能比libxl稍微差点 但也很强劲 而且我做了数据的加解密
cao777 发表于 2024-10-26 08:53
Re7TJQU 发表于 2024-10-23 23:18
我现在用的其他方案替代的,具体是什么?是开源的吗

在github能搜到 比较便宜冷门
再过个十几年应该可以开放
你可以自己写一个 类似于char*数据块 具有索引功能
tfrist 发表于 2024-4-25 23:53
看来这个库封装的挺完整啊 不知道对vba读取功能如何
 楼主| hans7 发表于 2024-4-26 00:01
tfrist 发表于 2024-4-25 23:53
看来这个库封装的挺完整啊 不知道对vba读取功能如何

libxl还是OpenXLSX
tfrist 发表于 2024-4-26 00:01

OpenXLSX
 楼主| hans7 发表于 2024-4-26 00:30

没用过vba…

刚刚查了下,文档没说,但源码里能搜到VBAProject之类的字眼,感觉理论上可以读
xixicoco 发表于 2024-4-26 00:35
看来还是用python方便一些
tfrist 发表于 2024-4-26 00:38
hans7 发表于 2024-4-26 00:30
没用过vba…

刚刚查了下,文档没说,但源码里能搜到VBAProject之类的字眼,感觉理论上可以读

了解谢谢!原来用过python的库 oletools  读vba
bester 发表于 2024-4-26 08:22
libxl最大的问题就是不方便携带,不知道为啥要搞个拖油瓶,选3.8版本应该是最后非氪的了
zsj118106 发表于 2024-4-26 08:38
感谢分享,学习了
hkdxg1984 发表于 2024-4-26 09:02
感谢分享,收藏一个先~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 13:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表