java中读取excel文件中字符串乱码问题解决方法


======================================================
注:本文源代码点此下载
======================================================

以前的时候发现直接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^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值