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