以前的时候发现直接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中排版以及格式问题导致的。