Posted on 2008-10-21 22:11
leekiang 阅读(4407)
评论(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名带有括号造成的。