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(&currentTime);// 提取年月日等时间信息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);

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

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

相关文章

《rPPG》——(1)PyTorch——Windows环境配置

《rPPG》——&#xff08;1&#xff09;PyTorch——Windows环境配置 如何查看电脑是否已安装Python环境以及Python版本 anaconda对应python3.8的版本号是多少? 强烈建议大家安装最新版的anaconda&#xff0c;虽然最新版的anaconda是Python3.11的&#xff0c;但是这个并不会影…

[汇编实操]DOSBox工具安装——Ubuntu18.04系统

一、下载&安装 sudo apt install -y dosbox 二、启动 dosbox 三、C盘挂载 将上述文件下载放在任意路径&#xff0c;将DEBUG目录映射为虚拟C盘 MASM.EXE 是用来编译的&#xff0c;LINK.EXE 用来链接&#xff0c;这俩是必须的。 执行如下命令&#xff1a; mount c /m…

机器学习与计算机视觉 D2

整合为学习笔记&#xff01;参考阅读了几位大佬的作品&#xff0c;已标注出处~ 机器学习的数学基础 线性与非线性变换 从几何意义上&#xff0c;线性变换表示的是直线的特性&#xff0c;符合两个性质: 变换前后零点不变&#xff0c;变换前后直线还是直线。 线性变换意味着可以…

SpringBoot 集成Sa-Token 一个轻量级Java权限认证框架,让鉴权变得简单、优雅!

文章目录 前言Sa-Token 相关链接Sa-Token 介绍Sa-Token 功能模块一览Sa-Token-SSO 单点登录Sa-Token-OAuth2 授权认证使用 Sa-Token 的开源项目SpringBoot集成Sa-Token1. 添加依赖Maven 方式Gradle 方式2. 设置配置文件3. 查看 Sa-Token 配置4. 创建测试Controller5. 运行前言 …

【面试】你有使用过链路追踪技术吗?

这个问题之前也有被问过。的确&#xff0c;链路追踪技术对系统异常定位非常有用。目前公司的链路追踪已经形成数据闭环&#xff0c;下面我将简单说说我是如何为公司规划这套链路追踪技术的。 目前公司的链路追踪技术使用的解决方案是&#xff1a;Zipkin Prometheus Grafana。…

2.3IP详解及配置

2.3IP详解及配置 一、ip地址组成 IP地址由4部分数字组成&#xff0c;每部分数字对应于8位二进制数字&#xff0c;各部分之间用小数点分开 这是点分 2进制 如果换算为10进制我们称为点分10进制. 每个ip地址由两部分组成网络地址(NetID)和主z机地址(HostID).网络地址表示其属于…

11.9 实现磁盘相关操作

11.9.1 遍历磁盘容量 如下代码实现了在Windows系统中获取所有磁盘驱动器的信息。具体包括两个函数&#xff0c;一个用于获取驱动器类型&#xff0c;另一个用于获取驱动器空间信息。主函数则调用这两个函数来遍历所有逻辑驱动器并输出相应的信息。在输出驱动器空间信息时&#…

git reset hard,mixed,soft

首先&#xff0c;我们得了解git reset命令的形式之一&#xff1a; git reset [<mode>] [<commit>] 此命令的作用是恢复HEAD分支到<commit>位置&#xff0c;并根据<mode>决定是否恢复index file和working tree。恢复是指将staging area和working tree…

c语言遇到的常见问题及解决方案

在C语言编程中&#xff0c;可能会遇到一些问题&#xff0c;以下是一些常见问题和解决方案&#xff1a; 问题1&#xff1a;变量数据类型交换后未得到预期结果 原因&#xff1a;在scanf("%c",&name);中的%c前面缺少一个空格。 解决方案&#xff1a;在%c前面加上…

数据处理生产环境_spark获取df列当前日期的前一天日期

需求描述&#xff1a; 我现在有一个dataframe,名为dfin,样例数据如下 a1_id_lxha2_PHtime比亚迪_汉1232023-11-15 12:12:23比亚迪_汉1252023-11-15 13:14:51比亚迪_汉1232023-11-15 12:13:23比亚迪_汉1262023-11-16 14:12:34比亚迪_秦2312023-11-15 14:12:28比亚迪_秦2342023…

