OpenXLSX是一个C++库,用于读取、写入、创建和修改.xlsx格式的Microsoft Excel文件,源码地址:https://github.com/troldal/OpenXLSX ,License为BSD-3-Clause,可在Windows、Linux、MaCOS平台上使用。最新发布版本为v0.3.2,发布版本已严重过时,使用master分支编译源码

      1. OpenXLSX依赖的第三方库:PugiXML、Zippy和Boost.Nowide,这些库均为头文件,已包含在代码库中,无需单独下载和构建。

      2. OpenXLSX的重点是速度,而不是内存占用。

      3. OpenXLSX使用CMake作为构建系统,OpenXLSX可以生成动态库或静态库,默认为静态库。

      4. OpenXLSX中的所有字符串操作和使用都使用C++ std::string,它与编码无关,但可以用于UTF-8编码。此外,Excel内部使用UTF-8编码。

      Windows10上通过CMake编译源码,shell脚本内容如下:build.sh存放在OpenXLSX根目录下

#! /bin/bashif [ $HOSTTYPE != "x86_64" ]; thenecho_error "only support x86_64 architecture: current architecture: $HOSTTYPE"
fiif [[ "$OSTYPE" != "msys" ]] && [[ "$OSTYPE" != "cygwin" ]]; thenecho_error "unsupported platform: $OSTYPE"exit -1
firesult_judgment()
{rc=$?if [[ ${rc} != 0 ]]; thenecho -e "\033[0;31mError: there are some errors in the above operation, please check: ${rc}\033[0m"exit ${rc}fi
}echo_error()
{echo -e "\033[0;31mError: $1\033[0m"
}if [ $# != 1 ]; thenecho_error "requires a parameter: Release or Debug\n  For example: $0 Debug"exit -1
fiif [ $1 != "Release"  ] && [ $1 != "Debug" ]; thenecho_error "the parameter can only be Release or Debug"exit -1
fimkdir -p build && cd buildcmake \-G"Visual Studio 17 2022" -A x64 \-DCMAKE_BUILD_TYPE=$1 \-DCMAKE_CONFIGURATION_TYPES=$1 \-DCMAKE_INSTALL_PREFIX=../install/$1 \..
result_judgmentcmake --build . --target install --config $1
result_judgment
cd ../mkdir -p install/$1/include/external
cp -a OpenXLSX/external/pugixml install/$1/include/externalecho -e "\033[0;32mbuild completed\033[0m"

      1. Debug库,执行:./build.sh Debug

      2. Release库,执行:./build.sh Release

      3. :因为在XLXmlParser.hpp中include了<external/pugixml/pugixml.hpp>,因此需要将external中的pugixml目录拷贝到install的include目录下

      解析excel文件的测试代码如下:

int test_openxlsx_parse()
{constexpr char file_name[]{ "../../../testdata/测试.xlsx" };try {OpenXLSX::XLDocument doc;doc.open(gbk_to_utf8(file_name));auto workbook = doc.workbook();auto worksheet_names = workbook.worksheetNames();if (worksheet_names.size() == 0) {std::cerr << "Error: no worksheet: " << file_name << std::endl;return -1;}std::cout << "worksheet names: ";for (const auto& name : worksheet_names) {std::cout << utf8_to_gbk(name) << ", ";}std::cout << std::endl;auto worksheet_name = worksheet_names[0];auto worksheet = workbook.worksheet(worksheet_name);if (worksheet.rowCount() == 0) {std::cerr << "Error: excel table is empty: " << file_name << std::endl;return -1;}auto range = worksheet.range();auto rows = range.numRows();auto cols = range.numColumns();std::cout << "file name: " << file_name << ", work sheet name: " << utf8_to_gbk(worksheet_name) << ", rows: " << rows << ", cols: " << cols << std::endl;std::string str{};for (auto row = 1; row <= rows; ++row) {for (auto col = 1; col <= cols; ++col) {auto cell = worksheet.cell(row, col);if (cell.value().type() == OpenXLSX::XLValueType::String) {str = cell.value().get<std::string>();std::cout << utf8_to_gbk(str) << "\t";}else if (cell.value().type() == OpenXLSX::XLValueType::Integer) {std::cout << cell.value().get<int64_t>() << "\t";}else if (cell.value().type() == OpenXLSX::XLValueType::Float) {std::cout << cell.value().get<float>() << "\t";}}std::cout << std::endl;}const std::vector<std::string> header_row{ "代码", "-200大", "序号", "库存(T)", "名称" };for (auto col = 1; col <= cols; ++col) {auto cell = worksheet.cell(1, col);for (auto i = 0; i < header_row.size(); ++i) {if (cell.value().type() == OpenXLSX::XLValueType::String) {if (utf8_to_gbk(cell.value().get<std::string>()) == header_row[i]) {std::cout << "第 " << col << " 列表示:" << header_row[i] << std::endl;break;}}}}doc.close();}catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;return -1;}return 0;
}

      excel文件测试.xlsx内容如下:

      执行结果如下图所示:

      创建excel文件测试代码如下:

