【C++读写.xlsx文件】OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰: 2024-12-17 22:23:37

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、OpenXLSX 介绍
  • 🎄三、下载 OpenXLSX
  • 🎄四、编译 OpenXLSX
    • ✨4.1 更新 cmake
    • ✨4.2 OpenXLSX在 Ubuntu18.04 编译
    • ✨4.3 OpenXLSX在 Ubuntu18.04 交叉编译
  • 🎄五、使用 OpenXLSX
  • 🎄六、总结


在这里插入图片描述

在这里插入图片描述

🎄一、概述

最近项目需要将日志写到.xlsx中,了解到C和C++的操作.xlsx几个开源库:
在这里插入图片描述
本文主要介绍OpenXLSX在Ubuntu 18.04 下的编译和使用。


在这里插入图片描述

🎄二、OpenXLSX 介绍

OpenXLSX是一款用于读取、写入、创建和修改Microsoft Excel®文件的C++库,支持.xlsx格式。经过一段长时间的沉寂后,作者于2024.05决定重启开发开放XLSX项目。代码已被彻底清理,并修复了大量错误。该库已在Windows、macOS及Linux上进行了测试,确保在所有平台上正常运行。

OpenXLSX在GitHub的开源地址:https://github.com/troldal/OpenXLSX

目前,OpenXLSX仅依赖以下第三方库:

  • PugiXML
  • Zippy(miniz的C++封装)
  • Boost.Nowide(用于在Windows平台打开非ASCII命名文件)

OpenXLSX采用CMake作为构建系统(确切地说是构建系统生成器)。

OpenXLSX的功能及状态
OpenXLSX 正处于研发阶段。以下列出的功能已实施并应正常运作:

  • 创建/打开/保存文件
  • 读取/写入/修改单元格内容
  • 复制单元格与区域
  • 复制工作表
  • 单元格区域和迭代器
  • 行范围及迭代器

至于格式化、图表和图像相关的功能尚未实现,短期内也暂无计划。

需特别说明的是,目前创建常量 XLDocument 对象的功能尚不支持!

压缩库
Excel文件本质上是一系列.xml文件打包在一个.zip存档中。OpenXLSX使用第三方库从.zip存档中提取.xml文件。默认使用的库是Zippy,它是一个围绕miniz库的对象化包装器。miniz库速度快,且仅包含头文件,非常适合OpenXLSX。

使用Zippy/miniz库无需特殊操作,开箱即用。

然而,如果你愿意,也可以选择使用不同的压缩库。在极少数情况下,你可能会遇到与miniz相关的稳定性问题,此时尝试使用其他压缩库可能是有益的。


在这里插入图片描述

🎄三、下载 OpenXLSX

OpenXLSX 可以在GitHub下载,地址是:https://github.com/troldal/OpenXLSX

在Tags里的不是最新版本,需要按照下图去下载其最新版本,下载后文件名为:OpenXLSX-master.zip

在这里插入图片描述


在这里插入图片描述

🎄四、编译 OpenXLSX

✨4.1 更新 cmake

OpenXLSX 采用 cmake 来编译,并且要求 cmake 的版本大于3.15,否则会报错,而 Ubuntu18.04 的 cmake 为3.10.2,所以会报如下错误:

CMake Error at CMakeLists.txt:4 (cmake_minimum_required):CMake 3.15 or higher is required.  You are running version 3.10.2
-- Configuring incomplete, errors occurred!

需要更新 cmake ,可以参考这篇文章:Ubuntu 18.04 更新 cmake 到最新版本 3.31.2


✨4.2 OpenXLSX在 Ubuntu18.04 编译

下面是完整的编译过程shell命令,

unzip OpenXLSX-master.zip
cd OpenXLSX-master
mkdir build_gcc
cd build_gcc
cmake ..  -DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_INSTALL_PREFIX=`pwd`/../../result_gcc
make
make install

编译完成后,在 build_gcc 目录会有如下内容,其中 output/ 目录存放了一些使用例子:
在这里插入图片描述


✨4.3 OpenXLSX在 Ubuntu18.04 交叉编译

下面是使用海思交叉工具链aarch64-mix210-linux-g++交叉编译的shell命令:

unzip OpenXLSX-master.zip
cd OpenXLSX-master
mkdir build_mix210
cd build_mix210
cmake ..  -DCMAKE_CXX_COMPILER=aarch64-mix210-linux-g++ \
-DCMAKE_INSTALL_PREFIX=`pwd`/../../result_mix210
make
make install

在这里插入图片描述

🎄五、使用 OpenXLSX

OpenXLSX 源码中有个 Examples 目录,里面有 8 个例子介绍了怎样使用 OpenXLSX 来操作 .xlsx 文件。感兴趣的可以看看,代码也不难理解。这里介绍一下怎样单独编译这些例子,虽然 cmake 时帮我们编译了,但是了解怎样去单独编译也是有益的。下面以编译 Demo1.cpp 为例,进入 Examples 目录,执行下面命令可以单独编译 Demo1.cpp。

