生成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;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/** *//**
* 本工具類解決了java到處Excel,并同時實現了客戶端下載 不足之處:下載方法傳入的文件名不支持中文
*
* @author vincent
*
*/

public class ExcelUtils
{
private static String sheetName = "data";
private HSSFWorkbook wb;
private HSSFSheet sheet;
private HSSFRow row;
private HSSFCell cell;
private HSSFFont font;
private HSSFCellStyle cellStyle;
private FileOutputStream fileOut;

public ExcelUtils()
{
wb = new HSSFWorkbook();
}

/** *//**
* @param excelName
* excel名稱。
* @param list
* 這個list里面存放的是對象數組。數組元素可以轉化為字符串顯示的。這個對象數組一般對應數據庫里的幾列。
* @param firstRowValue
*/

public void outputExcel(String excelName, List list, String[] firstRowValue)
{

try
{
this.createSheet(firstRowValue);
this.setValueToRow(excelName, list);

} catch (Exception ex)
{
System.out.print(ex);
}
// System.out.println("文件名是:" + excelName);
downloadFile(excelName);
}

public void outputExcel(String excelName, List list)
{

try
{
this.setValueToRow(excelName, list);

} catch (Exception e)
{
// TODO: handle exception
}
downloadFile(excelName);
}

private void setValueToRow(String excelName, List list)
{
// 獲得JSF上下文環境
FacesContext context = FacesContext.getCurrentInstance();
// 獲得ServletContext對象
ServletContext servletContext = (ServletContext) context
.getExternalContext().getContext();
// 取得文件的絕對路徑
excelName = servletContext.getRealPath("/UploadFile") + "/" + excelName;
System.out.println("生成文件的路徑是:" + excelName);
Object[] obj;

try
{
for (int i = 0; i
row = sheet.createRow(i + 1);
obj = (Object[]) list.get(i);
this.createCell(row, obj);
}
fileOut = new FileOutputStream(excelName);
wb.write(fileOut);

} catch (Exception ex)
{
System.out.print("生成報表有誤:" + ex);

} finally
{

try
{
fileOut.flush();
fileOut.close();

} catch (Exception e)
{
System.out.println("ExcelUtil.setValueToRow()");
}
}
}

private void createSheet(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 (int i = 0; i
cell = row.createCell((short) i);
cell.setCellStyle(cellStyle);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(firstRowValue[i]);
}

} catch (Exception ex)
{
System.out.print(ex);
}
}

private void createCell(HSSFRow row, Object[] obj)
{

try
{
for (int i = 0; i
cell = row.createCell((short) i);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(obj[i].toString());
}

} catch (Exception ex)
{
System.out.print(ex);
}
}

/** *//**
*
* 功能說明:根據提供的文件名下載文件,不支持中文文件名
*
* 此方法由yongtree添加,實現文件生成后的下載
*
* @param strfileName
* String
* @return void
*/

private static void downloadFile(String strfileName)
{

try
{
// 獲得JSF上下文環境
FacesContext context = FacesContext.getCurrentInstance();
// 獲得ServletContext對象
ServletContext servletContext = (ServletContext) context
.getExternalContext().getContext();
// 取得文件的絕對路徑
String excelName = servletContext.getRealPath("/UploadFile") + "/"
+ strfileName;
File exportFile = new File(excelName);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream servletOutputStream = 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 = new byte[1024];
int i = 0;
FileInputStream fis = new java.io.FileInputStream(exportFile);

while ((i = fis.read(b)) >0)
{
servletOutputStream.write(b, 0, i);
}

} catch (IOException e)
{
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
}

posted on 2008-11-27 11:36
Vincent-chen 閱讀(610)
評論(0) 編輯 收藏 所屬分類:
JSF