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

news2025/2/28 19:40:29

😁博客主页😁:🚀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)
{
	// Ax
	string strA = "A" + std::to_string(lineNum);
	wks.cell(strA).value() = "Test";
	
	// Bx
	string strB = "B" + std::to_string(lineNum);
	wks.cell(strB).value() = "";
	
	// Cx
	string strC = "C" + std::to_string(lineNum);
	wks.cell(strC).value() = lineNum-2;
	
	// Dx
	string strD = "D" + std::to_string(lineNum);
	wks.cell(strD).value() = lineNum%2==0 ? true : false;
	
	// Ex
	string 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.coloradmin.cn/o/2263496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kioptix Level 2靶场练习保姆级---春不晚

1.将靶机导入至vm中 首先将靶机的网络设置为nat模式&#xff0c;然后在kali中使用arp-scan命令查找靶机ip 靶机ip为&#xff1a;61.139.2.130 arp-scan -l 2.使用nmap扫描目标ip的端口 nmap -p- 61.139.2.130 3.对存在端口进行服务版本和、系统版本、默认脚本检测 nmap -p…

电子元器件与电路之-MOS管的介绍和作用

一、基本概念 MOS 管&#xff0c;或MOSFET&#xff0c;全称是Metal-Oxide-Semiconductor Field-Effect Transistor&#xff08;金属 - 氧化物 - 半导体场效应晶体管&#xff09;。和三极管利用电流控制电流不同&#xff0c;它是一种利用电场效应来控制电流的半导体器件。和三级…

异地组网最简单的方法

01、使用硬件路由器的VPN功能 这是一种相对简单且常用的异地组网方法。你需要有支持VPN功能的路由器&#xff0c;如华硕、中兴等品牌。在主站点的路由器上配置VPN服务器&#xff0c;并在异地设备上通过操作系统自带的VPN连接功能添加一个VPN连接&#xff0c;输入主站点路由器的…

【GO环境安装】mac系统+GoLand使用

文章目录 下载安装包环境配置GoLandGo Modules 下载安装包 地址&#xff1a;GO下载地址 下载好后直接进行安装&#xff1a; 进入terminal&#xff0c;查看是否安装成功&#xff1a; 环境配置 在文稿下面创建工作目录&#xff1a; 在文稿下新建Go_Works文件夹&#xff0c;在…

点击数字层级从 admin.vue 跳转到 inviter-list.vue 组件

文章目录 1、admin.vue2、inviter-list.vue 1、admin.vue 好的&#xff0c;我们来分析一下代码中“层级”这一列的逻辑&#xff0c;并探讨它与后端的关联。 “层级” 列的逻辑 在您的代码中&#xff0c;“层级”列的渲染逻辑如下&#xff1a; <el-table-columnalign&quo…

LabVIEW实时信号采集与频谱分析

系统通过LabVIEW与PXIe硬件结合&#xff0c;实现高精度模拟信号的实时采集、频谱分析与可视化显示。核心功能包括采样率配置、快速傅里叶变换&#xff08;FFT&#xff09;、功率谱图生成及动态缩放调整&#xff0c;同时支持信号平均与噪声抑制。系统设计灵活&#xff0c;适用于…

【ComfyUI + 铅笔素描画风】艺术家DaTou发布了的彩色铅笔素描风格生成(真实感超强)

发布时间&#xff1a;2024年12月09日 项目主页&#xff1a;https://hf-mirror.com/Datou1111/shou_xin 基础模型&#xff1a;flux.1-dev comfyui工作流下载&#xff1a;https://pan.baidu.com/s/1FrLQ4o8ldckKwhIrN1Pv7g?pwd1220 自己测试 官方效果 生成猫猫 shou_xin, a m…

洛谷 B3644 【模板】拓扑排序 / 家谱树 C语言

题目&#xff1a; https://www.luogu.com.cn/problem/B3644 题目描述 有个人的家族很大&#xff0c;辈分关系很混乱&#xff0c;请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列&#xff0c;使得每个人的后辈都比那个人后列出。 输入格式 第 1 行一个整数 …

unity接入coze智能体

官网链接 coze智能体创建、设置 点击创建–选着智能体&#xff0c;随便起一个名字&#xff0c;就可以了 添加令牌 把随便起一个名字&#xff0c;设置时间&#xff0c;把所有选项都勾选上&#xff0c;一定要勾选所有团队空间&#xff0c;否则无法点击确定。 点击确定后&a…

EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3

Assignment 6Beta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsTeamwork—Beta SprintTeam NameFZUGOObjectiveSprint Essay 3_Day5-Day6 (12.15-12.16)Other Reference1. WeChat Mini Program Design Guide 2. Javascript Style Guid…

国内主流的工程项目管理软件有哪些?

随着科技的发展&#xff0c;工程管理软件已经成为了工程管理的重要工具。在国内&#xff0c;有许多优秀的工程管理软件&#xff0c;它们可以帮助我们更好地管理工程项目。那么&#xff0c;你知道有哪些工程管理软件吗&#xff1f;下面就让我们一起来盘点一下。 1、广联达 广联…

网络变压器如何识别电路

1. 基本符号的理解 曲线&#xff1a;表示变压器的线圈&#xff08;windings&#xff09;&#xff0c;每个曲线代表一个独立的线圈。 直线&#xff1a;用于连接不同的元件或引脚&#xff0c;表明电流路径。 2. 关键标注解释 CT&#xff08;Center Tap&#xff09;&#xff1a;中…

【原生js案例】ajax的简易封装实现后端数据交互

ajax是前端与后端数据库进行交互的最基础的工具&#xff0c;第三方的工具库比如jquery,axios都有对ajax进行第二次的封装&#xff0c;fecth是浏览器原生自带的功能&#xff0c;但是它与ajax还是有区别的&#xff0c;总结如下&#xff1a; ajax与fetch对比 实现效果 代码实现 …

免费开源!推荐一款网页版数据库管理工具!

免费开源&#xff01;推荐一款网页版数据库管理工具&#xff01; DBGate 是一个开源的数据库管理工具&#xff0c;DBGate 的最大特点是可以 Web 访问&#xff01;&#xff0c;轻松实现一台机器部署&#xff0c;所有人使用&#xff01; 无论是 MySQL、PostgreSQL、SQLite 还是…

主要是使用#includenlohmannjson.hpp时显示找不到文件,但是我文件已正确导入visual studio配置,也保证文件正确存在

问题&#xff1a; 主要是在项目配置中包括了C/C配置中文件位置&#xff0c;但是没有把nlohmann上一级的目录包括进去&#xff0c;导致#include"nlohmann/json.hpp"找不到文件位置 解决&#xff1a; 加上上一级目录到附加包含目录 596513661)] 总结&#xff1a; 找不…

智慧公交指挥中枢,数据可视化 BI 驾驶舱

随着智慧城市的蓬勃发展&#xff0c;公共交通作为城市运营的核心枢纽&#xff0c;正朝着智能化和数据驱动的方向演进。通过整合 CAN 总线技术(Controller Area Network&#xff0c;控制器局域网总线)、车载智能终端、大数据分析及处理等尖端技术&#xff0c;构建的公交“大脑”…

[c++11(二)]Lambda表达式和Function包装器及bind函数

1.前言 Lambda表达式着重解决的是在某种场景下使用仿函数困难的问题&#xff0c;而function着重解决的是函数指针的问题&#xff0c;它能够将其简单化。 本章重点&#xff1a; 本章将着重讲解lambda表达式的规则和使用场景&#xff0c;以及function的使用场景及bind函数的相关使…

redis数据类型:list

list 的相关命令配合使用的应用场景&#xff1a; 栈和队列&#xff1a;插入和弹出命令的配合&#xff0c;亦可实现栈和队列的功能 实现哪种数据结构&#xff0c;取决于插入和弹出命令的配合&#xff0c;如左插右出或右插左出&#xff1a;这两种种方式实现先进先出的数据结构&a…

基于51单片机的验证码收发系统的仿真设计

一、设计要求 主机、从机均以AT89C52单片机为控制核心。主机生成6位随机验证码、并将验证码发送给从机&#xff1b;从机输入验证码发送给主机&#xff0c;主机接收来自从机发送的验证码并核对两个验证码是否一致。 二、设计内容 主机通过独立按键生成6位随机验证码并发送给从…

WPF实现曲线数据展示【案例:震动数据分析】

wpf实现曲线数据展示&#xff0c;函数曲线展示&#xff0c;实例&#xff1a;震动数据分析为例。 如上图所示&#xff0c;如果你想实现上图中的效果&#xff0c;请详细参考我的内容&#xff0c;创作不易&#xff0c;给个赞吧。 一共有两种方式来实现&#xff0c;一种是使用第三…