在线客服系统源码 聊天记录实时保存 附带完整的搭建教程

在线客服系统是一个企业网站进行网络营销的最重要的工具。企业进行网络宣传后&#xff0c;会有很多访客进入到网站&#xff0c;这时候网站就需要有在线客服人员进行接待&#xff0c;及时的与访客进行沟通&#xff0c;才能留住访客&#xff0c;变流量为销量。 在线客服系统可以…

Windows本地搭建rtmp推流服务

前言 开发时偶尔需要使用rtmp直播流做视频流测试&#xff0c;苦于网上开源的rtmp视频流都已经失效&#xff0c;无奈只好尝试在本地自己搭建一个rtmp的推流服务&#xff0c;方便测试使用。 一、工具准备 Nginx&#xff1a;使用nginx-rtmp-win64推流工具FFmpeg&#xff1a;官方…

网络安全涉及哪些方面?

1.系统安全&#xff1a;运行系统安全即保证信息处理和传输系统的安全。它侧重于保证系统正常运行&#xff0c;避免因为系统的损坏而对系统存储、处理和传输的消息造成破坏和损失&#xff0c;避免由于电磁泄露&#xff0c;产生信息泄露&#xff0c;干扰他人或受他人干扰。 2. 网…

[汇编实操]DOSBox工具: unable to open input file: 文件名.asm问题解决

出错原因1 &#xff1a;将文件放在debug文件下&#xff0c;mount后发现并没有该文件 解决方案 &#xff1a;重启DOSBox&#xff0c;重新mount&#xff0c;直到dir后可以看到该asm文件 出错原因2&#xff1a;DOS系统不支持8位以上的文件名 解决方案 &#xff1a;将文件名改为8…

【Linux】 线程

pthread_join: 获取线程返回值 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h>/*** 测试 pthread_join* 阻塞等待一个子线程的退出&#xff0c;可以接收到某一个子线程调用pthread_ex…

ISP概念入门

这里写自定义目录标题 引言ISP的处理流程1、Sensor有暗电流2、通过镜头到达Sensor中间的光多于到达Sensor的边缘的光&#xff0c;即光学系统中的渐晕3、Senor上有的像素点的输出有坏点4、Cmos的Sensor采用了Bayer色彩滤波阵列(Bayer Color Filter Array&#xff0c;CFA)5、Seno…

西米支付”:在游戏SDK中,提供了哪些支付渠道?SDK的用处?

在游戏SDK中&#xff0c;提供了哪些支付渠道&#xff1f; 常见的支付方式包括支付宝、微信支付、银联支付等。游戏SDK的支付功能可以方便玩家选择不同的支付渠道&#xff0c;以满足他们个性化的支付需求。 流行的支付应用&#xff1a;该应用集成了流行的支付应用支付接口&#…

大数据平台红蓝对抗 - 磨利刃,淬精兵! | 京东云技术团队

一、背景 目前大促备战常见备战工作&#xff1a;专项压测&#xff08;全链路压测、内部压测&#xff09;、灾备演练、降级演练、限流、巡检&#xff08;监控、应用健康度&#xff09;、混沌演练&#xff08;红蓝对抗&#xff09;&#xff0c;如下图所示。随着平台业务越来越复…

数据预处理方法

数据预处理是为了保证数据质量。数据预处理包括&#xff1a;数据清理&#xff0c;数据集成&#xff0c;数据转换&#xff0c;数据归约&#xff08;最大限度精简数据量&#xff09;。比如&#xff1a;缺失数据处理是去掉&#xff0c;还是填充默认值或最近的值。 数据的预处理也…

AirPods跳转下一首歌的操作方法,“代”数不同,方法也不同

在这么小的包装中&#xff0c;科技含量如此之高&#xff0c;真是令人惊讶。AirPods的神奇之处在于苹果获得专利的H1芯片。除了光学传感器和运动加速度计&#xff0c;它还允许你使用触摸控制来启动、停止或跳过歌曲。继续阅读&#xff0c;了解如何跳转AirPods、AirPods 2、AirPo…