======================================================
注:本文源代码点此下载
======================================================
以前的时候发现直接java读取一个excel文件输出里面的字符串会乱码,中文字符不会乱码,但是遇到英文的时候输出会乱码。这个问题太奇怪了。
我的表格名字为shirley.xls。
我曾经直接读取excel表格中那个有英文字符串的单元格
workbook book = workbook.getworkbook(new file("d:\\excel\\shirley.xls"));
// 获得第一个工作表对象
sheet st = book.getsheet(0);
// 得到单元格
system.out.println(st.getcolumns());
cell c1 = st.getcell(1,11);
string name = c1.getcontents().replaceall(" ", "");
system.out.println(name);
book.close();
打印的时候输出:?shirley;
显然这个单元格在读取的时候有问题,编码格式不对。
开始的时候我尝试将这个字符串name编码转换,string s1 = new string(name.getbytes("gbk"),"utf-8");
但是输出还是会有问题: ?shirley.
解决方法一:
查阅网上资料发现在读取excel的时候一开始设置好读取的编码方式就能解决中文乱码,那这个对于英文乱码会不会有效呢?
于是修改了以上读取excel时候的代码:
workbooksettings workbooksettings = new workbooksettings();
workbooksettings.setencoding("iso-8859-1");
workbook book = workbook.getworkbook(new file("d:\\excel\\shirley.xls"),workbooksettings);
打印输出正常:shirley.
--------------------------------------------
解决方法二:
你也可以不修改初始读取excel的编码方式,在读取string name = c1.getcontents().replaceall(" ", "");
的时候将name的最开始一个字节截掉,这样就也能显示正常,
注意是截掉一个字节,不是一个字符,如果用string方式截掉最前面一个字符,显示就为:hirley。
public static string cutonebyte(string str) {
if (str != null && !str.equals("")) {
byte[] a = str.getbytes();// 转化为字节流处理,去掉最前面一个字节,以防止第一个字母乱码
byte[] b = new byte[a.length - 1];
for (int i = 1; i < a.length; i++) {
b[i - 1] = a[i];
}
str = new string(b);
}
return str;
}
用以上方法:
name = name.cutonebyte(name);
这样子处理过后name也能显示正常了。不过没有第一种方法好。
在中文的情况下没有出现乱码现象,就是说当采用默认编码的方式读取excel的数据时候是用utf-8方式读取的数据(我的eclipse平台采用utf-8编码),中文字符没有受到影响。为什么在utf-8方式下读取英文字符串的时候会乱码呢,我这边第二种方法显示这个英文字符在utf-8下读取的时候最前面有一个字节和英文字符s结合后产生了乱码,但是不明白这个导致乱码的字节有什么作用在excel中。我怀疑最大的可能是excel中排版以及格式问题导致的。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/