【C++】开源:跨平台Excel处理库-libxlsxwriter配置使用

news2024/11/24 14:19:26

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍Excel处理库-libxlsxwriter配置使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明

😏1. 项目介绍

项目Github地址:https://github.com/jmcnamara/libxlsxwriter

Wiki地址:https://libxlsxwriter.github.io/

libxlsxwriter 是一个用于创建 Microsoft Excel XLSX 文件的C库。它提供了一系列功能,可以让您通过编程方式生成包含单元格、图表、格式化等内容的 Excel 文件。下面是 libxlsxwriter 的一些特点和功能:

1.跨平台性:libxlsxwriter 可以在多个操作系统上工作,包括 Linux、macOS 和 Windows。

2.创建 XLSX 文档:它允许您创建 XLSX 格式的 Excel 文档,支持 Excel 2007 及更高版本。

3.丰富的功能:libxlsxwriter 支持创建工作表、单元格、公式、图表、条件格式化、数据筛选等功能。

4.高性能:该库被设计为具有高性能,在大型数据集的情况下生成速度快。

5.支持多种格式和样式:您可以设置单元格的格式、字体、颜色、边框、背景等属性,以及应用数值格式、日期格式、公式和函数等。

6.支持图表:libxlsxwriter 允许您创建各种 Excel 图表,如条形图、饼图、折线图等,并支持自定义图表的样式和属性。

但是要注意,libxlsxwriter 只能用于创建 XLSX 文件,不支持读取或修改现有的 Excel 文件。(可以通过c++自带的文件处理来读取,处理后的数据再手动导入到最后的表中)

😊2. 环境配置

下面进行环境配置:

# 安装依赖
sudo apt-get install libxslt-dev
# 下载源码
git clone https://github.com/jmcnamara/libxlsxwriter
# 编译
cd libxlsxwriter
make
sudo cp lib/libxlsxwriter.so.5 /usr/lib/libxlsxwriter.so.5
cd cmake
cmake ..
make 
sudo make install

编译运行:

g++ -o main main.cpp -lxlsxwriter && ./main

😆3. 使用说明

下面进行使用分析:

创建excel并写入示例:

#include "xlsxwriter.h"

int main() {

    /* Create a new workbook and add a worksheet. */
    lxw_workbook  *workbook  = workbook_new("demo.xlsx");
    lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);

    /* Add a format. */
    lxw_format *format = workbook_add_format(workbook);

    /* Set the bold property for the format */
    format_set_bold(format);

    /* Change the column width for clarity. */
    worksheet_set_column(worksheet, 0, 0, 20, NULL);

    /* Write some simple text. */
    worksheet_write_string(worksheet, 0, 0, "Hello", NULL);

    /* Text with formatting. */
    worksheet_write_string(worksheet, 1, 0, "World", format);

    /* Write some numbers. */
    worksheet_write_number(worksheet, 2, 0, 123,     NULL);
    worksheet_write_number(worksheet, 3, 0, 123.456, NULL);

    /* Insert an image. */
    worksheet_insert_image(worksheet, 1, 2, "logo.png");

    workbook_close(workbook);

    return 0;
}

参考某博主,生成指定个数的uuid示例:

#include <chrono>
#include <condition_variable>
#include <ctime>
#include <curl/curl.h>
#include <curl/easy.h>
#include <fstream>
#include <functional>
#include <future>
#include <iostream>
#include <iomanip>
#include <map>
#include <memory>
#include <mutex>
#include <random>
#include <stdio.h>
#include <string>
#include <uuid/uuid.h>
#include <vector>
#include "xlsxwriter.h"

// ref: https://www.cnblogs.com/Fred1987/p/17442487.html
// 编译: g++ -o main main.cpp -lxlsxwriter -luuid -lpthread && ./main

std::string get_time_now(bool is_exact = false)
{
    std::chrono::time_point<std::chrono::high_resolution_clock> now = std::chrono::high_resolution_clock::now();
    time_t raw_time = std::chrono::high_resolution_clock::to_time_t(now);
    struct tm tm_info = *localtime(&raw_time);
    std::stringstream ss;
    ss << std::put_time(&tm_info, "%Y%m%d%H%M%S");
    if (is_exact)
    {
        std::chrono::seconds seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());
        std::chrono::milliseconds mills = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
        std::chrono::microseconds micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());
        std::chrono::nanoseconds nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch());
        std::uint64_t mills_count = mills.count() - seconds.count() * 1000;
        std::uint64_t micros_count = micros.count() - mills.count() * 1000;
        std::uint64_t nanos_count = nanos.count() - micros.count() * 1000;
        ss << "_" << std::setw(3) << std::setfill('0') << std::to_string(mills_count)
           << std::setw(3) << std::setfill('0') << std::to_string(micros_count)
           << std::setw(3) << std::setfill('0') << std::to_string(nanos_count);
    }
    return ss.str();
}

// generate uuid
char *uuid_value = (char *)malloc(40);
char *get_uuid_value()
{
    uuid_t new_uuid;
    uuid_generate(new_uuid);
    uuid_unparse(new_uuid, uuid_value);
    return uuid_value;
}

