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

版权声明:本文为wattone原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wattone/archive/2010/05/04/1727314.html