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

用poi生成链接

Posted on 2008-10-21 22:11 leekiang 阅读(4410) 评论(1)  编辑  收藏 所属分类: 文件处理
1,
一个需求, 要求报表生成的Excel表格支持超链接。例如点击Excel内的公司名, 自动打开浏览器并连到该公司的网站上去。在Excel里面选中所需的单元格, 右键弹出属性, 选超链接就能输入相应的地址了,既然Excel支持超链接。那就没有什么借口说不能实现了。:).

翻了翻POI的文档, 很容易就找到了解决方案。在POI中让单元格实现超链接功能, 可以用Hyperlink 函数。HYPERLINK函数包含两个参数,第一个参数是指向的地址,第二个参数是显示的字符串

cell = row.createCell(colNumber)。
cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula("HYPERLINK(\"" + "Http://www.google.ca"+ "\",\"" + "Google Canada"+ "\")");
或cell.setCellFormula("HYPERLINK(\"[workbook.xls]'sheet2'!A1\",\"homepage\")"); //HYPERLINK("#明细!A1","homepage"),#代表本工作簿,来源http://club.excelhome.net/thread-54081-1-1.html

现在超链接单元格看起来和一般的单元格没有分别, 除非你把鼠标放上去才会变成手行光标。 为了和一般的习惯相符, 还需要把字符颜色变成蓝色和加上下划线。 这就要用到 style了、

HSSFCellStyle linkStyle = workbook.createCellStyle();
HSSFFont cellFont= workbook.createFont();
cellFont.setUnderline((byte) 1);
cellFont.setColor(HSSFColor.BLUE.index);
linkStyle.setFont(cellFont);

最后把style应用到cell上去就大功告成了。
cell.setCellStyle(linkStyle);

以上修改自http://sunnylei2008.blogspot.com/2007/07/poihssf.html
和http://diystyle.javaeye.com/blog/132093
还有http://blog.csdn.net/xunyiren/archive/2007/03/08/1524533.aspx

2,
以下来自http://www.javaeye.com/topic/25569,是用jxl解决的。
看了POI文档,找到一个LinkedDataFormulaField 和LinkedDataRecord,jxl文档里有 Hyperlink,现在想对一个excel中的一组sheet做一个索引,方便查找每张sheet,
String outputFile="D:/导出接口.xls";
try
{
Workbook wb=Workbook.getWorkbook(new File(outputFile)); //Excel获得文件
//打开一个文件的副本,并且指定数据写回到原文件
WritableWorkbook book=Workbook.createWorkbook(new File(outputFile),wb);
WritableSheet sheet=book.createSheet("导出目标",0); //添加一个工作表
String[] oriSheetNames=wb.getSheetNames();  //获得源excel文件中的所有sheet名称
 for(int i=0;i<book.getNumberOfSheets();i++)
 {
    sheet.addCell(new Label(0,i+1,String.valueOf(i+1)));  //第一列写入编号
/**
* public WritableHyperlink(int col,int row,java.lang.String desc,WritableSheet sheet,int destcol,int destrow)
* Constructs a hyperlink to some cells within this workbook
* col - the column containing this hyperlink
* row - the row containing this hyperlink
* desc - the cell contents for this hyperlink
* sheet - the sheet containing the cells to be linked to
* destcol - the column number of the first destination linked cell
* destrow - the row number of the first destination linked cell
* */
sheet.addHyperlink(new WritableHyperlink(1,i+1,oriSheetNames[i],book.getSheet(oriSheetNames[i]),0,0));
book.write();
book.close();
wb.close();
}catch(IOException e)
{
    System.out.println("异常: "+e);
}
catch(BiffException e)
{
    System.out.println("异常: "+e);
}
catch(RowsExceededException e)
{
    System.out.println("异常: "+e);
}
catch(WriteException e)
{
    System.out.println("异常: "+e);
}

3,公式里的乱码如何解决,来源:http://topic.csdn.net/t/20060309/10/4602637.html,作者阿水
前几天做项目的过程中,利用到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的描述进行编译输出。  

后注:按上面的办法,中文问题是解决了,但点击链接还是报"引用无效",观察了一会,原来是sheet名带有括号造成的。
 


评论

# re: 用poi生成链接  回复  更多评论   

2012-01-05 10:46 by caoshl
谢谢,学习了

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


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问