网站这么上百度,网络营销代运营服务,南昌网站建设公司特色,做网站是不是要模板文章目录 libxls - 编译概述笔记静态库工程测试控制台exe工程测试备注备注END libxls - 编译
概述
想处理.xls格式的excel文件. 查了一下libxls库可以干这个事. 库地址 https://github.com/libxls/libxls.git 但是这个库的makefile写的有问题, 在mingw和WSL下都编译不了. 好在… 文章目录 libxls - 编译概述笔记静态库工程测试控制台exe工程测试备注备注END libxls - 编译
概述
想处理.xls格式的excel文件. 查了一下libxls库可以干这个事. 库地址 https://github.com/libxls/libxls.git 但是这个库的makefile写的有问题, 在mingw和WSL下都编译不了. 好在只是几个文件, 自己做个VS的静态库工程, 包进去就行. 试了一下好使.
笔记
编译环境 : vs2019, x64 debug 做2个工程, 一个静态库工程, 一个测试控制台exe工程.
静态库工程
建立静态库工程后, 将工程模板中提供的头文件和实现文件都删掉. 将迁出的libxls目录中的include和src拷贝到静态库工程, 建立筛选器(include, include下面的libxls, src),添加文件. src目录的xls2csv.c不要添加, 这是有main()的测试程序实现. 设置头目录为 .;.\include 将预编译头设置为不使用预编译头.
函数参数声明中的 restrict 修饰去掉, 否则编译不过.
//.h
size_t xls_wcstombs_l(char * /*restrict*/ s, const wchar_t* /*restrict*/ pwcs, size_t n, xls_locale_t loc);
//.c
size_t xls_wcstombs_l(char * /*restrict*/ s, const wchar_t* /*restrict*/ pwcs, size_t n, xls_locale_t loc) {
#if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64) || defined(WINDOWS)return _wcstombs_l(s, pwcs, n, loc);
#elif defined(HAVE_WCSTOMBS_L)return wcstombs_l(s, pwcs, n, loc);
#elselocale_t oldlocale uselocale(loc);size_t result wcstombs(s, pwcs, n);uselocale(oldlocale);return result;
#endif
}将实现中的 #include “config.h” 注释掉, 没有这个文件.
工程中使用了过期函数和不安全的函数, 需要添加预处理器选项, 可以参考MSDN : https://learn.microsoft.com/zh-cn/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?viewmsvc-170
预处理器中添加 _CRT_SECURE_NO_WARNINGS, _CRT_NONSTDC_NO_WARNINGS
将函数xls_getVersion()返回的PACKAGE_VERSION注释掉, 自己按照git记录返回一个固定字符串
const char* xls_getVersion(void)
{return 1.6.2master9e0e39627269500154a1b736d245b26e2070e171;
}
再编译, 就成功了.
这个静态库工程的输出 .lib include目录, 就可以给测试工程用了.
测试控制台exe工程
新建一个控制台工程, 将工程模板中的实现删掉. 将刚才的静态库工程中生成的.lib, include目录, src目录中的xls2csv.c拷贝过来. 工程中添加xls2csv.c作为主实现. 增加筛选器include, 添加include目录中的头文件. 设置头文件路径为., .\include 设置库目录为.\
注释掉实现中的 #include unistd.h, 没这东西. 实现中用到了 getopt(), 没这东西, github上有geopt的windows实现: e.g. https://github.com/Chunde/getopt-for-windows e.g. https://github.com/skandhurkat/Getopt-for-Visual-Studio/blob/master/getopt.h 我用的这个
将gitopt.h 丢到工程中, 在工程中包含gitopt.h #include stdio.h
#include stdlib.h
#include string.h
#include ctype.h
// #include unistd.h
#include getopt.h在主实现中包含上一个工程做出的libxls静态库
#include ../include/xls.h
#pragma comment(lib, lib_for_test.lib)再编译,就编译过了
测试
看看咋用? 不带参数运行可以看用法.
test_lib.exe
usage: test_lib.exe Excel xls file [-l] [-v] [-e encoding] [-t sheet] [-q quote char] [-f field separator]Output Excel file cells as delimited values (default is comma separated)Options:-l : list the sheets contained in the file but do not output their contents.-t sheet_name : only process the named sheet-e encoding : the iconv encoding (default UTF-8)-q character : used to quote strings (default )-f string : used to separate fields (default ;)-v : verbose mode找一个utf8格式的.xls, 进行测试. test_lib utf8.xls -f ‘,’ output.csv 看着输出和正常的.csv有点区别. 无所谓. 经过测试 libxls可以正常读取.xls文件. 可以下一步自己将输出格式改一下. 反正也不能用调用命令行程序(进行excel操作时, 命令行窗口乱窜, 不是个正常的UI交互), 需要自己写一个没有DOS窗口的程序, 或者封装一个DLL来用.
备注
test_lib utf8.xls -f , outpu3.csv如上这种参数, csv文件中分隔符号就为’,‘符号了. 但是每个cell的内容还是用’分隔, 和正常的csv还是不一样. 还是需要自己定制输出代码才行.
备注
主实现上面有这几个参数的默认值
static char stringSeparator \;
static char *lineSeparator \n;
static char *fieldSeparator ,;
static char *encoding UTF-8;这样看就知道参数怎么写了.
test_lib utf8.xls -q -f , outpu3.csv这样就能生成正常的csv. 准备将实现包在DLL中, 封装一个函数来将.xls转成.csv.
END