最近在捯饬Asp.Net站点部署到Linux平台上面,在文档导入的操作中经过网上搜索采用了能够支持跨平台的ExcelDataReader组建。在本地windows上测试通过NuGet安装的组建,这货依赖了SharpZipLib .Net下鼎鼎有名的解压缩组建,应该用来解压Excel文档的。本地测试没读取正常没有问题,但发布到Linux上运行总是无法读取,返回Null,这让我很是迷惑!接下来准备找出问题所在~

1)下载了ExcelDataReader源码本地编译测试 问题依然存在,读取不到数据。

2)Linux平台非开发环境,在源码上定位到错误打印方法上发现输出是ExceptionMessage,更改为.ToString() 并用控制台打印输出,观察代码出错行。得到如下结果:

错误信息居然是SharpZipLib报的...... 好吧,继续下载SharpZipLib源码找问题。

3)下载完成SharpZipLib源码,定位到SharpZipLib.Zip.ZipConstants.ConvertToString (System.Byte[] data, Int32 count)方法:

这里代码很简单,错误是找不到对象,if判断就是检查data是否为null的,那么肯定不是判断里面的错误了。那么只有可能是下面的字节数组转字符串报错的,仔细看下不明白int类型的DefaultCodePage是什么鬼,和我平时写的Encoding.GetEncoding("utf8").GetString(data, 0, count);不一样。遂去找了下DefaultCodePage的定义:

找了下CodePage的定义,原来这玩意叫做内码表 是定义了字符编码类型映射的一个整形数字

百度百科这样说:

1 CodePage:可读/可写。整型。定义用于在浏览器中显示页内容的代码页。代码页是字符集的数字值,不同的语言使用不同的代码页。例 如,ANSI代码页为1252,日文代码页为932,简体中文代码页为936。一般情况下,当你上传到国外网页空间,或者提取数据库记录等出现乱码时,就 采用这种方法解决。

嗯,简体中文是936,难道我的文档是中文的原因?可是我也改成英文单词还是不行啊,试着打印下运行中的这个DefaultCodePage是多少:

OEMCodePage又是什么鬼呢?

找到这个介绍:http://dcx.sap.com/1200/zh/dbadmin/win-collation-natlang.html 意思是说这是老的Dos环境中使用的编码,我还以为服务器设备制造商所在地区的编码呢。。。。

(⊙ˍ⊙) 没错的样子,编码对的。。。

不解,先把这玩意改掉再说

return Encoding.GetEncoding(Encoding.Default.CodePage).GetString(data, 0, count);

  

我也用CodePage,用.Net环境获取到的CodePage,然后运行测试,没问题了:

文档内容:

解析代码:

FileStream stream = System.IO.File.Open("ArticleTemplate.xlsx", FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
Console.WriteLine("");
excelReader.IsFirstRowAsColumnNames = true;
DataSet ds = excelReader.AsDataSet();
if (ds == null)
{
Console.WriteLine("ds Is Null");
}
else
{
Console.WriteLine("Read Ok");
}
foreach (DataTable dt in ds.Tables)
{
foreach (DataRow dr in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
Console.WriteLine(dr[i]);
}
}
}

  

(。_。)好吧,居然是这个问题导致的,那么.net环境在mono上获取的CodePage是多少呢?

查询得到 65001 代表的是 UTF-8

那么我的win环境下是什么样子呢?

都是936 也就是简体中文 也就是GBK编码。

现在的情况是linux环境获取到GBK编码但不能用,难道我的Linux环境没有GBK编码?locale查看当前系统使用的编码:

清一色的UTF8 没有GBK。 locale -a命令可以查看支持的编码,有显示支持GBK。

那么只能猜测 mono上运行.Net 程序做编码转换的时候只能转换成当前使用的编码?

目前更改成Encoding.Default能解决编码出错的问题了,但实际原因是不是我猜测的这样,我也不知道了。。。

一次Mono解析Excel文档编码出错排查记录的更多相关文章

  1. Android解析Excel文档完整示例

    MainActivity如下: package cc.testexcel; import java.io.File; import jxl.Cell; import jxl.CellType; imp ...

  2. POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)

    一.使用poi解析excel文档 注:全部采用poi接口进行解析,不需要区分xls.xlsx格式,不需要判断文档类型. poi中的日期格式判断仅支持欧美日期习惯,对国内的日期格式并不支持判断,怎么办? ...

  3. Oracle PLSQL读取(解析)Excel文档

    http://www.itpub.net/thread-1921612-1-1.html !!!https://code.google.com/p/plsql-utils/ Introduction介 ...

  4. Java解析excel文档并以List<T>输出

    /********************************************************工具类start*********************************** ...

  5. Java使用poi包读取Excel文档

    项目需要解析Excel文档获取数据,就在网上找了一些资料,结合自己这次使用,写下心得: 1.maven项目需加入如下依赖: <dependency> <groupId>org. ...

  6. 读取EXCEL文档解析工具类

    package test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException ...

  7. 使用dom4j解析XML文档

    dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ...

  8. 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  9. PHP读取excel文档

    PHP读取excel文档 项目需要读取Excel的内容,从百度搜索了下,主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel.   PHPExcelReader比较轻量级, ...

随机推荐

  1. AOP理解,待细看

    http://jinnianshilongnian.iteye.com/blog/1474325

  2. 通过YUM命令查找对应命令是通过何种软件提供的

    # yum whatprovides [命令]

  3. sqlserver设置具体的访问权限

    为具体的用户设置具体的访问权限 收藏 use 你的库名 go --新增用户 exec sp_addlogin 'test' --添加登录 exec sp_grantdbaccess N'test' - ...

  4. 使用struts2的iterator标签出现的错误

    错误如下所示: 代码如下所示: <body> <s:debug></s:debug> 获取list的值第一种方式 <!-- 3 获取值栈list集合数据 -- ...

  5. 在调用boostrap的model时获取到是哪个html元素调用

    调用的html代码: <a class="bk-round bk-border-info bk-border-darken bk-bg-lighten bk-border-3x bk- ...

  6. 新东方雅思词汇---7.1、probation

    新东方雅思词汇---7.1.probation 一.总结 一句话总结:prob(检查,试验)+ation 英 [prə'beɪʃ(ə)n]  美 [pro'beʃən]  n. 试用:缓刑:查验 短语 ...

  7. 机器学习(二)—支持向量机SVM

    1.SVM的原理是什么? SVM是一种二类分类模型.它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器.(间隔最大是它有别于感知机) 试图寻找一个超平面来对样本分割,把样本中的正例和反例 ...

  8. java基础篇 -- 导出excel表格数据

    本篇文章基于java把数据库中的数据以Excel的方式导出,欢迎各位大神吐槽: 1.基于maven jar包引入如下: <dependency> <groupId>net.so ...

  9. tableau 常识积累

    没怎么在业务系统中使用过,所以需要好好积累.看起来很简单的东西都需要慢慢来用.下了一份它的官方文档10.3版本的.公司网络限制,不能去它官网学习.只有下班时间了. 先说一个,有时候度量值它和HANA类 ...

  10. 强大的表格控件handsometable,结合vue

    handsontable handsontable是目前在前端界最接近excel的插件,可以执行编辑,复制粘贴,插入删除行列,排序等复杂操作.jQuery.react.ng和vue版本,功能强大,是复 ...