利用 POI 从JSP表格中生成excel文件

来源:互联网 发布:淘宝地瓜干知乎 编辑:程序博客网 时间:2024/04/30 00:28

 我研究了一天,终于得到了比较满意的效果。其中遇到了各种问题,着实耗费了不少时间。

在项目中,你可能会遇到将JSP中表格的数据生成报表的应用,下面我介绍下我的做法。

因为我的这个项目是用STRUTS 2.0做的,在需要生成报表的这个页面,我新建了一个Button,用来生成excel文件

代码如下:

<table border="0" cellpadding="0" cellspacing="0" width="100%">    
<tr>
<td align=center>
<INPUT class=button type="button" value="生成Excel文件" name="ebotton" onClick="submitform();">
</td>
</tr>
</table>

注意到我处理点击的函数是submitform();它的定义在JS里面。如下:

function submitform()
{

 window.document.myform.action 
= 'export.jsp';
 myform.submit();
   
}

这里的myform.submit()将form又提交了一遍,对,这很有用,因为一般一个form有一个提交。我这里action后面跟了个静态页面(其实也是可以跟动态action的,原先我就是这样,想尽量把JAVA代码从页面剥离出来,但后来遇到了一个问题,只好改成页面了),而这个页面就是处理“生成excel”这个动作的。

下面是这个页面的代码:

<%@ page language="java" contentType="text/html; charset=gb2312"
    pageEncoding
="gb2312"%>
<%@ page language="java"  import="java.util.*,
                                  org.apache.poi.hssf.usermodel.HSSFWorkbook,
                                  org.apache.poi.hssf.usermodel.HSSFSheet,
                                  org.apache.poi.hssf.usermodel.HSSFRow,
                                  org.apache.poi.hssf.usermodel.HSSFCell,
                                  java.text.DecimalFormat,
                                  com.justinmobile.payease.admin.commons.excel.XLSExport
"%>
<%
    response.reset();
    response.setContentType(
"application/ms-excel");
    response.setHeader(
"Content-disposition","attachment;filename=untitled.xls");//定义文件名
    DecimalFormat f = new DecimalFormat("#,##0.00");
    HSSFWorkbook wb 
= new HSSFWorkbook();
    HSSFSheet sheet 
= wb.createSheet("sheet1");
    String[] sellCoName 
= request.getParameterValues("sellCoName");
    String[] signAdd 
= request.getParameterValues("signAdd");
    String[] implementYear 
= request.getParameterValues("implementYear");
    String[] sellLicence 
= request.getParameterValues("sellLicence");
    String[] signTime 
= request.getParameterValues("signTime");
    String[] buySheetSymbol 
= request.getParameterValues("buySheetSymbol");
    String[] goodsName 
= request.getParameterValues("goodsName");
    String[] goodModel 
= request.getParameterValues("goodModel");
    String[] unit 
= request.getParameterValues("unit");
    String[] amount 
= request.getParameterValues("amount");
    String[] examinantLX 
= request.getParameterValues("examinantLX");
    String[] examinantParentCompany 
= request.getParameterValues("examinantParentCompany");
    String[] buySheetID 
= request.getParameterValues("buySheetID");
    String[] coName 
= request.getParameterValues("coName");
    String[] examinantChildCompany 
= request.getParameterValues("examinantChildCompany");
    
    
    
//XLSExport e = new XLSExport(response);
    XLSExport e = new XLSExport(response);
    
int row=0;//标示行数
    
    e.createRow(
0);
    row
++;
    e.setCell(
0" 销售单位 ");
    e.setCell(
1" 签订地址 ");
    e.setCell(
2" 执行年度 ");
    e.setCell(
3" 销售许可证号 ");
    e.setCell(
4" 签订时间 ");
    e.setCell(
5" 合同编号 ");
    
    e.createRow(
1);
    row
++;
    
for(int j=0;j<sellCoName.length;j++){
    e.setCell(
0, sellCoName[j]);
    e.setCell(
1, signAdd[j]);
    e.setCell(
2, implementYear[j]);
    e.setCell(
3, sellLicence[j]);
    e.setCell(
4, signTime[j].toString());
    e.setCell(
5, buySheetSymbol[j]);
    }

    e.createRow(
2);
    row
++;
    
    e.createRow(
3);
    row
++;
    e.setCell(
0" 产品名称 ");
    e.setCell(
1" 规格型号 ");
    e.setCell(
2" 计量单位 ");
    e.setCell(
3" 数量 ");
    e.setCell(
4" 供货单位 ");
    
    
int i = 0;
    
