Ubuntu环境下基于libxl库文件使用C++实现对表格的操作

news/2024/7/7 23:05:15

功能

  • 表格不存在则创建后再进行操作
  • 创建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);


http://lihuaxi.xjx100.cn/news/1814644.html

相关文章

开发盲盒商城的意义

开发盲盒商城的意义在于为电商行业带来新的增长机会&#xff0c;满足消费者对购物方式趣味性的需求&#xff0c;同时提升用户的参与度&#xff0c;为商家带来更多销售机会和增强影响力的机遇。 盲盒商城系统通过独特的盲盒玩法&#xff0c;为用户带来了全新的趣味购物体验&…

什么是主机安全,为什么我们需要主机安全。

什么是主机安全&#xff1a; 德迅主机安全基于德迅云安全积累的海量威胁数据&#xff0c;采用自适应安全架构&#xff0c;为用户提供远程保护、资产清点、黑客入侵检测、病毒查杀、漏洞风险发现预警及安全合规基线等安全防护服务&#xff0c;对当前服务器面临的主要网络安全风险…

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

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

再谈谈注解

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 注解&#xff0c;和反射…

gzip 压缩优化大 XML 响应的处理方法

当处理大型XML响应时&#xff0c;我们经常会面临内存限制和性能问题。 在处理这个问题时&#xff0c;我们可以使用Python的requests库和lxml库来解决。下面是解决方案的步骤&#xff1a; 1. 使用requests库发送HTTP请求获取XML响应。 2. 检查响应的Content-Encoding标头&…

GNSS位移监测站系统是什么

WX-WY4G 一、GNSS位移监测站系统的工作原理GNSS位移监测站系统是一种基于导航卫星系统&#xff08;GNSS&#xff09;的高精度位移监测技术。它通过接收和处理来自卫星的信号&#xff0c;对地表物体的位置进行精度的实时监测。这个系统具有可靠性的特点&#xff0c;被广泛应用于…

Python如何实现模板方法设计模式?什么是模板方法设计模式?Python 模板方法设计模式示例代码

什么是模板方法&#xff08;Template Method&#xff09;设计模式&#xff1f; 模板方法&#xff08;Template Method&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤延迟到子类中实现。这种模式允许子类为一个算法的特定步骤提供…

mysql主从数据不一致的原因

mysql主从数据不一致的原因 网络延迟&#xff0c;主从复制是基于binlog的异步复制&#xff0c;通过网络传送binlog文件&#xff0c;网络延迟是大多数引起数据不一致的原因 主从机器的负载不一致&#xff1a;mysql主从复制是主库开启dump线程&#xff0c;从库开启io和sql线程。…