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