POI处理Excel公式的乱码问题

hant 2006-03-09 10:59:42
本人在利用POI进行EXCEL的模板输出时,利用公式进行超级链接的嵌入,目前已经能够通过setCellFormula设置单元格的公式,但是由于其中需要传递参数,并且一些参数是中文,设置到EXCEL中的时候就变成乱码了,还请有这方面经验的朋友给点意见,以及解决方法。谢谢!
...全文
630 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
amushen 2006-03-31
sign
回复
hant 2006-03-21
前几天做项目的过程中,利用到Apache项目中的POI来实现基于Excel的数据模板输出,其中利用公式的方式嵌入超链接进行网页链接访问。
自己做了一些处理EXCEL单元格的方法,但在进行公式处理时,由于POI的问题,显示的公式信息一直都是乱码,后来在网上找到一些朋友关于这些问题的解决方法,感觉帮助很大。因此,结合自己的实践经验,把修改POI内部源码的过程写出来,以其对资料做一整理,希望对后来的朋友也有所帮助。

1、首先,上网找到POI的发布版本的源码,我下的是poi-src-2.5.1-final-20040804.zip这个版本。
2、找到StringPtg.java这个文件,在解压后的\src\java\org\apache\poi\hssf\record\formula文件夹下面
3、利用文本编辑工具对StringPtg.java进行编辑
4、找到public StringPtg(byte [] data, int offset)这个方法,
对其修改如下
/** Create a StringPtg from a byte array read from disk */
public StringPtg(byte [] data, int offset)
{
offset++;
field_1_length = data[offset];
field_2_options = data[offset+1];
if (fHighByte.isSet(field_2_options)) {
// modified by rainsoft
// in excel chinese is stored two bytes HIGH bytes,LOW bytes
// field_3_string= StringUtil.getFromUnicode(data,offset+2,field_1_length);
field_3_string= StringUtil.getFromUnicodeHigh(data,offset+2,field_1_length);
}else {
field_3_string=StringUtil.getFromCompressedUnicode(data,offset+2,field_1_length);
}

//setValue(new String(data, offset+3, data[offset+1] + 256*data[offset+2]));
}
其中主要利用getFromUnicodeHigh方法替换原有的方法进行处理。
5、再查找StringPtg(String value),做如下的修改,

public StringPtg(String value) {
if (value.length() >255) {
throw new IllegalArgumentException("String literals in formulas cant be bigger than 255 characters ASCII");
}
this.field_2_options=0;
// add by rainsoft
// two bytes char options must be "1"
try {
if (value.length()!=value.getBytes("GBK").length)
this.field_2_options=1;
} catch (Exception e) {
}
// end add
this.fHighByte.setBoolean(field_2_options, false);
this.field_3_string=value;
this.field_1_length=(byte)value.length(); //for the moment, we support only ASCII strings in formulas we create
}

6、至此对源文件的修改就结束了,下一步则需要对其进行编译输出。
7、利用docs/howtobuild.html的描述进行编译输出。
8、成功编译输出的POI???????.jar文件,复制到原有的编译路径,替换到原有的文件即可,最好删除原有的 POI文件。



回复
forevertraveller 2006-03-09
我记得文档里有关于编码的设置
回复
hant 2006-03-09
通过设置单元格的编码格式,可以将普通的单元格的乱码情况去掉,但公式通过这种方法却不行呀!还望有了解的朋友继续呀!
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2006-03-09 10:59
社区公告
暂无公告