最近在捯饬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. JSON解析字符串

    JSON解析字符串 JSON 解析字符串时,应按严格的标准,否则无法解析: str1 = '{"str":"string","number" ...

  2. QT 利用QSplitter 分割区域, 并添加QScrollArea 滚动区域,滚动条

    1. QSplitter 分割区域, 可以分割区域中可以随意添加自己的布局 2. #include "dialog.h" #include <QApplication> ...

  3. BZOJ3244/UOJ122 [Noi2013]树的计数

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

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

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

  5. 在线显示office文件

    微信或手机浏览器在线显示office文件 1.判断浏览器类型 HttpServletRequest req = ServletActionContext.getRequest(); String us ...

  6. hdu 5244 inverse(分治¥)

    inverse Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. 【VS2013编译DirectX Tutorials时遇到的错误】"const wchar_t *" 类型的实参与 "LPCSTR" 类型的形参不兼容

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/3696367.html 通过查看LPCSTR的定义: typedef _Null_te ...

  8. mysql 初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  9. C#文件操作常用相关类(Directory类、File类、Path类)

    1.文件操作常用相关类 1)File //操作文件,静态类,对文件整体操作.拷贝.删除.剪切等 2)Directory //操作目录(文件夹),静态类 3)DirectoryInfo //文件夹的一个 ...

  10. [HihoCoder1413]Rikka with String

    vjudge 题意 给你一个串,问你把每个位置的字符替换成#后串中有多少本质不同的子串. \(n\le 3*10^5\) sol 首先可以计算出原串里面有多少本质不同的子串.显然就是\(\sum_{i ...