void xlsxwriter_excel(const int &len)
{
    lxw_workbook *workbook = workbook_new("uuid.xlsx");

    lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
    worksheet_set_column(worksheet,0,0,50,NULL); // 设置列宽

    // write header
    worksheet_write_string(worksheet, 0, 0, "Header", NULL);
    worksheet_write_string(worksheet, 0, 1, "Number", NULL);

    for (int row = 1; row <= len; row++)
    {
        worksheet_write_string(worksheet, row, 0, get_uuid_value(), NULL);
        worksheet_write_number(worksheet, row, 1, row, NULL);
    }

    workbook_close(workbook);
    std::cout << get_time_now(true) << ",finish in " << __FUNCTION__ << std::endl;
}

int main(int agrs,char **argv)
{
    xlsxwriter_excel(atoi(argv[1])); // 读取命令行,生成几个uuid
    return 0;
}

结合CGAL计算几何库对txt点集进行处理,并处理后的数据写入xlsx,示例:

#include <iostream>
#include <fstream>
#include <vector>
#include "xlsxwriter.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Alpha_shape_2.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;

// 编译: g++ -o main main.cpp -lxlsxwriter -lCGAL -lgmp && ./main

int main() {
    // 1. 从文本文件中读取 XY 点集
    std::ifstream inputFile("input.txt");
    if (!inputFile) {
        std::cout << "Failed to open input file." << std::endl;
        return 1;
    }

    std::vector<Point_2> points;
    double x, y;
    while (inputFile >> x >> y) {
        points.push_back(Point_2(x, y));
    }
    inputFile.close();

    // ...

    // 2. 将处理后的点集写入 xlsx 文件中
    lxw_workbook* workbook = workbook_new("output.xlsx");
    lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);

    int row = 0;
    for (const Point_2& point : points) {
        int col = 0;
        worksheet_write_number(worksheet, row, col++, CGAL::to_double(point.x()), NULL);
        worksheet_write_number(worksheet, row, col, CGAL::to_double(point.y()), NULL);
        row++;
    }

    workbook_close(workbook);

    std::cout << "Output file has been generated." << std::endl;

    return 0;
}

在这里插入图片描述

以上。

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

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

相关文章

达梦数据库dbms_stats包的操作实践记录

索引的统计信息收集 GATHER_INDEX_STATSindex_stats_show 根据模式名&#xff0c;索引名获得该索引的统计信息。用于经过 GATHER_TABLE_STATS、GATHER_INDEX_STATS 或 GATHER_SCHEMA_STATS 收集之后展示。返回两个结果集&#xff1a;一个是索引的统计信息&#xff1b;另一个是…

23款奔驰S400商务型升级原厂HUD抬头显示系统,增加您的行车安全

HUD是平视显示器的简称&#xff0c;它原先是运用在航空器上的飞行辅助仪器。指飞行员不需要低头&#xff0c;就能够看到他需要的重要资讯。由于HUD的方便性以及能够提高飞行安全&#xff0c;这项技术后来也发展到汽车行业。汽车搭载的HUD抬头数字显示功能&#xff0c;是利用光学…

Evaluation Warning: The document was created with Spire.Doc for JAVA.

spire.doc-5.4.10.jar 生成PDF有广告语水印【Evaluation Warning: The document was created with Spire.Doc for JAVA.】 <!-- maven库访问不了 https://mvnrepository.com/artifact/e-iceblue/spire.doc e-iceblue库才能访问 https://repo.e-iceblue.cn/repository/maven…

用于弥散加权MRI的关节各向异性维纳滤光片研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用chatGPT-4 畅聊量子物理学(三)

集合了人类智慧的照片&#xff0c;来自 1927 年举行的第五届索尔维国际会议。 Omer 什么是“物理系统在被测量之前不具有确定的属性。量子力学只能预测给定测量的可能结果的概率分布" ChatGPT 这句话描述了量子力学中的一种基本原则&#xff0c;即“物理系统在被测量之前…

如何优雅的使用Mock Server

事出有因 昨天跟同事讨论我们在用的rap2(一个集接口编写和mock server的开源项目)和刚上线了一个easy-mock的server&#xff0c;到底哪个好用。 我们主要讨论的点有个两个&#xff1a; 接口的一致性、 编码的无侵入性。 背景 自从前后端分离后&#xff0c;完成前后端的分工…

Netty:用ByteBufUtil的函数将字节数组、或者ByteBuf的内容转换为十六进制表示的字符串

