开源的excel读取库libxls在windows下的编译,且支持中文,全网首发

转载请注明出处:http://www.cnblogs.com/superbi/p/5482516.html

到目前为止,网络和官网上并没有关于libxls在windows下支持中文的教程,也没有现成的二进制文件。

想直接得到结果的请直接拉到最后获取成果,想自己以后遇到类似问题不用焦虑的请慢慢往下看

xls的第三方库目前能找到的只有libxl、libxls、xlslib。

libxl是商业的,对我来说直接过滤掉。

libxls只能读,xlslib只能写,对我来说知足了。

我也想能有一个跨平台的开源库能对xls进行读写,竟然没找到。

那就自己动手把,libxls和xlslib合并之后就能达到目的。

今天先来看看libxls。

首先libxls的文档不全,readme没有实质东西,最后找到INSTALL文档,如下:

BUILD AND INSTALL
=================* To build and install, for most environments:
./configure
make
make install* To build a native Win32 library under cygwin, use this configure:
CC='gcc -mno-cygwin' ./configure --host=mingw32 --build=mingw32 --with-iconv=noMAINTENANCE
===========* To build versions for multiple architectures from the same place:
- create a directory for each arch: arch-<arch-name>
- call configure and make from within each directory* Do this when you update configure.in, or when there is an upgrade of autoconf/libtool versions:
./bootstrap
or:
autoreconf -v --install --force
then:
./configure* To build a binary distribution, use the following commands after substituting the current version number (e.g., 0.30) for <version> andthe current computer architecture (e.g., i386)DESTDIR="$PWD/libxls-<version>-<arch>" make install
tar cvzf libxls-<version>-<arch>.tar.gz libxls-<version>-<arch>

可以看到linux下编译是相当简单,今天暂且不说,只是要注意是否有安装iconv。

windows环境的编译从INSTALL中

* To build a native Win32 library under cygwin, use this configure:
CC='gcc -mno-cygwin' ./configure --host=mingw32 --build=mingw32 --with-iconv=no

说明看出来我们需要使用cygwin来进行编译。

接下来进入正题:

1、首先下载cygwin,根据自己机器选择setup-x86.exe 或 setup-x86_64.exe 。

2、安装cygwin下的编译环境,仅仅为了编译libxls我们安装以下组件:

  Devel下的make、mingw64-i686-binutils、mingw64-i686-gcc-core、mingw64-i686-gcc-g++、mingw64-i686-win-iconv

3、然后把libxls源码放到cygwin中,建议放入/home/用户名/opt/下,第一次运行opt会不存在,需要手动新建。

4、在libxls的根目录(比如我的libxls根目录 c:/cygwin/home/fbi/opt/libxls)修改configure中的DEFS定义为DEFS="-DHAVE_CONFIG_H -D_GNU_SOURCE"(用来解决make时候的警告warning: implicit declaration of function 'asprintf' [-Wimplicit-function-declaration]),然后执行configure进行配置:

CC='i686-w64-mingw32-gcc' ./configure --host=i686-w64-mingw32 --build=i686-w64-mingw32

有的朋友就要问了,你的这个configure命令和libxls的INSTALL文档中提供的不一样,这是为啥呢??

只能说作者没有实时更新这个INSTALL文档,最新cygwin的gcc并不再支持“-mno-cygwin”选项,且host和build选项发生了变化。

具体的说明请见stackoverflow上此问题的第3个回答。

我一开始就是卡在这个编译指令上,完全找不到方向,只能用“cygwin编译”关键字开始搜索,然后查找到“-mno-cygwin”这个选项是用来去除编译的程序对cygwin1.dll的依赖。

剩下就目的明显了,直接把“去除编译的程序对cygwin1.dll的依赖”翻译成英文然后搜索,主要关注stackoverflow上的帖子。

当然看帖子别只看楼主采用的答案,往往对自己有用的信息隐藏在其他回答里面,这种情况已经遇到几次了。

如何通过关键字一步一步逼近自己需要的信息需要长时间搜索的经验和认真查看搜索结果中的信息。一般疑难问题的线索在stackoverflow上都会有。

回到上面的configure指令,对比INSTALL中的会发现最后少了“--with-iconv=no”

熟悉iconv的朋友结合我的文章题目就会想到iconv是用来支持中文的,想不到的也不碍事,这取决于自己的经验和知识面。

既然iconv是用来做中文支持的,也就能解释为什么我要在cygwin中安装mingw64-i686-win-iconv组件。

5、前面步骤正确的话,步骤4中的配置就会成功并生成必须的makefile文件,执行“make && make install”来进行编译安装了。

6、只要make没报错,我们就能在$(cygwin_home)/usr/local/libxls下即可看到安装成果($(cygwin_home)是指cygwin的安装目录)

安装成果中的bin目录只有xls2csv.exe,但是没法成功运行,原因就如提示一样:缺少iconv.dll,这个简单,利用everything搜索$(cygwin_home),拷贝usr\i686-w64-mingw32\sys-root\mingw\bin下的即可正常运行。

