最近在捯饬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. vue v-if with v-for

    遍历和条件判断混合使用示例. <!DOCTYPE html> <html> <head lang="en"> <meta charset= ...

  2. review04

    在编译源文件时,所用到的其他源文件也会被自动编译.这是因为它会使用到其他源文件产生的字节码文件. javac A.java A指的是源文件的名称 java B B指的是源文件中有main方法的类. 虽 ...

  3. cmscp实例笔记

    1.迭代循环 [@NodeList;list] [#list list as node] [#if node.name == "产品试用"] [/#if] [#if node.na ...

  4. String随笔

    1.古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:,请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 设计思想:1)定义一个String类型 ...

  5. Chrome Adobe flash player已过期怎么办

    越来越多的朋友感受到了来自谷歌chrome新版浏览器的压力,因为有不少朋友在使用新版chrome浏览器看视频时,却出现了这样的提示:Adobe flash player已过期!怎么办啊? 有网友抱怨: ...

  6. python any函数

    pyhton的any() 函数: 判断给定的可迭代参数 iterable : 全部为 False,返回 False; 至少有一个为 True,则返回 True. 元素除了是 0.空.FALSE 外都算 ...

  7. redis学习主从配置

    配置slave服务器只需要在配置文件中加入如下配置: slaveof 127.0.0.1 6379 即:slaveof  masterip  masterport

  8. 转载:电商项目完成的BUG调查原因和解决方案

    转载: http://blog.csdn.net/yuexianchang/article/details/73197874

  9. Xml日志记录文件最优方案(附源代码)

    Xml作为数据存储的一种方式,当数据非常大的时候,我们将碰到很多Xml处理的问题.通常,我们对Xml文件进行编辑的最直接的方式是将xml文件加载到XmlDocument,在内存中来对XmlDocume ...

  10. bzoj 4403 序列统计——转化成组合数的思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4403 先说说自己的想法吧. 设f[ i ][ j ]表示当前在倒数第 i 个位置,当前和后面 ...