for (i = 0; i < goodsName.length; i++{
    e.createRow(i
+4);
        e.setCell(
0, goodsName[i] );
        e.setCell(
1, goodModel[i] );
        e.setCell(
2, unit[i]);
        e.setCell(
3, amount[i]);
        e.setCell(
4, coName[i]);
        row
++;
    }

    
    e.createRow(row
+1);
    e.setCell(
0"联兴批准人");
    e.setCell(
1"总公司确认人");
    e.setCell(
2"分公司确认人");
    
    e.createRow(row
+2);
    
for(int k=0;k<examinantLX.length;k++){
    e.setCell(
0, examinantLX[k]);
    e.setCell(
1, examinantParentCompany[k]);
    e.setCell(
2, examinantChildCompany[k]);
    }

    e.exportXLS();
    wb.write(response.getOutputStream());
    response.getOutputStream().flush();
    response.getOutputStream().close();
   
    out.clear();
    out 
= pageContext.pushBody();  
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

代码比较长,希望你有耐心。这里新建了XLSExport的一个对象(这个类呆会给出),调用这里面已经写好的向excel表中添数据的方法能比较清晰的进行添表操作。注意,这几行

    response.getOutputStream().flush();
    response.getOutputStream().close();
  
    out.clear();
    out = pageContext.pushBody();

一定不要掉,因为JSP的内建对象out与  response.getOutputStream()会产生冲突,使用完out必须要清除缓存的数据,不加便会出现异常。

下面是XLSExport。这个总是有用

 

package com.justinmobile.payease.admin.commons.excel;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/** */
/**
 * 生成导出Excel文件对象
 * 
 * 
 
*/

public class XLSExport {

    
// 设置cell编码解决中文高位字节截断
    private static short XLS_ENCODING = HSSFWorkbook.ENCODING_UTF_16;

    
// 定制日期格式
    private static String DATE_FORMAT = " m/d/yy ";

    
// 定制浮点数格式
    private static String NUMBER_FORMAT = " #,##0.00 ";

    
private HSSFWorkbook workbook;

    
private HSSFSheet sheet;

    
private HSSFRow row;
    
    
private HttpServletResponse response;

    
/**
     * 初始化Excel
     *            导出文件名
     
*/

    
public XLSExport(HttpServletResponse response) {
        
//this.xlsFileName = fileName;
        this.response=response;
    
        
this.workbook = new HSSFWorkbook();
        
this.sheet = workbook.createSheet();
    }


    
/** */

    
/**
     * 导出Excel文件
     * 
@throws IOException
     * 
@throws XLSException
     
*/

    
public void exportXLS() throws IOException {

        response.setContentType(
"application/vnd.ms-excel");
                                          response.addHeader(
"Content-Disposition""attachment; filename=untitled.xls");
        
        workbook.write(response.getOutputStream());
        response.getOutputStream().flush();
        response.getOutputStream().close();
        
    }



    
/**
     * 增加一行
     *            行号
     
*/

    
public void createRow(int index) {
        
this.row = this.sheet.createRow(index);
    }



    
/**
     * 设置单元格
     *            单元格填充值
     
*/

    
public void setCell(int index, String value) {
        HSSFCell cell 
= this.row.createCell((short) index);
        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
        cell.setEncoding(XLS_ENCODING);
        cell.setCellValue(value);
    }


    
/**
     * 设置单元格

     *            单元格填充值
     
*/

    
public void setCell(int index, Calendar value) {
        HSSFCell cell 
= this.row.createCell((short) index);
        cell.setEncoding(XLS_ENCODING);
        cell.setCellValue(value.getTime());
        HSSFCellStyle cellStyle 
= workbook.createCellStyle(); // 建立新的cell样式
        cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(DATE_FORMAT)); // 设置cell样式为定制的日期格式
        cell.setCellStyle(cellStyle); // 设置该cell日期的显示格式
    }


    
/**
     * 设置单元格
     *            单元格填充值
     
*/

    
public void setCell(int index, int value) {
        HSSFCell cell 
= this.row.createCell((short) index);
        cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
        cell.setCellValue(value);
    }


    
/**
     * 设置单元格
     *            单元格填充值
     
*/

    
public void setCell(int index, double value) {
        HSSFCell cell 
= this.row.createCell((short) index);
        cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
        cell.setCellValue(value);
        HSSFCellStyle cellStyle 
= workbook.createCellStyle(); // 建立新的cell样式
        HSSFDataFormat format = workbook.createDataFormat();
        cellStyle.setDataFormat(format.getFormat(NUMBER_FORMAT)); 
// 设置cell样式为定制的浮点数格式
        cell.setCellStyle(cellStyle); // 设置该cell浮点数的显示格式
    }


}

这样应该很清楚了!

原创粉丝点击