• 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配置

    1. cmake_minimum_required(VERSION 3.23)
    2. project(libxl_test)
    3. set(CMAKE_CXX_STANDARD 11)
    4. # 指定lib目录
    5. link_directories(/usr/local/libxl/lib64)
    6. # 指定头文件搜索策略
    7. include_directories(/usr/local/include/libxl)
    8. add_executable(libxl_test main.cpp)
    9. target_link_libraries(${PROJECT_NAME} xl z)
    10. # g++ -o ExcelOutputProgram ExcelOutputProgram.cpp -lxl -lz

    代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define filename "/home/chy-cpabe/CLionProjects/libxl_test/output.xlsx"
    7. bool fileExists(const std::string& excel_file) {
    8. std::ifstream file(excel_file);
    9. return file.good(); // 如果文件存在,file.good() 返回 true
    10. }
    11. /**
    12. * @brief 填写表格内容
    13. *
    14. * @param USBKey_info Book handle
    15. * @param sheet sheet handle
    16. * @param DEVINFO_SerialNumber USBKey序列号
    17. * @param Signing_Certificate_SerialNumber 签名证书序列号
    18. * @return 0:成功;-1:失败
    19. */
    20. int write_excel_content(libxl::Book *USBKey_info,libxl::Sheet *sheet,
    21. std::string DEVINFO_SerialNumber,
    22. std::string Signing_Certificate_SerialNumber)
    23. {
    24. // 插入相关字段信息
    25. int nextRowIndex = sheet->lastRow();// 确定下一个可用的行索引
    26. sheet->writeStr(nextRowIndex, 0, DEVINFO_SerialNumber.c_str());
    27. sheet->writeStr(nextRowIndex, 1,Signing_Certificate_SerialNumber.c_str());
    28. // 获取当前系统时间
    29. auto now = std::chrono::system_clock::now();
    30. // 将系统时间转化为 time_t 样式
    31. std::time_t currentTime = std::chrono::system_clock::to_time_t(now);
    32. // 将time_t转化为tm结构体
    33. std::tm *localTime = std::localtime(¤tTime);
    34. // 提取年月日等时间信息
    35. int year = localTime->tm_year + 1900; // Years since 1900
    36. int month = localTime->tm_mon + 1; // Months start from 0
    37. int day = localTime->tm_mday;
    38. int hour = localTime->tm_hour;
    39. int minute = localTime->tm_min;
    40. // 设置格式 (每列列宽30并居中显示) 并填充数据
    41. libxl::Format* format2 = USBKey_info->addFormat();
    42. format2->setNumFormat(libxl::NUMFORMAT_CUSTOM_MDYYYY_HMM);
    43. format2->setAlignH(libxl::ALIGNH_CENTER);
    44. sheet->writeNum(nextRowIndex, 2, USBKey_info->datePack(year,month,day,hour,minute),format2);
    45. }
    46. /**
    47. * @brief 填写Excel表格
    48. *
    49. * @param increase_sheet 是否增加工作表
    50. * @param sheetName_new 如果increase_sheet为true,接收工作表的名字
    51. * @param DEVINFO_SerialNumber USBKey序列号
    52. * @param Signing_Certificate_SerialNumber 签名证书序列号
    53. * @return 0:成功;-1:失败
    54. */
    55. int write_excel(bool increase_sheet,std::string sheetName_new,
    56. std::string DEVINFO_SerialNumber,
    57. std::string Signing_Certificate_SerialNumber){
    58. libxl::Book *USBKey_info = xlCreateXMLBook();
    59. //Excel文件是否存在
    60. if (!fileExists(filename)) {
    61. // 创建Excel 文件
    62. if (USBKey_info->save(filename)) {
    63. std::cout << "excel表格创建成功!" << std::endl;
    64. } else {
    65. std::cout << "excel表格创建失败!" << std::endl;
    66. }
    67. }
    68. //创建表格
    69. USBKey_info->load(filename);
    70. //增加sheet
    71. if (increase_sheet == true){
    72. // 添加新的工作表并命名
    73. libxl::Sheet *sheet = USBKey_info->addSheet(sheetName_new.c_str());
    74. if (sheet) {
    75. //表格样式处理 (每列列宽30并居中显示)
    76. libxl::Format* centerAlign = USBKey_info->addFormat();
    77. centerAlign->setAlignH(libxl::ALIGNH_CENTER);
    78. sheet->setCol(0, 2, 30, centerAlign);
    79. // 创建工作表的标题
    80. sheet->writeStr(1, 0, "DEVINFO SerialNumber");
    81. sheet->writeStr(1, 1, "Signing Certificate SerialNumber");
    82. sheet->writeStr(1, 2, "Date");
    83. // 插入相关字段信息
    84. write_excel_content(USBKey_info, sheet,DEVINFO_SerialNumber,
    85. Signing_Certificate_SerialNumber);
    86. } else{
    87. std::cerr << "新增 使用用户指定名称创建sheet的索引失败!" << std::endl;
    88. return false;
    89. }
    90. }else{
    91. //利旧 获取最后一个sheet的索引
    92. int sheetCount = USBKey_info->sheetCount()-1;
    93. libxl::Sheet *sheet = USBKey_info->getSheet(sheetCount);
    94. if (sheet)
    95. {
    96. // 插入相关字段信息
    97. write_excel_content(USBKey_info, sheet,DEVINFO_SerialNumber,
    98. Signing_Certificate_SerialNumber);
    99. } else{
    100. std::cerr << "利旧 获取最后一个sheet的索引失败!" << std::endl;
    101. return false;
    102. }
    103. }
    104. // 保存 Excel 文件
    105. if (USBKey_info->save(filename)) {
    106. std::cout << "Excel 文件成功保存" << std::endl;
    107. } else {
    108. std::cout << "Excel 文件保存失败" << std::endl;
    109. }
    110. // 释放资源
    111. USBKey_info->release();
    112. return 0;
    113. }
    114. int main() {
    115. printf("请输入要创建的工作表名称:\n");
    116. std::string sheetName; // 用户输入的工作表名称
    117. std::cin >> sheetName; // 接收用户输入的工作表名称
    118. std::string DEVINFO_SerialNumber{"00FF4821104E2607"};
    119. std::string Signing_Certificate_SerialNumber{"4495"};
    120. //测试1: 文件不存在新建,强制删除文件即可
    121. write_excel(true,sheetName,DEVINFO_SerialNumber,
    122. Signing_Certificate_SerialNumber);
    123. //测试2: 文件存在
    124. //sheet新建
    125. write_excel(true,"new1",DEVINFO_SerialNumber,
    126. Signing_Certificate_SerialNumber);
    127. //sheet追加
    128. write_excel(false,"new",DEVINFO_SerialNumber,
    129. Signing_Certificate_SerialNumber);
    130. return 0;
    131. }

    结果展示

    注意

    •  sheet新建需要保证每个sheet的name是不一样的,重名会出错
    1. //测试2: 文件存在
    2. //sheet新建
    3. write_excel(true,"new1",DEVINFO_SerialNumber,
    4. Signing_Certificate_SerialNumber);

  • 相关阅读:
    【跨级组件的通信&组件的生命周期&React的常用特性】
    solr配置账号权限登录
    python——运行方式
    mac电脑版MATLAB R2023b for Mac中文激活版
    宝宝餐椅儿童商品认证和ASTM F404检测标准的重要性
    Makefile
    springboot多模块扫包中的@SpringBootApplication、@ComponentScan和@MapperScan问题
    Mac 上fiddler与charles 抓包https 小程序请求 内容
    【python】eval函数
    6.Android应用架构指南:界面层界面事件
  • 原文地址:https://blog.csdn.net/CHYabc123456hh/article/details/134527031