libxls - 编译

文章目录

    • 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?view=msvc-170

预处理器中添加 _CRT_SECURE_NO_WARNINGS, _CRT_NONSTDC_NO_WARNINGS

将函数xls_getVersion()返回的PACKAGE_VERSION注释掉, 自己按照git记录返回一个固定字符串

const char* xls_getVersion(void)
{return "1.6.2+master+9e0e39627269500154a1b736d245b26e2070e171";
}

再编译, 就成功了.

这个静态库工程的输出 .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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python从入门到进阶】44、Scrapy的基本介绍和安装

接上篇《43.验证码识别工具结合requests的使用》 上一篇我们学习了如何使用验证码识别工具进行登录验证的自动识别。本篇我们开启一个新的章节&#xff0c;来学习一下快速、高层次的屏幕抓取和web抓取框架Scrapy。 一、Scrapy框架的背景和特点 Scrapy框架是一个为了爬取网站数…

Diva配置——Communication Tests

关联文章:CANoe.Diva生成测试用例 Diva目录 一、CANoe.Diva简介二、Communication Tests配置一、CANoe.Diva简介 CANoe.DiVa 是一种 CANoe 选项,用于对 ECU 中的诊断软件实施进行自动化测试。 可以通过CANdelaStudio制作的CDD或ODX文件,经过Diva配置自动生成测试用例和测试脚…

PyCharm community 安装教程

目录 链接cudatoolkit 下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/other.html 双击打开 安装路径&#xff0c;可自行更换到D盘 不导入设置 链接cudatoolkit

Github 2023-12-18 开源项目周报 Top14

根据Github Trendings的统计&#xff0c;本周(2023-12-18统计)共有14个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目4Python项目4Jupyter Notebook项目3非开发语言项目1JavaScript项目1Rust项目1Go项目1 基于项目…

雷电4.0.50模拟器Android7.1.2安装xposed框架

官方论坛&#xff1a;https://xdaforums.com/t/official-xposed-for-lollipop-marshmallow-nougat-oreo-v90-beta3-2018-01-29.3034811/ Xposed 有分支 [EdXposed 和 LSPosed] 。 Edxposed框架现在支持android 8.0 - android 9.0 &#xff0c;如果是android 7.0或更早的版本&…

写好ChatGPT提示词原则之:清晰且具体(clear specific)

ChatGPT 的优势在于它允许用户跨越机器学习和深度学习的复杂门槛&#xff0c;直接利用已经训练好的模型。然而&#xff0c;即便是这些先进的大型语言模型也面临着上下文理解和模型固有局限性的挑战。为了最大化这些大型语言模型&#xff08;LLM&#xff09;的潜力&#xff0c;关…

威联通硬盘休眠后修改系统定时任务

按照网上一些教程&#xff0c;成功将威联通的机械硬盘设置了自动休眠。但是发现每天有多个整点硬盘会自动唤醒&#xff0c;怀疑是系统内置的定时任务触发了硬盘唤醒。 通过查看系统日志中事件和访问记录&#xff0c;判断出一些引发硬盘唤醒的自动任务&#xff0c;将这些定时任…

如何通过兴趣爱好选职业?

一个错误的选择&#xff0c;可能造成终身的遗憾&#xff0c;一个正确的选择&#xff0c;可以让我们少奋斗几十年。所以无论现在付出多少代价&#xff0c;多花一些时间&#xff0c;去研究以下未来的职业方向&#xff0c;这是值得的。 职业定位&#xff08;专业定位&#xff09;…

【漏洞复现】CVE-2023-39560:ECTouch V2电商系统SQL注入 附POC

漏洞描述 ECTouch是一款开源的电商系统,为中小企业提供最佳的新零售解决方案。采用稳定的MVC框架开发,执行效率、扩展性、稳定性值得信赖。MVC是一种将应用程序的逻辑层和表现层进行分离的方法。MVC分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。…

六:爬虫-数据解析之BeautifulSoup4

六&#xff1a;bs4简介 基本概念&#xff1a; 简单来说&#xff0c;Beautiful Soup是python的一个库&#xff0c;最主要的功能是从网页抓取数据官方解释如下&#xff1a; Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。 它是一个工具箱…

设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析

工厂模式介绍 工厂模式是我们最常用的实例化对象模式了&#xff0c;是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…

设计模式—装饰模式

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 装饰模式—穿衣服&#x1f48e;总结 装饰模式—穿衣服 装饰模式&#xff08;Decorator&#xff09;可以动态的给对象添加一些额外的职责。 Component是定义一个对象接口&#xff0c;可以给这些对象动态地添加职责。…