生成Excel并在客户端下载的JSF实现

Excel这个大家几乎每天都用到的工具,为我们的工作带来了极大的方便。在现在的B/S系统中,特别是很多大型的办公系统中,大量的 报表需要处理,导出EXCEL的功能就显得尤为重要了。导出Excel已经是相当成熟的技术了,但是在java中却不是一件容易的事。特别是在JSF架构的系统中,由于使用的人数和学习的资料都很少,实现导出Excel的功能也颇费周折。由于项目的需要,本人需要实现这样的功能,经过对大量代码的改造,实现了JSF下的生成EXCEL并在客户端实现下载的功能。下面的例子中,我用的是POI来生成Excel。Apache的Jakata项目的POI子项目,目标是处理ole2对象。 POI可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 下载。 编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。

在下面的工具类中,我通过private static void downloadFile(String strfileName) 这个方法在生成EXCEL以后实现在客户端的下载。在这个类中,这个方法就是经过改造的JSF实现。不过这个工具类有个不足之处就是,传递给downloadFile(String strfileName) 的文件名不支持中文,希望大家注意,也希望各位能给出解决办法。

package mj.util.excel;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjava.util.List;

importjavax.faces.context.FacesContext;

importjavax.servlet.ServletContext;

importjavax.servlet.ServletOutputStream;

importjavax.servlet.http.HttpServletResponse;

importorg.apache.poi.hssf.usermodel.HSSFCell;

importorg.apache.poi.hssf.usermodel.HSSFCellStyle;

importorg.apache.poi.hssf.usermodel.HSSFFont;

importorg.apache.poi.hssf.usermodel.HSSFRow;

importorg.apache.poi.hssf.usermodel.HSSFSheet;

importorg.apache.poi.hssf.usermodel.HSSFWorkbook;

/**

*本工具类解决了java到处Excel,并同时实现了客户端下载不足之处:下载方法传入的文件名不支持中文

*

*@authoryongtree

*

*/

publicclassExcelUtils{

privatestaticStringsheetname="data";

privateHSSFWorkbookwb;

privateHSSFSheetsheet;

privateHSSFRowrow;

privateHSSFCellcell;

privateHSSFFontfont;

privateHSSFCellStylecellStyle;

privateFileOutputStreamfileOut;

publicExcelUtils(){

wb=newHSSFWorkbook();

}

/**

*@paramexcelName

*excel名称。

*@paramlist

*这个list里面存放的是对象数组。数组元素可以转化为字符串显示的。这个对象数组一般对应数据库里的几列。

*@paramfirstRowValue

*/

publicvoidoutputExcel(StringexcelName,Listlist,String[]firstRowValue){

try{

this.createSheet(firstRowValue);

this.setValueToRow(excelName,list);

}catch(Exceptionex){

System.out.print(ex);

}

//System.out.println("文件名是:"+excelName);

downloadFile(excelName);

}

publicvoidoutputExcel(StringexcelName,Listlist){

try{

this.setValueToRow(excelName,list);

}catch(Exceptione){

//TODO:handleexception

}

downloadFile(excelName);

}

privatevoidsetValueToRow(StringexcelName,Listlist){

//获得JSF上下文环境

FacesContextcontext=FacesContext.getCurrentInstance();

//获得ServletContext对象

ServletContextservletContext=(ServletContext)context

.getExternalContext().getContext();

//取得文件的绝对路径

excelName=servletContext.getRealPath("/UploadFile")+"/"+excelName;

System.out.println("生成文件的路径是:"+excelName);

Object[]obj;

try{

for(inti=0;i<list.size();i++){

row=sheet.createRow(i+1);

obj=(Object[])list.get(i);

this.createCell(row,obj);

}

fileOut=newFileOutputStream(excelName);

wb.write(fileOut);

}catch(Exceptionex){

System.out.print("生成报表有误:"+ex);

}finally{

try{

fileOut.flush();

fileOut.close();

}catch(Exceptione){

System.out.println("ExcelUtil.setValueToRow()");

}

}

}

privatevoidcreateSheet(String[]firstRowValue){

try{

sheet=wb.createSheet(ExcelUtils.sheetName);

row=sheet.createRow(0);

font=wb.createFont();

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

cellStyle=wb.createCellStyle();

cellStyle.setFont(font);

for(inti=0;i<firstRowValue.length;i++){

cell=row.createCell((short)i);

cell.setCellStyle(cellStyle);

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

cell.setCellValue(firstRowValue[i]);

}

}catch(Exceptionex){

System.out.print(ex);

}

}

privatevoidcreateCell(HSSFRowrow,Object[]obj){

try{

for(inti=0;i<obj.length;i++){

cell=row.createCell((short)i);

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

cell.setCellValue(obj[i].toString());

}

}catch(Exceptionex){

System.out.print(ex);

}

}

/**

*<p>

*功能说明:根据提供的文件名下载文件,不支持中文文件名

*</p>

*此方法由yongtree添加,实现文件生成后的下载

*

*@paramstrfileName

*String

*@returnvoid

*/

privatestaticvoiddownloadFile(StringstrfileName){

try{

//获得JSF上下文环境

FacesContextcontext=FacesContext.getCurrentInstance();

//获得ServletContext对象

ServletContextservletContext=(ServletContext)context

.getExternalContext().getContext();

//取得文件的绝对路径

StringexcelName=servletContext.getRealPath("/UploadFile")+"/"

+strfileName;

FileexportFile=newFile(excelName);

HttpServletResponsehttpServletResponse=(HttpServletResponse)FacesContext

.getCurrentInstance().getExternalContext().getResponse();

ServletOutputStreamservletOutputStream=httpServletResponse

.getOutputStream();

httpServletResponse.setHeader("Content-disposition",

"attachment;filename="+strfileName);

httpServletResponse.setContentLength((int)exportFile.length());

httpServletResponse.setContentType("application/x-download");

//httpServletResponse.setContentType("application/vnd.ms-excel");

byte[]b=newbyte[1024];

inti=0;

FileInputStreamfis=newjava.io.FileInputStream(exportFile);

while((i=fis.read(b))>0){

servletOutputStream.write(b,0,i);

}

}catch(IOExceptione){

e.printStackTrace();

}

FacesContext.getCurrentInstance().responseComplete();

}

}

相关推荐