jsf excel

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 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) {
    // 获得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 < 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 {
      // 获得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();
  }
}

 

原文出处:http://blog.163.com/wangyao_13/blog/static/3825989120105885922719/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值