g++ Demo1.cpp -I ../result_gcc/include/OpenXLSX/ -I ./ -std=c++17 ../result_gcc/lib/libOpenXLSX.a

我的项目只需要了解怎样写入就行了,下面是使用 OpenXLSX 写 .xlsx 文件的例子,仅供参考:

// myXlsxWrite.cpp
#include <OpenXLSX.hpp>
#include <iostream>using namespace std;
using namespace OpenXLSX;void writeRow(auto wks, int lineNum)
{// Axstring strA = "A" + std::to_string(lineNum);wks.cell(strA).value() = "Test";// Bxstring strB = "B" + std::to_string(lineNum);wks.cell(strB).value() = "";// Cxstring strC = "C" + std::to_string(lineNum);wks.cell(strC).value() = lineNum-2;// Dxstring strD = "D" + std::to_string(lineNum);wks.cell(strD).value() = lineNum%2==0 ? true : false;// Exstring strE = "E" + std::to_string(lineNum);wks.cell(strE).value() = 3.14159265358979323846;
}int main()
{XLDocument doc;doc.create("./xlsxWrite.xlsx");auto wks = doc.workbook().worksheet("Sheet1");wks.cell("A1").value() = "Col1";wks.cell("B1").value() = "Col2";wks.cell("C1").value() = "Col3";wks.cell("D1").value() = "Col4";wks.cell("E1").value() = "Col5";for(int i=0; i<1000; i++){writeRow(wks, i+2);}doc.save();doc.close();return 0;
}

编译:

g++ myXlsxWrite.cpp -I ./result_gcc/include/OpenXLSX/ ./result_gcc/lib/libOpenXLSX.a -std=c++17

注意:必须要支持 C++17 编译器才可以,且需要加-std=c++17
运行后会生成xlsxWrite.xlsx,内容如下:
在这里插入图片描述


如果报如下错误,是缺少头文件:

In file included from ./result_gcc/include/OpenXLSX/headers/XLCellValue.hpp:64:0,from ./result_gcc/include/OpenXLSX/headers/XLCell.hpp:60,from ./result_gcc/include/OpenXLSX/OpenXLSX.hpp:49,from myXlsxWrite.cpp:1:
./result_gcc/include/OpenXLSX/headers/XLXmlParser.hpp:50:10: fatal error: external/pugixml/pugixml.hpp: 没有那个文件或目录#include <external/pugixml/pugixml.hpp> // not sure why the full include path is needed within the header file^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

执行下面命令复制对应头文件:

cp OpenXLSX-master/OpenXLSX/external/ ./result_gcc/include/OpenXLSX/ -far

在这里插入图片描述

🎄六、总结

本文介绍 OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译以及使用教程。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
https://blog.csdn.net/qq_37371407/article/details/141135709
https://gitcode.com/gh_mirrors/op/OpenXLSX/overview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494278.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据、人工智能、云计算、物联网、区块链序言【大数据导论】

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;大数据入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 这是目…

ffmpeg翻页转场动效的安装及使用

