POI操作Excel一些中文问题的解决方法

王朝java/jsp·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

1. 设置工作表名

(下文中提到的workbook为类org.apache.poi.hssf.usermodel.HSSFWorkbook的一个实例)

如果使用workbook.createSheet(sheetname)或者使用workbook.setSheetName(1, "中文"),默认会使用ENCODING_COMPRESSED_UNICODE,在生成的EXCEL文件中会出现工作表名乱码。

需要修改为

workbook.setSheetName(1, "中文", HSSFWorkbook.ENCODING_UTF_16);

public final static byte ENCODING_COMPRESSED_UNICODE = 0;

public final static byte ENCODING_UTF_16 = 1;

查看HSSFWorkbook.java文件,发现setSheetName默认使用的encoding是ENCODING_COMPRESSED_UNICODE,这里需要指定为ENCODING_UTF_16。

此处可以对比其他一些文档中说到的方法:workbook.setSheetName(1, "中文", (short)1)。对于这个(short)1却没有文档进行详细的说明。其实就是HSSFWorkbook中的ENCODING_UTF_16。

继续跟踪下去可以发现,最后会使用类org.apache.poi.hssf.record.BoundSheetRecord中的方法。POI中的文档对此有说明:

public void setCompressedUnicodeFlag(byte flag)

set whether or not to interperate the Sheetname as compressed unicode (8/16 bit) (This is undocumented but can be found as Q187919 on the Microsoft(tm) Support site)

Parameters:

flag - (0/1) 0- compressed, 1 - uncompressed (16-bit)

这个参数flag就是前面的encoding(HSSFWorkbook.setSheetName(int sheet, java.lang.String name, short encoding)中的第三个参数通过(byte)encoding进行转换得来的)。

2. 设置单元格

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

原始cell中不管是中文或者英文内容,用cell.getEncoding()得到的值都是0。如果要设置中文值,必须setEncoding(HSSFCell.ENCODING_UTF_16)。

在其他文档中可以看到cell.setEncoding((short)1),其实是一样的。

注意,默认会使用ENCODING_COMPRESSED_UNICODE,如果要设置的值是UTF-16编码,setEncoding必须在setCellValue之前调用。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航