生成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();
}
}