安装成果中的include目录没有什么疑问,调用dll需要的头文件目录。

安装成果中的lib目录只有libxlsreader.a和libxlsreader.la,并没有我们需要的dll和lib文件。不过可以利用.a文件最终转换出运行需要的dll、链接需要的lib及def文件。

从网上查资料得到此处能够通过gcc -shared能直接生成dll,但是我没成功,如果有朋友成功请指教,谢谢。

7、接下来我们利用安装成果中的libxlsreader.a来生成我们需要的dll、lib和def文件。

(1)在cygwin命令行下执行“i686-w64-mingw32-ar x libxlsreader.a”提取a中的.o文件

(2)然后利用.o文件来生成dll和def文件,具体命令如下:

i686-w64-mingw32-gcc -shared -o libxls.dll *.o -Wl,--export-all-symbols,--output-def,libxls.def -liconv

最后的-liconv很关键,否则会提示iconv相关接口未定义。

(3)利用dll和def通过visual studio的lib来得到链接需要的lib文件,打开visual studio 命令提示,然后切换目录到dl所在目录并执行“lib /machine:X86 /def:libxls.def”

找不到visual studio 命令提示的请看下面的2个图,图1中打开visual studio 命令提示需要右键用管理员模式打开,图2直接打开就行。

                    

 

8、到此大功告成,我们需要的libxls的动态库成功得到,中文也能正常支持了。

9、成果已上传网盘:http://pan.baidu.com/s/1miD4GVQ 密码:yxat

PS:因为在vc中使用的时候会出现编译的问题,修改xlstypes.h最终文件如下:如果有更好的办法解决请指教,谢谢,主要是因为linux和windows的差异。

#ifndef XLS_TYPES_INC
#define XLS_TYPES_INC#include <stdint.h>typedef unsigned char        BYTE;
typedef uint16_t            WORD;
typedef uint32_t            DWORD;#ifdef NO_ALIGN
typedef uint16_t            WORD_UA;
typedef uint32_t            DWORD_UA;
#else
#ifdef _WIN32
typedef __declspec(align(1)) uint16_t WORD_UA;
typedef __declspec(align(1)) uint32_t DWORD_UA;
#else
typedef uint16_t            WORD_UA        __attribute__ ((aligned (1)));    // 2 bytes
typedef uint32_t            DWORD_UA    __attribute__ ((aligned (1)));    // 4 bytes
#endif    /* _WIN32 */
#endif    /* NO_ALIGN */
#endif    /* XLS_TYPES_INC*/

 

转载于:https://www.cnblogs.com/superbi/p/5482516.html

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

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

相关文章

Chapter1-7_Speech_Recognition(Language Modeling)

文章目录1 为什么需要Language Model2 N-gram3 Continuous LM3 NN-based LM4 RNN-based LM5 合并LAS和LM5.1 shallow fusion5.2 deep fusion5.3 cold fusion本文为李弘毅老师【Speech Recognition - Language Modeling】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;…

Mongoose 索引、Mongoose 内置 CURD 方 法、扩展 Mongoose Model 的静态方法和 实例方法

一、Mongoose 索引 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;可以让我们查询数据库变得更 快。MongoDB 的索引几乎与传统的关系型数据库一模一样&#xff0c;这其中也包括一些基本的查询 优化技巧。 mongoose 中除了以前创建索引的方式&#xff0c;我们…

winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...

电脑硬盘&#xff0c;到底该不该分区&#xff1f;很多人买了新电脑或者在电脑中安装了SSD硬盘之后&#xff0c;第一个步骤就是&#xff1a;开机-给硬盘分区。但是&#xff0c;大家有没有考虑过&#xff0c;硬盘是否真的需要分区呢&#xff1f;这不最近有人就在程序员社区V2EX上…

php 系列

1.给 跑在windows 环境下的php&#xff0c; 安装redis 拓展。&#xff08;installing Redis & Redis extension in PHP on XAMPP on windows.&#xff09; step 1: 安装redis server&#xff08;windows&#xff09; http://fellowtuts.com/php/install-redis-redis-extens…

搞懂RNN

文章目录1 什么是RNN2 LSTM3 Training3.1 Learning Target3.2 为什么难train4 应用举例4.1 Many To One4.2 Many To Many4.3 其他本文为李弘毅老师【Recurrent Neural Network(Part I)】和【Recurrent Neural Network(Part II)】的课程笔记&#xff0c;课程视频来源于youtube(需…

bp神经网络预测_股指期货价格变动趋势往往反映的是股票价格的走势,因此BP神经网络对股指期货价格的准确预测就是对股票价格的准确预测。...

一只猫の生活态度对于投资者而言&#xff0c;利用BP神经网络模型对股指期货价格进行准确预测&#xff0c;可以帮助投资者构建较佳的投资组合&#xff0c;从而获取较好的投资收益&#xff0c;规避系统风险&#xff1b;对于国家而言&#xff0c;准确预测股指期货价格走势&#xf…

Mongoose aggregate 多表关联查询

1. 查询每个order订单中的所有orderItem&#xff08;多表关联查询&#xff09; order.js: var mongoose require(./db.js)var OrderSchema mongoose.Schema({order_id: String,uid: Number,trade_no: String,all_price: Number,all_num: Number })var OrderModel mongoose…

搞懂Transformer

文章目录1 内容简述2 seq2seq的常用模块3 Self-attention4 Multi-head Self-attention5 Positional Encoding6 Transformer参考资料文为李弘毅老师【Transformer】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自…

excel计算二元线性回归_怎么看懂Excel线性回归参数

虽然之前用python做线性回归的时候看上去好像很简单&#xff0c;但是直到我在excel上实践了线性回归&#xff0c;发现有很多指标值得去参考&#xff0c;对于在python上实现有指导作用。打开excel2016&#xff0c;先找个数据我们这里直接选择做线性回归&#xff0c;在菜单栏选择…

冲刺阶段 day 6

项目进展&#xff1a;学生管理这部分已经进展的差不多了&#xff0c;调试了几遍,改了几个小Bug之后就没有什么问题了,基本完成&#xff0c;如若后续还有一些新的功能到时候再自行加入。明天开始教师部分。 存在问题&#xff1a;我觉得我们的项目还是比较课堂&#xff0c;比较中…

Chapter2-1_Voice Conversion(Feature Disentangle)

文章目录1 什么是Voice Conversion2 实际实现中的细节3 根据数据集分类4 Feature disentangle5 训练技巧本文为李弘毅老师【Voice Conversion - Feature Disentangle】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均…

1 0.99999的悖论_无限小数与芝诺悖论

问题昨天晚上&#xff0c;小学6年级的外甥女从数学课外辅导班补习回来&#xff0c;兴冲冲的对家里人说&#xff0c;哎&#xff0c;我发现了一个数学的大bug啊。你说1/3不是一个无限循环小数0.33333...&#xff0c;那么三个1/3加起来&#xff0c;不就是0.99999...吗&#xff1f;…

Mongoose 中使用 populate 实现关联查询

一、Mongoose populate 官方文档 https://mongoosejs.com/docs/populate.html 二、Mongoose populate 关联查询 1、定义 ref var ArticleSchema new Schema({ title:{type: String, unique: true},cid : {type: Schema.Types.ObjectId, ref:ArticleCate //model 的名称 }, …

FPGA开发全攻略——概念篇

原文链接&#xff1a; FPGA开发全攻略连载之一&#xff1a;FPGA为什么这么热&#xff1f; FPGA开发全攻略连载之二&#xff1a;为什么工程师要掌握FPGA开发知识&#xff1f; FPGA开发全攻略连载之三&#xff1a;FPGA基本知识与发展趋势&#xff08;part1&#xff09; FPGA开发全…

vue @input带参数_Vue 全家桶开发的一些小技巧和注意事项

前言用 vue 全家桶开发一年多了&#xff0c;踩过不少坑&#xff0c;也解决了很多的问题&#xff0c;把其中的一些点记录下来&#xff0c;希望能帮到大家。以下内容基于最新版的 vue vuex vue-router axios less elementUI&#xff0c;vue 脚手架是 vue-cli3。css 的 scope…

Chapter2-2_Voice Conversion(CycleGAN and StarGAN)

文章目录1 内容简述2 CycleGAN3 StarGAN本文为李弘毅老师【Voice Conversion - CycleGAN and StarGAN】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自于李宏毅老师的PPT&#xff0c;若有侵权&#xff0c;必定删…

cookie与session原理详解

一、 Cookie cookie&#xff1a;浏览器在电脑硬盘中开辟的一块空间&#xff0c;主要供服务器端存储数据。 cookie中的数据是以域名的形式进行区分的。cookie中的数据是有过期时间的&#xff0c;超过时间数据会被浏览器自动删除。cookie中的数据会随着请求被自动发送到服务器端。…

eclipse的servlet默认不执行index_MySQL之索引及执行计划分析

mysql官方对索引的定义为&#xff1a;索引(index)是帮助MySQL高效获取数据的数据结构。索引的本质&#xff1a;索引是数据结构。索引就是排好序的快速查找数据结构一般来说索引本身也很大不可能全部存储在内存中&#xff0c;因此索引往往以索引文件的形式存储在磁盘上平时所说的…

Chapter3-1_Speech Separation(Deep Clustering, PIT)

文章目录1 内容简述2 评价指标2.1 Signal-to-noise ratio (SNR)2.2 Scale invariant signal-to-distortion ratio (SI-SDR)2.3 其他的评价指标3 Permutation Issue4 Deep Clustering5 PIT本文为李弘毅老师【Speech Separation - Deep Clustering, PIT】的课程笔记&#xff0c;课…

Joi验证模块的使用

1. 安装 官网中文文档&#xff1a;https://joi.dev/api/?v12.1.0#validatevalue-schema-options-callback //下载14.3.1 npm install 14.3.1注意&#xff1a;下载14.3.1&#xff0c;在npm install joi的时候默认下载的是最新版本 joi17.1.1,对于一些API高版本会舍弃从而出现…