用ByteBufUtil的hexDump(byte[] array)函数将字节数组的内容转换为十六进制表示的字符串 package com.thb;import io.netty.buffer.ByteBufUtil;public class Demo {public static void main(String[] args) {byte[] b new byte[] {0x68, 0x16, 0x03, 0x04, (byte)0xae};Stri…

6 个简单步骤,教你创建可视化看板工作流

看板是一种相当流行的工作管理工具&#xff0c;团队和组织使用它来可视化工作流程&#xff0c;限制当前正在进行的工作&#xff0c;并最大限度地提高流程效率。 看板的一些主要特点包括&#xff1a; ✓ 看板提供了对工作流程进行可视化控制的手段&#xff1b; ✓ 看板 "…

迭代器(Iterator)与 ListIterator 的使用

目录 一. Iterator 接口 例子&#xff1a; 二. ListIterator 接口 三. Iterable 接口 例子&#xff1a; 四. List 接口 五. Iterable接口 与 Iterator 接口 在 ArrayList 中 的使用 六. List 接口 与 ListIterator 接口 在 ArrayList 中 的使用 一. Iterator 接口 Ite…

网址生成二维码要怎么实现?1分钟教程来啦!

将网址链接转换成一个二维码&#xff0c;方法很简单。 今年六月份&#xff0c;海澜之家在父亲节的活动中&#xff0c;就使用了一个网址链接二维码。扫描地铁站内的海报上的二维码&#xff0c;就能跳转到一篇海澜之家的微信公众号文章里&#xff0c;查看100个父亲的故事。 其实…

网络电视盒子哪个好?回购率最高电视盒排行榜揭晓!

在挑选电视盒子的时候&#xff0c;我们不能光看配置&#xff0c;也要看系统优化、广告植入等方面&#xff0c;不知道网络电视盒子哪个好&#xff0c;可以借鉴目前业内最新发布的电视盒子回购率排行榜&#xff0c;看看目前用户口碑最好的是哪些机型。 ●泰捷WEBOX 60Pro电视盒子…

PyTorch从零开始实现ResNet

文章目录 代码实现参考 代码实现 本文实现 ResNet原论文 Deep Residual Learning for Image Recognition 中的50层&#xff0c;101层和152层残差连接。 代码中使用基础残差块这个概念&#xff0c;这里的基础残差块指的是上图中红色矩形圈出的内容&#xff1a;从上到下分别使用…

利用rollup打包 第三方库 @sentry/browser 为 umd 格式

背景 最近 老项目 多入口打包 引入sentry监控 &#xff0c;由于不想 在各个入口 都去加sentry 相关逻辑&#xff0c;最后 在 统一的模版文件 html 中 通过 script 标签 引入sentry &#xff0c;并 初始化操作。 要想保证 script 标签 引入 sentry文件能使用。 需要 保证sentry…

学习ts(一)数据类型(基础类型和任意类型)

运行 起步安装 npm install typescript -g 运行tsc index.ts生成对应的js文件&#xff0c;然后使用node index.js执行js文件 为了方便运行还可以安装插件&#xff0c;ts-node index.ts运行即可 npm i ts-node -g npm init -y npm i types/node -D基本数据类型 // 1.字符…

让光存在,探索光耦继电器的魔力

光耦合器继电器是电路中的无名英雄&#xff0c;正在改变我们实现电气安全和控制的方式。这些卓越的设备&#xff08;也称为光电耦合器继电器&#xff09;由于其在电气隔离电路上传输信号和功率的独特能力而在各个行业中广受欢迎。今天&#xff0c;我们深入探讨光耦合器继电器背…

大厂面试篇--2023软件测试八股文最全文档,有它直接大杀四方

前言 已经到了金九银十的黄金招聘季节了&#xff0c;还在准备面试跳槽涨薪的小伙伴们可以看看本篇文章哟&#xff0c;这里呢笔者就不多说废话了直接上干货&#xff01;答案已整理好&#xff0c;文末拿去即可&#xff01;非常好用&#xff01; 一、字节跳动测试面经篇 1、在搜…

【管理运筹学】第 5 章 | 整数规划 (1,问题提出与分支定界法)

文章目录 引言一、整数规划问题的提出1.1 整数规划的数学模型1.2 整数规划问题的求解 二、分支定界法2.1 分支与定界2.2 基本求解步骤&#xff08;一&#xff09;初始化&#xff08;二&#xff09;分支与分支树&#xff08;三&#xff09;定界与剪枝&#xff08;四&#xff09;…

正中优配:2023新股上市涨跌幅规则?新股上市涨跌幅限制为几天?

A股与美股不同&#xff0c;股票存在涨跌幅限制&#xff0c;那么&#xff0c;2023新股上市涨跌幅规矩&#xff1f;新股上市涨跌幅限制为几天&#xff1f;下面正中优配为我们预备了相关内容&#xff0c;以供参阅。 2023年新股上市涨跌幅存在以下规矩&#xff1a; 1、主板初次公开…

mock.js引发的报错Corrupted zip: missing xxx bytes

背景&#xff1a; 之前项目没引入mock.js&#xff0c;出于产品要宣传售卖该项目&#xff0c;后端那套服务需要真实场景&#xff0c;和产品经理商量下前端出个假数据的页面&#xff0c;所以复制几个页面mock数据用于产品宣传 首先了解下mock.js Mock 是一种用于模拟数据和行为的…

【QT】 QFileQFileInfo文件操作

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT对文件的操作技术&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点…