我研究了一天,终于得到了比较满意的效果。其中遇到了各种问题,着实耗费了不少时间。
在项目中,你可能会遇到将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 >
< 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();
}
... {
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 >
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浮点数的显示格式
}
}
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浮点数的显示格式
}
}
这样应该很清楚了!