MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

POI处理Excel公式的乱码问题

Posted on 2009-07-29 15:59 leekiang 阅读(1358) 评论(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

只有注册用户登录后才能发表评论。


网站导航: