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 1900
    int month = localTime->tm_mon + 1;     // Months start from 0
    int 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);
    //增加sheet
    if (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);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【电路笔记】-电源电压

电源电压 文章目录 电源电压1、概述1.1 交流发电机1.2 电池1.3 理想电压源1.4 实际电压源1.5 连接规则 2、相关源2.1 压控电压源 (VCVS)2.2 电流控制电压源 (CCVS) 3、总结 在本文中&#xff0c;我们详细介绍了称为电源电压的重要电子元件的架构、功能和使用。 我们首先提出理想…

达索系统3DEXPERIENCE WORKS 2024 Fabrication新功能

当发现产品的制造环节&#xff0c;以及因产品模型本身的设计而导致制造环节存在不合理性&#xff0c;从而导致加工制造成本增加。 快速判断&#xff0c;轻松协作 在达索系统3DEXPERIENCE WORKS 2024中我们可以快速的判断产品的可制造性&#xff0c;以及快速与前端设计沟通协作…

目标文件(ELF格式)

1.linux中有三类目标文件 **&#xff08;1&#xff09;可重定位目标文件&#xff08;.o或者.a&#xff09;&#xff1a;**包含二进制代码和数据&#xff0c;其形式可以和其他目标文件进行合并&#xff0c;创建一个可执行目标文件。&#xff08;.a文件是由很多个.o文件的集合&a…

【设备树添加节点】

节点结束位置都需要加分号 of_iomap 完成映射 of_property_read_u32_array of_property_read_string of_fine_node_by_path

C++实战学习笔记

文章目录 erase()uniquevector的insert()std::string::npos erase() &#xff08;1&#xff09;erase(pos,n); 删除从pos开始的n个字符&#xff0c;比如erase(0,1)就是删除第一个字符 &#xff08;2&#xff09;erase(position);删除position处的一个字符(position是个string类…

使用yum安装jdk,并配置环境变量

写在前面: yum安装的jdk&#xff0c;默认不用配置环境变量就可以java -version显示结果&#xff0c;但是却不能在系统环境变量中查看到JAVA_HOME&#xff0c;由于其他应用需要这个环境变量&#xff0c;比如hadoop&#xff0c;所以这里说明如何进行java的相关环境变量配置 1. y…

6.Gin 路由详解 - GET POST 请求以及参数获取示例

6.Gin 路由详解 - GET POST 请求以及参数获取示例 GET POST 请求以及参数获取示例 Get 请求&#xff1a;获取 Quary 参数 // 获取query参数示例&#xff1a;GET /user?uid20&namejack&page1 r.GET("/user", func(c *gin.Context) {// 获取参数// Query获取参…

Spring-IOC-Spring6和JUnit5集成

1、父工程pom.xml <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>…

Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

LVS+Keepalived 高可用群集

一、一.Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 • 支持故障自动切换&#xff08;Failover&#xff09; • 支持节点健康状态检查&#xff08;Health Checking&#xff09; • 官方网站&#xff1a;http://www.keepalived.org/ 二、Keepalived工作原理 • …

淘宝商品详情接口,商品属性接口,商品信息查询,商品详细信息接口,h5详情,淘宝APP详情

淘宝商品详情API接口可以使用淘宝开放平台提供的SDK或API来获取。这些接口可以用于获取商品的详细信息&#xff0c;如标题、价格、描述、图片等。 以下是使用淘宝开放平台API获取商品详情的步骤&#xff1a; 注册淘宝开放平台账号&#xff0c;并创建应用&#xff0c;获取应用…

【JavaEE初阶】 JavaScript基础语法——壹

文章目录 &#x1f38b;初识JavaScript&#x1f6a9;JavaScript 是什么&#x1f6a9;JavaScript 和 HTML 和 CSS 之间的关系&#x1f6a9;JavaScript 运行过程&#x1f6a9;JavaScript 的组成 &#x1f38d;前置知识&#x1f6a9;第一个JS程序&#x1f6a9;JavaScript 的书写形…

vue3 uniapp h5 安卓和iOS开发适配踩坑记录

font-size适配屏幕大小及iOS和安卓状态栏及安全距离的处理 App.vue <script setup lang"ts"> import { onLaunch, onShow, onHide } from "dcloudio/uni-app"; import ./main.scss onLaunch(() > {console.log("App Launch");var wid…

leetcode刷题详解——粉刷房子

1. 题目链接&#xff1a;LCR 091. 粉刷房子 2. 题目描述&#xff1a; 假如有一排房子&#xff0c;共 n 个&#xff0c;每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种&#xff0c;你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然&#xff0c;因为…

六大排序详讲(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序)

文章目录 排序一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四、交换排序1.冒泡排序2.快速排序…

Threejs_07 环境、透明度、纹理、ao、光照等贴图的渲染

老陈打码 继续学习老陈threejs 支持&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 下面用到的所有图片、资源、hdr文件都是老陈打码的原资源 链接&#xff1a;https://pan.baidu.com/s/1WWWHgekCIH7OnjI7S_3ZtQ 提取码&#xff1a;6666 Thre…

新建模板,或组件自适应

1&#xff0c;***一定要改为固定布局&#xff08;才可以自适应&#xff09; 2&#xff0c; 3&#xff0c; 4&#xff0c;系统序号“1”就是第一根柱 5&#xff0c;系列-自动-配色这里1就是第一根柱颜色&#xff0c;2..... 6&#xff0c;坐标柱 标红的去掉&#xff0c;在那里设…

debian10 开启rdp安装firefox并解决firefox 中文乱码

debian10 开启rdp安装firefox apt -y install tigervnc-standalone-server apt -y install xrdp tigervnc-standalone-server systemctl enable xrdp --nowapt install firefox-esrmstsc连接 firefox-settings-general-fonts-advanced-Simplified Chinese

【vue+eltable】修改表格滚动条样式

<style lang"scss" scoped> ::v-deep .el-table__body-wrapper::-webkit-scrollbar {width: 10px; /*纵向滚动条的宽度*/height: 10px; /*横向滚动条的高度*/ } /*定义滚动条轨道 内阴影圆角*/ ::v-deep .el-table__body-wrapper::-webkit-scrollbar-track {bo…

以太网_底层

【实物图】 【网线接口】 MAC(媒体访问控制器)&#xff1a;控制数据的收发和管理&#xff0c;和用户层打交到&#xff1b;通过MII/RMII、SMI接口和PHY进行通信。 PHY(以太网物理层收发器)&#xff1a;中间体&#xff0c;负责收发信号的转换 常见PHY芯片有&#xff1a;LAN8720…