libxlsxwriter初体验

news2024/11/24 18:30:37

C++如何写Excel?

大家时间都这么宝贵,没有起因的问题是不值得被优先研究的。这篇博客的起因就是希望找到一个比较合适于C++的开源库,用以在C++中生成Excel文档。其实C++可用的开源Excel库,很多博主都已经撰文提及。例如:# c++操作excel的几种库这篇博文的作者就总结了几种库,小白也是从这篇文章开始挑选的。

libxlsxwriter库简介

从上文提到的博文里,小白挑选了libxlsxwriter这个专门用于写xlsx文件的库。这个库被选中的关键原因,有以下几点:

  • 开源免费
  • 功能强大
  • 支持中文
  • 文档丰富

这个库在github上的开源仓库地址是https://github.com/jmcnamara/libxlsxwriter。它还有一个文档地址http://libxlsxwriter.github.io/非常详尽地教大家如何安装、使用这个库,这简直是小白的福音。

下面摘抄一段官方对该库的介绍:

Libxlsxwriter is a C library that can be used to write text, numbers, formulas and hyperlinks to multiple worksheets in an Excel 2007+ XLSX file. It supports features such as:

Libxlsxwriter是一个C库,可以向Excel 2007以上版本的XLSX文档中写入文本、数字、公式、超链接,并且支持多工作表。它支持的一些功能特征如下:

  • 100% compatible Excel XLSX files. 100% 兼容Excel XLSX文件。
  • Full Excel formatting. 完整的Excel格式支持。
  • Merged cells. 合并单元格。
  • Defined names. 定义名称。
  • Autofilters. 自动筛选。
  • Charts. 表格。
  • Data validation and drop down lists. 数据验证以及下拉列表。
  • Conditional formatting. 条件格式。
  • Worksheet PNG/JPEG/GIF images. 工作表 PNG/JPEG/GIF 图像。
  • Cell comments. 单元格注释。
  • Support for adding Macros. 支持宏。
  • Memory optimization mode for writing large files. 写入大文件时优化内存模式。
  • Source code available on GitHub. 开源代码可得。
  • FreeBSD License. FreeBSD 协议。
  • ANSI C. ANSI C 标准。
  • Works with GCC, Clang, Xcode, MSVC 2015, ICC, TCC, MinGW, MingGW-w64/32. 编译器支持GCC, Clang, Xcode, MSVC2015, ICC, TCC, MinGW, MingGW-w64/32。
  • Works on Linux, FreeBSD, OpenBSD, OS X, iOS and Windows. Also works on MSYS/MSYS2 and Cygwin. 在Linux,FreeBSD,OpenBSD,OS X,iOS和 Windows上均可使用。同时在MSYS/MSYS2和Cygwin上也可使用(支持多种系统)
  • Compiles for 32 and 64 bit. 可编译为32位和64位。
  • Compiles and works on big and little endian systems. 适用于高位编址和低位编址系统。
  • The only dependency is on zlib. 唯一的依赖库是zlib

特别注意最后一条——这一条的重要性在于,对我们编译和使用libxlsxwriter库有比较大的影响。

libxlsxwriter的文档相对比较友好:
在这里插入图片描述

Windows 环境下 VS + CMake 编译libxlsxwriter库

我们接下来讨论在Windows环境下,利用VS编译器和CMake工具,以源码方式编译libxlsxwriter库。
这个过程需要分为两步:第一步是编译zlib库,第二步才是编译libxlsxwriter库。
首先我们在github上找到zlib库,很高兴这个库仍然是一个开源库。其地址为:https://github.com/madler/zlib
这里的编译需要CMake工具,CMake工具结合VS的使用这里就不多说了。zlib库小白用VS2013和VS2019都试过,幸运无坑。编译成功后,我们可以得到x64 Release版本的zlib.dll / zlib.exp / zlib.lib / zlibstatic.lib,如下图所示:
在这里插入图片描述

在我们编译libxlsxwriter的目标路径下建立一个文件夹zlib,把上述四个文件放进去。然后利用CMake和VS对libxlsxwriter进行编译。注意如果没有在编译前把zlib准备好,则会报错。

注意,在此处,打开xlsxwriter.sln工程后,将C/C++ --> 常规 --> 调试信息格式 修改为 “无”。
在这里插入图片描述

如果不执行这个操作,那么使用编译好的xlsxwriter.lib时,会报出LNK4099错误。因为有一些pdb文件会依赖于编译环境,如果我们编译完成后把编译文件移动或删除了,就会找不到xlsxwriter.pdb,不利于我们使用。考虑到我们并不需要对libxlsxwriter库本身进行调试,所以直接把此处调试信息格式改成“无”比较省事。否则的话就需要对pdb的生成位置进行修改,关于这一点,可以阅读以下博客学习一下:
warning LNK4099: PDB 原因及解决方案

使用libxlsxwriter库

使用libxlsxwriter库,即新建一个工程,我们只需要准备好以下文件:

  • zlib四兄弟
  • xlsxwriter编译好的库下面的Include文件夹(注意保持内部的层级关系)
  • xlsxwriter.lib
    添加include文件到包含,添加zlib.lib和xlsxwriter.lib到附加依赖库即可。

