Ubuntu环境下基于libxl库文件使用C++实现对表格的操作
功能
- 表格不存在则创建后再进行操作
- 创建sheet添加新的工作表
- 在sheet中增加数据
- 设置单元格样式
相关配置
- 下载地址:libxl
- 选择 LibXL for Linux 4.2.0 i386 x64 armhf aarch64
安装配置
- 1,使用 tar zxvf 文件名.tar.gz 进行文件解压
- 2,创建 /usr/local/libxl/lib64目录,将libxl\libxl-4.2.0\lib64文件夹下的libxl.so库文件拷贝到刚才创建的目录下
- 3,创建 /usr/local/include/libxl目录,将libxl\libxl-4.2.0\include_cpp文件夹下的头文件拷贝到刚才创建的目录下
Clion配置
cmake_minimum_required(VERSION 3.23)
project(libxl_test)set(CMAKE_CXX_STANDARD 11)# 指定lib目录
link_directories(/usr/local/libxl/lib64)# 指定头文件搜索策略
include_directories(/usr/local/include/libxl)add_executable(libxl_test main.cpp)target_link_libraries(${PROJECT_NAME} xl z)# g++ -o ExcelOutputProgram ExcelOutputProgram.cpp -lxl -lz
代码
#include <iostream>
#include <ctime>
#include <chrono>
#include <fstream>
#include <libxl/libxl.h>#define filename "/home/chy-cpabe/CLionProjects/libxl_test/output.xlsx"bool fileExists(const std::string& excel_file) {std::ifstream file(excel_file);return file.good(); // 如果文件存在,file.good() 返回 true
}/*** @brief 填写表格内容** @param USBKey_info Book handle* @param sheet sheet handle* @param DEVINFO_SerialNumber USBKey序列号* @param Signing_Certificate_SerialNumber 签名证书序列号* @return 0:成功;-1:失败*/
int write_excel_content(libxl::Book *USBKey_info,libxl::Sheet *sheet,std::string DEVINFO_SerialNumber,std::string Signing_Certificate_SerialNumber)
{// 插入相关字段信息int nextRowIndex = sheet->lastRow();// 确定下一个可用的行索引sheet->writeStr(nextRowIndex, 0, DEVINFO_SerialNumber.c_str());sheet->writeStr(nextRowIndex, 1,Signing_Certificate_SerialNumber.c_str());// 获取当前系统时间auto now = std::chrono::system_clock::now();// 将系统时间转化为 time_t 样式std::time_t currentTime = std::chrono::system_clock::to_time_t(now);// 将time_t转化为tm结构体std::tm *localTime = std::localtime(¤tTime);// 提取年月日等时间信息int year = localTime->tm_year + 1900; // Years since 1900int month = localTime->tm_mon + 1; // Months start from 0int day = localTime->tm_mday;int hour = localTime->tm_hour;int minute = localTime->tm_min;// 设置格式 (每列列宽30并居中显示) 并填充数据libxl::Format* format2 = USBKey_info->addFormat();format2->setNumFormat(libxl::NUMFORMAT_CUSTOM_MDYYYY_HMM);format2->setAlignH(libxl::ALIGNH_CENTER);sheet->writeNum(nextRowIndex, 2, USBKey_info->datePack(year,month,day,hour,minute),format2);}/*** @brief 填写Excel表格** @param increase_sheet 是否增加工作表* @param sheetName_new 如果increase_sheet为true,接收工作表的名字* @param DEVINFO_SerialNumber USBKey序列号* @param Signing_Certificate_SerialNumber 签名证书序列号* @return 0:成功;-1:失败*/
int write_excel(bool increase_sheet,std::string sheetName_new,std::string DEVINFO_SerialNumber,std::string Signing_Certificate_SerialNumber){libxl::Book *USBKey_info = xlCreateXMLBook();//Excel文件是否存在if (!fileExists(filename)) {// 创建Excel 文件if (USBKey_info->save(filename)) {std::cout << "excel表格创建成功!" << std::endl;} else {std::cout << "excel表格创建失败!" << std::endl;}}//创建表格USBKey_info->load(filename);//增加sheetif (increase_sheet == true){// 添加新的工作表并命名libxl::Sheet *sheet = USBKey_info->addSheet(sheetName_new.c_str());if (sheet) {//表格样式处理 (每列列宽30并居中显示)libxl::Format* centerAlign = USBKey_info->addFormat();centerAlign->setAlignH(libxl::ALIGNH_CENTER);sheet->setCol(0, 2, 30, centerAlign);// 创建工作表的标题sheet->writeStr(1, 0, "DEVINFO SerialNumber");sheet->writeStr(1, 1, "Signing Certificate SerialNumber");sheet->writeStr(1, 2, "Date");// 插入相关字段信息write_excel_content(USBKey_info, sheet,DEVINFO_SerialNumber,Signing_Certificate_SerialNumber);} else{std::cerr << "新增 使用用户指定名称创建sheet的索引失败!" << std::endl;return false;}}else{//利旧 获取最后一个sheet的索引int sheetCount = USBKey_info->sheetCount()-1;libxl::Sheet *sheet = USBKey_info->getSheet(sheetCount);if (sheet){// 插入相关字段信息write_excel_content(USBKey_info, sheet,DEVINFO_SerialNumber,Signing_Certificate_SerialNumber);} else{std::cerr << "利旧 获取最后一个sheet的索引失败!" << std::endl;return false;}}// 保存 Excel 文件if (USBKey_info->save(filename)) {std::cout << "Excel 文件成功保存" << std::endl;} else {std::cout << "Excel 文件保存失败" << std::endl;}// 释放资源USBKey_info->release();return 0;
}int main() {printf("请输入要创建的工作表名称:\n");std::string sheetName; // 用户输入的工作表名称std::cin >> sheetName; // 接收用户输入的工作表名称std::string DEVINFO_SerialNumber{"00FF4821104E2607"};std::string Signing_Certificate_SerialNumber{"4495"};//测试1: 文件不存在新建,强制删除文件即可write_excel(true,sheetName,DEVINFO_SerialNumber,Signing_Certificate_SerialNumber);//测试2: 文件存在//sheet新建write_excel(true,"new1",DEVINFO_SerialNumber,Signing_Certificate_SerialNumber);//sheet追加write_excel(false,"new",DEVINFO_SerialNumber,Signing_Certificate_SerialNumber);return 0;
}
结果展示

注意
- sheet新建需要保证每个sheet的name是不一样的,重名会出错
//测试2: 文件存在//sheet新建write_excel(true,"new1",DEVINFO_SerialNumber,Signing_Certificate_SerialNumber);
相关文章:
Ubuntu环境下基于libxl库文件使用C++实现对表格的操作
功能 表格不存在则创建后再进行操作创建sheet添加新的工作表在sheet中增加数据设置单元格样式 相关配置 下载地址:libxl选择 LibXL for Linux 4.2.0 i386 x64 armhf aarch64 安装配置 1,使用 tar zxvf 文件名.tar.gz 进行文件解压2,创…...
Sentinel与SpringBoot整合
好的,以下是一个简单的Spring Cloud整合Sentinel的代码示例: 首先,在pom.xml中添加以下依赖: <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…...
如何实现数据通过表格批量导入数据库
文章目录 1. 准备工作2. 创建数据库表3. 编写导入脚本4. 优化和拓展4.1 批量插入的优势4.2 错误处理4.3 数据验证4.4 数据转换 5. 总结 🎉如何实现数据通过表格批量导入数据库 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客&…...
(动手学习深度学习)第13章 计算机视觉---微调
文章目录 微调总结 微调代码实现 微调 总结 微调通过使用在大数据上的恶道的预训练好的模型来初始化模型权重来完成提升精度。预训练模型质量很重要微调通常速度更快、精确度更高 微调代码实现 导入相关库 %matplotlib inline import os import torch import torchvision f…...
训练跳跃(青蛙跳台阶),剑指offer,力扣
目录 题目地址: 题目: 青蛙跳台阶问题 我们直接看题解吧: 相似题目,斐波那契数列: 解题方法: 难度分析: 审题目事例提示: 解题思路: 代码实现: 小鸡识补充 题…...
Linux中路由route
route 显示当前路由表信息 route add -net 192.168.10.0 netmask 255.255.255.0 dev ens160去往192.168.10.0/24网段的路由通过ens160网卡出去add 添加路由(del表示删除路由)-A 设置地址类型(默认ipv4 配置ipv6地址时:-A …...
美国国家安全实验室员工详细数据在网上泄露
一个从事出于政治动机的攻击的网络犯罪组织破坏了爱达荷国家实验室(INL)的人力资源应用程序,该组织周日在电报上发帖称,已获得该核研究实验室员工的详细信息。 黑客组织 SiegedSec 表示,它已经访问了“数十万用户、员…...
一石激起千层浪,有关奥特曼被炒的消息引发了一场热烈的讨论
在毫无征兆的情况下,OpenAI CEO山姆-奥特曼被炒了。 一石激起千层浪,有关奥特曼被炒的消息引发了一场热烈的讨论。 有人将其看成是一场「宫斗」,有人将其看成是OpenAI的董事会与创始人们的一次纠偏。 无论如何,这样一件看似并无…...
Vue 定义只读数据 readonly
readonly 让一个响应式数据变为 **深层次的只读数据**。 isReadonly 判断一个数据是不是只读数据。 应用场景:不希望数据被修改时使用。 readonly 深层次只读: <template><h1>reactive数据</h1><p>姓名:{{ info…...
[Linux] Network: IPv6 link-local 地址是否可用不自动生成
原来有一段时间在做扩充产品的VLAN个数,然后就遇到过一个问题:说这个Linux的默认配置里,会为每一个网络接口添加一个link-local的地址,就是FE80::开头的地址,在RFC-4291里有如下的定义: Link-Local unicas…...
万字解析:十大排序(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序+归并排序+计数排序+基数排序+桶排序)
文章目录 十大排序排序算法复杂度及稳定性分析一、 排序的概念1.排序:2.稳定性:3.内部排序:4.外部排序: 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四…...
基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码
基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于原子轨道搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要…...
“我,24岁,年薪20万”:选对了行业究竟多重要?
那些在职场上顺风顺水,按部就班拿到高薪的人都有什么特点? 今天的主人公Flee告诉我,是稳。 在她的故事里,我看到一个“别人家的姑娘”,是怎样在职场上稳步晋升,大学毕业仅2年,就拿到18.6K月薪&a…...
【shell脚本】全自动完成pxe无人值守批量装机脚本,匹配centos系列
本脚本采用的是搭建ftp服务器、tftp服务器、dhcp服务器来完成文件的传输 ks应答文件为最小化安装,免去图形化,可以实现一键装机~~ #!/bin/bash yum -y install tftp-server dhcp vsftpd syslinux &> /dev/null ###脚本说明:需要输入…...
利用Python进行数据分析【送书第六期:文末送书】
👨🎓博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…...
【直播课】11月26日学习PostgreSQL-PGCE认证的朋友们准备好,直播课来了
PG培训认证优势 由工信部中国开源软件联盟PostgreSQL分会(简称中国PG分会)联合权威认证机构中国电子工业标准化技术协会,是目前国内唯一权威的PG技术等级认证,填补了国内PG技术领域的空白。 PG培训认证等级 PG初级-PGCA PG应用管…...
ModernCSS.dev - 来自微软前端工程师的 CSS 高级教程,讲解如何用新的 CSS 语法来解决旧的问题
今天给大家安利一套现代 CSS 的教程,以前写网页的问题,现在都可以用新的写法来解决了。 ModernCSS.dev 是一个现代 CSS 语法的教程,讲解新的 CSS 语法如何解决一些传统问题,一共有30多课。 这套教程的作者是 Stephanie Eckles&am…...
dvwa-command injection 代码审计(超详细逐行审计)
dvwa-command injection 代码审计 low <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Determine OS and execute the ping command.if( stristr( php_uname( s ), Windows NT ) ) {// Windows$cmd shell_exec( ping . $target );}…...
hadoop 配置历史服务器 开启历史服务器查看 hadoop (十)
1. 配置了三台服务器,hadoop22, hadoop23, hadoop24 2. hadoop文件路径: /opt/module/hadoop-3.3.4 3. hadoop22机器配置历史服务器的配置文件: 文件路径:/opt/module/hadoop-3.3.4/etc/hadoop 文件名称:mapred-size.xml 新增历…...
Java注解(Annotation)的基本知识
Java注解(Annotation)的基本知识 此文的目的只在于了解的注解的基本知识,知道注解的一些概念,使能够看懂注解的使用。 注解概述 Java 注解(Annotation)又称 Java 标注,使 JDK5.0 引入的一种注释机制。Java 语言中的…...
告别Charles!用Python神器mitmproxy在Windows上抓包模拟器App,保姆级配置避坑指南
告别Charles!用Python神器mitmproxy在Windows上抓包模拟器App,保姆级配置避坑指南 在移动开发与爬虫领域,抓包工具如同开发者的"第三只眼"。传统工具如Charles和Fiddler虽然功能强大,但面对复杂的定制化需求时ÿ…...
Linux x64 ROP链不够用?试试这个藏在__libc_csu_init里的‘万能’gadget(附Python pwntools脚本)
突破ROP链限制:深入挖掘__libc_csu_init中的通用gadget 在64位Linux系统的漏洞利用开发中,构造可靠的ROP链常常面临一个棘手问题——难以找到控制所有必要寄存器的gadget片段。特别是当需要精确设置rdx、rsi等寄存器时,传统的ROP技术往往会遇…...
EBERLE AD-41/051475000100模拟输入模块
EBERLE AD-41/051475000100模拟输入模块专为工业现场设计,用于采集传感器信号,具备高精度与高可靠性。多通道输入:支持4或8通道,节省空间。信号兼容:可配置接入0-20mA、4-20mA或0-10V信号。高分辨率:12-16位…...
TensorFlow Recommenders多任务学习指南:同时优化多个推荐目标
TensorFlow Recommenders多任务学习指南:同时优化多个推荐目标 【免费下载链接】recommenders TensorFlow Recommenders is a library for building recommender system models using TensorFlow. 项目地址: https://gitcode.com/gh_mirrors/rec/recommenders …...
突发:AISMM认证通道将于2026年Q2关闭旧版评估协议!现在不掌握V2.1动态基线,Q3招标直接出局
更多请点击: https://intelliparadigm.com 第一章:2026奇点智能技术大会:AISMM评估工具 AISMM(Artificial Intelligence System Maturity Model)评估工具是2026奇点智能技术大会正式发布的开源框架,旨在系…...
2026,RAG 正在被重写:从向量检索到 Agent 认知架构的范式迁移
向量相似度检索已经到头了。2026 年的 RAG 正在经历一场从"管道"到"大脑"的根本性重构——而你可能还在用 2023 年的思路搭系统。 一个让人焦虑的事实 最近我审了好几个 RAG 项目,发现一个尴尬的共性:演示都很漂亮,上线…...
如何在5分钟内为Unity游戏安装模组:MelonLoader终极入门指南
如何在5分钟内为Unity游戏安装模组:MelonLoader终极入门指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 你是否…...
别再只懂PCA了!用PyTorch从零搭建一个Auto-Encoder,实战图像去噪与数据压缩
别再只懂PCA了!用PyTorch从零搭建Auto-Encoder实战图像去噪与数据压缩 当你的MNIST手写数字被噪声淹没时,当你的高维数据让PCA力不从心时,是时候尝试一种更强大的非线性降维工具了。Auto-Encoder(自编码器)这个看似简单…...
C++日志 2——实现单线程日志系统
在上一篇《C 日志 1—— 日志系统基础设计》中,我们梳理了日志系统的核心需求(日志等级、输出格式、持久化)和基础架构。本篇将基于基础设计,从零实现一个轻量、可用的单线程 C 日志系统,兼顾实用性和可扩展性…...
在自动化测试流程中集成多模型API调用以提升测试覆盖率
在自动化测试流程中集成多模型API调用以提升测试覆盖率 1. 自动化测试中多模型调用的必要性 现代软件产品与AI能力的结合日益紧密,但不同模型厂商的API行为可能存在细微差异。单一模型测试无法覆盖所有可能的交互场景,这为产品质量埋下隐患。通过Taoto…...