文章目录 前言一、背景二、选型分析2.1 ffmpeg自带的xfade滤镜2.2 ffmpeg使用GL Transition库2.3 xfade-easing项目三、安装3.1、安装依赖([参考](https://trac.ffmpeg.org/wiki/CompilationGuide/macOS#InstallingdependencieswithHomebrew))3.2、获取ffmpeg源码3.3、融合xf…

什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?

将业界领先的 SOLIDWORKS 3D CAD 解决方案连接到基于单一云端产品开发环境 3DEXPERIENCE 平台。您的团队、数据和流程全部连接到一个平台进行高效的协作工作&#xff0c;从而能快速的做出更好的决策。 目 录&#xff1a; ★ 1 什么是3DEXPERIENCE SOLIDWORKS ★ 2 3DEXPERIE…

如何正确计算显示器带宽需求

1. 对显示器的基本认识 一个显示器的参数主要有这些&#xff1a; 分辨率&#xff1a;显示器屏幕上像素点的总数&#xff0c;通常用横向像素和纵向像素的数量来表示&#xff0c;比如19201080&#xff08;即1080p&#xff09;。 刷新率&#xff1a;显示器每秒钟画面更新的次数&…

leetcode212. 单词搜索 II

给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。 单词必须按照字母顺序&#xff0c;通过 相邻的单元格 内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一…

CTFHUB 历年真题 afr-1

发现传参为 ?phello&#xff0c;尝试 ?pflag 发现都是 no 尝试假设它是个PHP文件&#xff0c;利用php伪协议 ?pphp://filter/readconvert.base64-encode/resourceflag 得到 base64 编码再解码发现了本题的 flag n1book{afr_1_solved}

重拾设计模式--备忘录模式

文章目录 备忘录模式&#xff08;Memento Pattern&#xff09;概述定义&#xff1a; 作用&#xff1a;实现状态的保存与恢复支持撤销 / 恢复操作 备忘录模式UML图备忘录模式的结构原发器&#xff08;Originator&#xff09;&#xff1a;备忘录&#xff08;Memento&#xff09;&…

5G -- 5G网络架构

5G组网场景 从4G到5G的网络演进&#xff1a; 1、UE -> 4G基站 -> 4G核心网 * 部署初中期&#xff0c;利用存量网络&#xff0c;引入5G基站&#xff0c;4G与5G基站并存 2、UE -> (4G基站、5G基站) -> 4G核心网 * 部署中后期&#xff0c;引入5G核心网&am…

前端开放性技术面试—面试题

1. 上线出现问题如何解决&#xff1f; 步骤&#xff1a; 立即响应&#xff1a;迅速确认问题的存在和影响范围。回滚&#xff1a;如果问题严重影响用户&#xff0c;考虑立即回滚到上一个稳定版本。日志分析&#xff1a;查看服务器日志、应用日志和前端日志&#xff0c;定位问题…

详细ECharts图例3添加鼠标单击事件的柱状图

<!DOCTYPE html><html><head><meta charset"UTF-8"><script src"js/echarts.js"></script> <!-- 确保路径正确 --><title>添加鼠标单击事件的柱状图</title></head><body><div id&q…

R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)

1. 上下标 # 注意y轴标签文字 library(ggplot2) ggplot(mtcars, aes(mpg, cyl))geom_point()ylab(label bquote(O[3]~(ug / m^3)))2. 希腊字母&#xff0c;如alpha ggplot(mtcars, aes(mpg, cyl))geom_point()ylab(label bquote(O[3]~(ug / m^3)))ggtitle(expression(alpha))…

精通Redis

目录 1.NoSQL 非关系型数据库 2.Redis 3.Redis的java客户端 4.Jedis 4.1Jedis快速入门 4.2Jedis连接池及使用 5.SpringDataRedis和RedisTemplate 6.SpringDataRedis快速入门 7.RedisSerializer 1.NoSQL 非关系型数据库 基础篇-02.初始Redis-认识NoSQL_哔哩哔哩_bilib…

VR线上展厅的色彩管理如何影响用户情绪?

VR线上展厅的色彩管理对用户情绪的影响是多方面的&#xff0c;以下是专业从事VR线上展厅制作的圆桌3D云展厅平台为大家介绍的一些关键点&#xff1a; 情感共鸣&#xff1a;色彩能够激发特定的情感反应。例如&#xff0c;暖色调&#xff08;如红色、橙色&#xff09;通常与活力和…

上传文件(vue3)

使用el-upload 先上传到文件服务器&#xff0c;生成url 然后点击确定按钮&#xff1a; 保存数据 <template><el-dialog top"48px" width"500" title"新增协议" :modelValue"visible" close"handleClose()">…

GM_T 0039《密码模块安全检测要求》题目

单项选择题 根据GM/T 0039《密码模块安全检测要求》,送检单位的密码模块应包括()密码主管角色。 A.一个 B.两个 C.至少一个 D.至少两个 正确答案:C 多项选择题 根据GM/T 0039《密码模块安全检测要求》,关于非入侵式安全,以下属于安全三级密码模块要求的是()。 …

AI的进阶之路:从机器学习到深度学习的演变(四)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;三&#xff09; 五、深度学习的应用领域 深度学习的应用领域广泛&#xff0c;涵盖了计算机视觉、自然语言处理、语音识别和推荐系统等多个方面。以下将详细探讨这些关键应用领域&#xff0c;展示深度学习在不同…

mysql-主从同步与读写分离

一、mysql主从同步原理 mysql主从是用于数据灾备。也可以缓解服务器压力(读写分离)&#xff0c;即为主数据库服务器增加一个备服务器&#xff0c; 两个服务器之间通过mysql主从复制进行同步&#xff0c;这样一台服务器有问题的情况下可以切换到另一台服务器继续使用。 如何想实…

【工具】通过js获取chrome浏览器扩展程序列表id及名称等

【工具】通过js获取chrome浏览器扩展程序列表id及名称等 第一步 打开扩展程序页面 chrome://extensions/ 第二部 注入js获取 let 扩展字典 {} document.querySelector("body > extensions-manager").shadowRoot.querySelector("#items-list").shadow…

GO--堆(have TODO)

堆 堆&#xff08;Heap&#xff09;是一种特殊的数据结构。它是一棵完全二叉树&#xff08;完全二叉树是指除了最后一层外&#xff0c;每一层上的节点数都是满的&#xff0c;并且最后一层的节点都集中在左边&#xff09;&#xff0c;结放在数组&#xff08;切片&#xff09;中…

springboot根据租户id动态指定数据源

代码地址 码云地址springboot根据租户id动态指定数据源: springboot根据租户id指定动态数据源,结合mybatismysql多数源下的事务管理 创建3个数据库和对应的表 sql脚本在下图位置 代码的执行顺序 先设置主数据库的数据源配置目标数据源和默认数据源有了主库的数据源&#xff…