修改POI中公式不能显示中文的方法

来源:互联网 发布:初中学信息学奥赛vb 编辑:程序博客网 时间:2024/04/28 23:57

        前几天做项目的过程中,利用到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文件。

 

 

 

原创粉丝点击