大家时间都这么宝贵,没有起因的问题是不值得被优先研究的。这篇博客的起因就是希望找到一个比较合适于C++的开源库,用以在C++中生成Excel文档。其实C++可用的开源Excel库,很多博主都已经撰文提及。例如:# c++操作excel的几种库这篇博文的作者就总结了几种库,小白也是从这篇文章开始挑选的。
从上文提到的博文里,小白挑选了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文档中写入文本、数字、公式、超链接,并且支持多工作表。它支持的一些功能特征如下:
zlib
. 唯一的依赖库是zlib
。特别注意最后一条——这一条的重要性在于,对我们编译和使用libxlsxwriter库有比较大的影响。
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库,即新建一个工程,我们只需要准备好以下文件:
注意在预生成事件/生成后事件里把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编译器中可能安装时选择了英语和中文简体,日语和韩语编码不能解析。解决的办法是把对应报错的日语和韩语直接注释掉。当然这样也意味着在使用库时就最好不要使用日语和韩语输入了。如果有VS2019的话,则不会有此坑。
小白在满心欢喜调试的过程中,发现输入中文时生成的xlsx文件会报错误。
点“否”就退出了,点“是”,则报错,称xml错误,所有中文以及中文所在列都没了:
这个问题是由于我们源码的保存格式存在问题,由于默认设置的缘故,可能是由于使用的VS简体中文版,使得源文件的默认保存格式是“简体中文(GB2312)”。
这时候我们需要在“文件”-“高级保存选项”里把源文件的编码格式换成“UTF-8不带签名”。有的同学可能会问了,在Windows下,不是应该保存成带签名的UTF-8模式吗?这里要说明一下,因为Excel文件实际上是解析XML文件,而这个XML文件采用的是不带签名的UTF-8编码,所以跟系统没有啥特别关系。
还有的同学会问了,说为什么“文件”里没找到“高级保存选项”啊?
那么在“工具”–> “自定义”里
这个库还是功能比较强大的,既可以使用中文,也可以对单元格进行格式设定,甚至还能画图、写宏。后面还是需要把相关的功能再仔细学习一下。
【水平所限,错漏难免。创作不易,轻喷勿骂】
上一篇:扬天m5700v(扬天M5790N) 扬天m5700v 联想扬天m5700v什么配置
下一篇:显示器驱动程序已停止响应并且已恢复(显示器驱动程序已停止响应并且已恢复是怎么回事) 显卡驱动停止响应已恢复怎么解决 win7显示驱动停止响应并恢复