注意在预生成事件/生成后事件里把zlib.dll拷贝到最终生成的exe目录下,否则会因为没有zlib.dll而无法运行。

让我们来一个示例程序:

#include "xlsxwriter.h"

/* Some data we want to write to the worksheet. */
struct expense {
	char item[32];
	int  cost;
};

struct expense expenses[] = {
	{"租金", 1000},
	{"燃气",  100},
	{"食物",  300},
	{"健身",   50},
};


int main(int argc, char* argv[]) 
{

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

	/* Start from the first cell. Rows and columns are zero indexed. */
	int row = 0;
	int col = 0;

	/* Iterate over the data and write it out element by element. */
	for (row = 0; row < 4; row++) {
		worksheet_write_string(worksheet, row, col, expenses[row].item, NULL);
		worksheet_write_number(worksheet, row, col + 1, expenses[row].cost, NULL);
	}

	/* Write a total using a formula. */
	worksheet_write_string(worksheet, row, col, "总计", NULL);
	worksheet_write_formula(worksheet, row, col + 1, "=SUM(B1:B4)", NULL);

	/* Save the workbook and free any allocated memory. */
	return workbook_close(workbook);
}

生成的结果为:
在这里插入图片描述

为什么VS2013编译时theme.c中有报错?

因为VS2013编译器中可能安装时选择了英语和中文简体,日语和韩语编码不能解析。解决的办法是把对应报错的日语和韩语直接注释掉。当然这样也意味着在使用库时就最好不要使用日语和韩语输入了。如果有VS2019的话,则不会有此坑。
在这里插入图片描述

为什么中文输入会失败?

小白在满心欢喜调试的过程中,发现输入中文时生成的xlsx文件会报错误。
在这里插入图片描述

点“否”就退出了,点“是”,则报错,称xml错误,所有中文以及中文所在列都没了:
在这里插入图片描述

这个问题是由于我们源码的保存格式存在问题,由于默认设置的缘故,可能是由于使用的VS简体中文版,使得源文件的默认保存格式是“简体中文(GB2312)”。

这时候我们需要在“文件”-“高级保存选项”里把源文件的编码格式换成“UTF-8不带签名”。有的同学可能会问了,在Windows下,不是应该保存成带签名的UTF-8模式吗?这里要说明一下,因为Excel文件实际上是解析XML文件,而这个XML文件采用的是不带签名的UTF-8编码,所以跟系统没有啥特别关系。

还有的同学会问了,说为什么“文件”里没找到“高级保存选项”啊?
那么在“工具”–> “自定义”里
在这里插入图片描述

这个库还是功能比较强大的,既可以使用中文,也可以对单元格进行格式设定,甚至还能画图、写宏。后面还是需要把相关的功能再仔细学习一下。

【水平所限,错漏难免。创作不易,轻喷勿骂】

在这里插入图片描述

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

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

相关文章

独立站运营优化方法

一个跨境卖家出海&#xff0c;除了建立独立站&#xff0c;要考虑的核心问题是引流和转型。独立站流量从哪里来&#xff1f;面对多元化的海外市场&#xff0c;如何选择更适合品牌的引流渠道和方式&#xff1f; 米贸搜在与海外主流社交媒体、搜索引擎深度连接的基础上&#xff0…

智翔金泰IPO过会:持续经营风险遭质疑,蒋仁生为实际控制人

11月28日&#xff0c;上海证券交易所科创板上市委员会2022年第 99次审议会议召开&#xff0c;重庆智翔金泰生物制药股份有限公司&#xff08;下称“智翔金泰”&#xff09;首发符合发行条件、上市条件和信息披露要求&#xff0c;即获得上市委会议通过。 据了解&#xff0c;上市…

目标检测数据标注项目分析-产品缺陷检测

什么是生产过程中的产品缺陷检测? 生产过程中的缺陷检测是保证产品质量的重要环节。及时发现故障或缺陷&#xff0c;并采取适当的措施&#xff0c;我们可以降低运行和质量相关的风险。但在一般视觉系统中&#xff0c;每个缺陷都必须经过检查及预处理才能被检测到&#xff0c;…

vue Router

Vue项目各文件含义 1.src文件夹 是我们真正敲代码的文件夹&#xff0c; 2.assets放静态资源 3.components放组件 4.App.vue主组件 5.main.js项目的入口文件 Vue Router 在router/index.js路由文件中配置路由&#xff0c;设置路由跳转规则 import Vue from vue import Vu…

Node.js 入门教程 28 Node.js 事件循环

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程28 Node.js 事件循环28.1 介绍28.2 阻塞事件循环28.3 调用堆栈28.4 一个简单的事件循环的阐释28.5 入队函数执行28.6 消息队…

ICC2:Design Planning(03)Power Network Synthesis

在shape block之后&#xff0c;接下来可以做pg规划。power network creation可以分为如下几个部分: 1.Add Power Pad 在规划power mesh之前需要先插power pad&#xff0c;所以要在create abstract阶段load upf&#xff0c;如果规划power mesh时没有power pad&#xff0c;也需要…

