Posted on 2009-07-29 15:59
leekiang 阅读(1362)
评论(0) 编辑 收藏 所属分类:
文件处理
前几天做项目的过程中,利用到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文件。
http://topic.csdn.net/t/20060309/10/4602637.html