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.ServletOutputStream; import javax.servlet.http.HttpServletResponse;
import mj.dao.clubBbs.PlateDAO;
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 yongtree * */ 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) { Object[] obj; try { for (int i = 0; i < list.size(); 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 < firstRowValue.length; 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 < obj.length; i++) { cell = row.createCell((short) i); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(obj[i].toString()); } } catch (Exception ex) { System.out.print(ex); } }
/** * <p> * 功能说明:根据提供的文件名下载文件,不支持中文文件名 * </p> * 此方法由yongtree添加,实现文件生成后的下载 * * @param strfileName * String * @return void */ private static void downloadFile(String strfileName) { try { File exportFile = new File(strfileName); 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(); }
} |