Java+JSP基于ssm高校网上教材征订系统-计算机毕业设计

项目介绍 随着高校规模的扩大和教学改革的不断深入&#xff0c;高校的教学和科研水平都在稳步提高&#xff0c;但高校的教材选订环节却仍存在着许多问题。目前&#xff0c;高校的教材选订工作大多采用的是手工方式&#xff0c;不仅费时、费力&#xff0c;而且还存在许多人为的…

Seal库官方示例(二):encoders.cpp解析

补充一个常用的SIMD操作原理 图片来自的Hang Shao的文章。 完整代码 这个代码主要功能是编码明文&#xff0c;使得能够使用更加完整的明文多项式&#xff08;前一个只用到了一个多项式的常量&#xff09;&#xff0c;也就是SIMD操作。主要包含了两个部分&#xff0c;一个是BG…

Animator动画状态机

1、有限状态机 有限状态机&#xff08;Finite - state machine, FSM&#xff09;&#xff0c;又称有限状态自动机&#xff0c;简称状态机&#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型 有限&#xff1a;表示是有限度的不是无限的 状态&#x…

机器人开发--减速机

机器人开发--减速机1 概述介绍功能分类按照传动类型可分为&#xff1a;按照传动级数不同可分为&#xff1a;按照齿轮形状可分为:按照传动的布置形式可分为:应用2 电机使用减速机原因3 RV减速机、谐波减速机 和 行星减速机RV减速机谐波减速机行星减速机蜗轮蜗杆减速机4 机器人各…

社区系统项目复盘-1

文章目录技术架构开发环境开发社区首页技术架构 Spring BootSpring、Spring MVC、MyBatisRedis、Kafka、ElasticsearchSpring Security、Spring Actuator 开发环境 构建工具&#xff1a;Apache Maven 版本&#xff1a;3.6.1集成开发环境&#xff1a;IntelliJ IDEA数据库&…

R3LIVE代码详解(四)

0. 简介 上一节中&#xff0c;我们过完了VIO中的状态预测以及特征点跟踪部分。此时我们已经拿到了光流的特征点信息&#xff0c;而这部分越来越接近我们想要去讲的帧到帧的VIO部分了。这一节&#xff0c;我们将围绕着VIO部分来进行讲解 1. PNP误差更新 我们从之前的博客《经…

人工智能前沿——未来AI技术的五大应用领域

关注“PandaCVer”公众号 >>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 一、航空航天 二、医疗保健 三、建筑行业 四、能源领域 五、供应链 关于YOLO算法改进及论文投稿可关注并留言博主的CSDN/QQ >>>一起交流&#xff01;互相学习&…

力扣(LeetCode)1758. 生成交替二进制字符串的最少操作数(C++)

模拟 我们最终串只有两种形态 ① 1010101…1010101\dots1010101… 偶数位全 111 &#xff0c;奇数位全 000 &#xff0c; ② 0101010…0101010\dots0101010… 偶数位全 000 &#xff0c;奇数位全 111 &#xff0c; 我们统计将偶数位全变成 111 &#xff0c;奇数位全变成 000 的…

传奇外网架设全套图文教程-Hero引擎

当你拿到一个Hero引擎的版本&#xff0c;首先查看一下版本内文件是否完整&#xff0c;一个完整的Hero版本应该包括&#xff1a;DBServer、LoginGate、LoginSrv、LogServer、Mir200、Mud2、RunGate、SelGate、网站和GameCenter.exe&#xff08;引擎&#xff09;&#xff0c;以上…

龙芯 处理器

龙芯&#xff1a;国内最早自主研发芯片厂商&#xff0c;MIPS 架构体系自主化程度高 龙芯是中国科学院计算所自主研发的通用CPU&#xff0c;采用自主LoongISA指令系统&#xff0c;兼容MIPS指令 n “龙芯”是我国最早研制的高性能通用处理器系列&#xff0c;于 2001 年在中科院计…

【每日一题Day42】生成交替二进制字符串的最小操作数 | 模拟 位运算

生成交替二进制字符串的最小操作数【LC1758】 You are given a string s consisting only of the characters 0 and 1. In one operation, you can change any 0 to 1 or vice versa. The string is called alternating if no two adjacent characters are equal. For example,…

黑马点评--用户签到

用户签到 BitMap用法签到功能签到统计 BitMap用法&#xff1a; 我们按月来统计用户签到信息&#xff0c;签到记录为1&#xff0c;未签到则记录为0.&#xff08;布隆过滤器就是采用这种结构&#xff09; 把每一个bit位对应当月的每一天&#xff0c;形成了映射关系。用0和1标示…

docker的安装

1、docker官网 Install Docker Engine on CentOS | Docker Documentation yum -y install gcc yum -y install gcc-c yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast yum insta…

原型(克隆)模式

文章目录思考原型(克隆)模式1.原型模式的本质2.何时选用原型模式3.优缺点4.实现原型模式(浅克隆)原型模式(深克隆)java浅克隆java深克隆思考原型(克隆)模式 原型模式顾名思义通过一个接口实现快速创建对象 1.原型模式的本质 原型模式的本质:克隆生成对象。 克隆是手段&#xff…