int test_openxlsx_create()
{constexpr char file_name[]{ "../../../testdata/创建.xlsx" };try {OpenXLSX::XLDocument doc;doc.create(gbk_to_utf8(file_name), OpenXLSX::XLForceOverwrite);auto workbook = doc.workbook();constexpr char sheet_name[]{ "信息" };workbook.addWorksheet(gbk_to_utf8(sheet_name));constexpr char default_sheet[]{ "Sheet1" };if (workbook.worksheetExists(default_sheet)) {workbook.deleteSheet(default_sheet);}const std::vector<std::string> header_row{ "序号","名称", "代码", "-200大",	"库存(T)" };using info = std::tuple<int, std::string, std::string, float, float>;const std::vector<info> infos{{1, "铁矿", "DAV382", 232.1, 10},{2, "Tiger", "234SCS", 2334, 18.5},{3, "香蕉B", "2349CX", 233.5, -192.4},{4, "Apple号", "232398", 8.48, 23} };auto worksheet = workbook.worksheet(gbk_to_utf8(sheet_name));int col = 1;for (const auto& value : header_row) {worksheet.cell(1, col).value() = gbk_to_utf8(value);++col;}auto float_to_string = [](float value) {std::ostringstream oss;oss << value;return oss.str();};int row = 2;for (const auto& [num, str1, str2, f1, f2] : infos) {worksheet.cell(row, 1).value() = num;worksheet.cell(row, 2).value() = gbk_to_utf8(str1);worksheet.cell(row, 3).value() = gbk_to_utf8(str2);worksheet.cell(row, 4).value() = f1; // 注:直接赋值f1,在excel表中显示与原始值有差异;使用float_to_string(f1)又会导致再次解析时此数据类型为string而不是floatworksheet.cell(row, 5).value() = f2;++row;}doc.save();doc.close();}catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;return -1;}return 0;
}

      运行程序,生成的excel文件创建.xlsx内容如下:

      辅助函数内容如下:

inline std::string gbk_to_utf8(const std::string& str)
{// gbk to wcharauto len = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, nullptr, 0);std::wstring wstr(len, 0);::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &wstr[0], len);// wchar to utf8len = ::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);std::string u8str(len, 0);::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &u8str[0], len, nullptr, nullptr);u8str.pop_back(); // remove '\0'return u8str;
}inline std::string utf8_to_gbk(const std::string& u8str)
{// utf8 to wcharauto len = ::MultiByteToWideChar(CP_UTF8, 0, u8str.c_str(), -1, nullptr, 0);std::wstring wstr(len, 0);::MultiByteToWideChar(CP_UTF8, 0, u8str.c_str(), -1, &wstr[0], len);// wchar to gbklen = ::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);std::string str(len, 0);::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &str[0], len, nullptr, nullptr);str.pop_back(); // remove '\0' return str;
}

      :调用OpenXLSX接口时

      1. 行、列索引从1开始

      2. 中文文件名或excel表中带有中文的需额外处理

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

【C++】C++11 篇二

【C】C11 篇二前言移动构造函数移动赋值运算符重载类成员变量初始化 &#xff08;缺省值出自C11强制生成默认函数的关键字default:禁止生成默认函数的关键字delete:继承和多态中的final与override关键字&#xff08;出自C11可变参数模板递归函数方式展开参数包逗号表达式展开参…

构建Python环境的几种工具

本文主要介绍如何构建Python环境来处理不同的工作。 1.常用的构建Python环境的工具 ①venv(内置模块):Python 3.3 内置标准库模块&#xff0c;无需额外安装。 ②virtualenv:venv的前身&#xff0c;功能更强大且支持旧版Python。 ③conda:来自 Anaconda 或 Miniconda。不仅能…

c#项目编译时外部依赖文件的同步问题

很多场景因为资源文件太多或太大无法放到资源里面或者是依赖的dll文件&#xff0c;需要编译时同步到bin\debug或bin\release下的&#xff0c;这里面要修改工程文件代码实现。 比如&#xff0c;我把这个项目依赖的dll和附加文件放到ref_dll文件夹里面&#xff0c;希望编译的时候…

数学建模常用算法-模拟退火算法

一、模拟退火算法模拟退火的灵感来源于物理中的 “退火过程”—— 将金属加热到高温后&#xff0c;缓慢冷却&#xff0c;金属原子会在热能作用下自由运动&#xff0c;逐渐形成能量最低的稳定结构。算法将这一过程抽象为数学模型&#xff1a;“温度 T”&#xff1a;对应物理中的…

架构很简单:业务架构图

缘起业务架构是一个复杂的体系&#xff0c;如何更简单的表达&#xff0c;并能使用起来呢&#xff1f;所谓&#xff1a;大道至简。基于此&#xff0c;这篇文章就开始了。业务是一切架构的开始&#xff0c;如果没有业务&#xff0c;架构又有什么作用呢&#xff1f;所以做架构首先…

【前端埋点】纯前端实现 A/B Test

“纯前端实现 A/B Test”&#xff0c;意思就是 没有后端分流、也不依赖流量网关&#xff0c;那么只能靠前端逻辑来做“流量切分”。 &#x1f3af; 目标 80% 的用户 → A 页面20% 的用户 → B 页面且要保证 同一个用户每次访问结果一致&#xff08;否则用户刷新页面时 A/B 会跳…

Day22_【机器学习—集成学习(3)—Boosting—Adaboost算法】

Adaptive Boosting(自适应提升)是基于 Boosting思想实现的一种集成学习算法&#xff0c;核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。一、Adaboost算法直线相当于一个弱学习器&#xff0c;正确的数据权重减小&#xff0c;错误的数据权重增加二…

C#语言入门详解(18)传值、输出、引用、数组、具名、可选参数、扩展方法

C#语言入门详解&#xff08;18&#xff09;传值、输出、引用、数组、具名、可选参数、扩展方法一、传值参数1. 值类型2. 引用类型&#xff0c;并且创建对象3. 引用类型&#xff0c;不创建对象二、引用参数1. 值类型2. 引用类型&#xff0c;创建新对象3. 引用类型&#xff0c;不…

模型部署:(二)安卓端部署Yolov5-v6.0目标检测项目全流程记录

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目标检测项目全流程记录1、下载NCNN项目2、下载基于安卓的yolov5项目3、修改相应的配置文件4、将项目打包成apk包5、部署自己训练的yolov5模型6、相关资料下载&#xff1a;1、下载NCNN项目 # 链接地址 ht…

图形基础算法:如何将点与带曲线边的多边形位置关系算法做稳定

简介判断点与多边形位置关系算法是几何算法中最基础的算法之一&#xff0c;包括布尔运算在内的非常非常多的算法都会用到它。它的稳定是算法库稳定的关键。下面我们从一个边都是直线的多边形开始了解射线法的原理。然后看看引入曲线后会带来哪些问题&#xff0c;以及在实际应用…

react的filber架构

好问题 &#x1f44d; 你问的是 React Fiber 架构。这是 React 16 引入的核心机制&#xff0c;用来解决 React 在大规模更新时的性能问题。下面我给你从 背景 → Fiber 是什么 → 原理 → 优点 → 流程 来系统讲。一、为什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

Lucky STUN穿透结合群晖NAS实现docker下transmission监听端口动态更新

参考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自动修改 Transmission 的监听端口 二 「LUCKY STUN穿透」使用 Webhook 自动修改 qbittorrent 的监听端口 三 LUCKY STUN穿透在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则 四「LUCKY STUN穿透」…

如何在Ubuntu畅玩鸣潮等游戏

本教程只包括Steam上的游戏。# 更新软件源 sudo apt update # 安装Steam sudo apt install steam首先&#xff0c;在Ubuntu的snap商店安装Steam&#xff0c;启动&#xff0c;登陆&#xff0c;下载游戏。到这里的操作都比较简单&#xff0c;对于没有反作弊的游戏&#xff0c;往往…

机器学习09——聚类(聚类性能度量、K均值聚类、层次聚类)

上一章&#xff1a;机器学习08——集成学习 下一章&#xff1a;机器学习10——降维与度量学习 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、聚类任务&#xff08;无监督学习…

解决 Docker 构建中 Python 依赖冲突的完整指南

问题背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 镜像构建 Docker 容器时,我们遇到了一个常见的 Python 依赖管理问题: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

光子计算芯片实战:Lightmatter Passage互连架构性能评测

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 随着人工智能计算需求呈指数级增长&#xff0c;传统电子计算…

基于树莓派与Jetson Nano集群的实验边缘设备上视觉语言模型(VLMs)的性能评估与实践探索

概述 2018年&#xff0c;TensorFlow Lite团队的Pete Warden曾提出&#xff1a;“机器学习的未来在于微型化”。如今&#xff0c;随着人工智能向高性能视觉强大的视觉语言模型&#xff08;Vision-language models, VLMs&#xff09;发展&#xff0c;对高性能计算资源的需求急剧…

华为Ai岗机考20250903完整真题

华为Ai岗机考20250903 华为自26届秋招&#xff08;2025年起&#xff09;对AI岗位机考进行了改革&#xff0c;考试题型调整为20道选择题&#xff08;15道单选(6分)5道不定项选择(12分)&#xff09;2道编程题(150300)。 题目核心围绕人工智能技术&#xff08;如Transformer架构…

k8s+jenkins+harbor构建Devops平台

一、环境准备1、准备一主一从k8s机器&#xff0c;&#xff08;设备好可以一主多从也行&#xff09;2、一台harbor仓库机器&#xff08;dockerhub访问不了&#xff09;二、安装nfs服务1、在k8s机器上yum install nfs-utils -y systemctl start nfs systemctl enable nfs2、创建共…

为什么 socket.io 客户端在浏览器能连上,但在 Node.js 中报错 transport close?

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…