<action name="exportExcel" class="com.action.common.ExcelAction">
<result name="success" type="stream">
<param name="contentType">application/vnd.ms-excel;charset=utf-8</param>
<param name="inputName">excelStream</param>
<param name="contentDisposition">attachment;filename="${fileName}.xls"</param>
<param name="bufferSize">1024</param>
</result>
<result name="error">../report/DataEmpty.jsp</result>
</action>
其中,stream类型的结果共可以指定7个参数:
- contentType:下载文件的类型。
- contentLength:下载文件的长度,用于浏览器的进度条显示。
- contentDisposition:指定文件下载的默认名字,如果不指定则使用Action名.action。
- inputName:Action中用于返回InputStream的get方法的名字,默认为inputStream,因此,我们的Action中定义了getInputStream的方法。
- bufferSize:缓冲区大小,默认为(1024)即1k。
- allowCaching:是否允许浏览器进行缓存。
- contentCharSet:HTTP响应头信息中的编码方式。
2.在对应的Action中定义输出流和文件名
2.1 InputStream excelStream; //这个输入流对应上面struts.xml中配置的那个excelStream,两者必须一致
String fileName; //这个名称就是用来传给上面struts.xml中的${fileName}的
并生成get、set方法
然后得到jsp页面传过来的值,可以多个jsp页面的多个按钮使用着同一个Action,只要传过来的值其中有一个作为识别条件即可。如1.jap和2.jsp都要调用此方法,那1.jsp传过来一个“A”,2.jsp传过来一个“B”,根绝A或者B的不同调用不同的List生成方法,就可以实现。
是的,这里下一步就是生成一个存有预期输出结果的List,生成方法可考虑单独建立方法文件,当需要实现多个页面调用或者一个页面多出调用Action方法的时候,建议List生成方法分别些方法文件或几种一个文件,尽量避免放在Action中。
下面的步骤基本如下
if(null == list ){
this.setVestige(actionHistory+"失败!");
return "error";
}else{
//创建Excel工作簿方法2.2
HSSFWorkbook workbook = getWorkbook(list,sheetName,isSum);
if (null != workbook) {
try {
//将工作簿写入最上面定义的InputStream流——名称为excelStream,这个名字对应struts.xml中配置的inputName参数
this.workbook2InputStream(workbook,fileName);
return "success";
}catch (IOException e) {
e.printStackTrace();
return "error"; }
}else{
return "error";
}
}
private HSSFWorkbook getWorkbook(List listM,String sheetNames,int isSum) throws Exception {
HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件
HSSFCellStyle style = workbook.createCellStyle(); // 样式对象
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
String[] sheetName = sheetNames.split(",");
for(int k = 0; k < listM.size(); k++){
List list = (List) listM.get(k);
HSSFSheet sheet = workbook.createSheet();//创建sheet
workbook.setSheetName(k, sheetName[k], HSSFCell.ENCODING_UTF_16);//为指定第K个sheet命名,并设定字符集类型
String[] columnNames = (String[]) list.get(0);
HSSFRow row = sheet.createRow(0); // 创建第1行,也就是输出表头
HSSFCell cell = row.createCell((short) 0);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
for (short i = 0; i < columnNames.length; i++) {
cell = row.createCell(i); // 创建第i列
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(columnNames[i]);
}
List colunData = null;
// 下面是输出各行的数据(留出最后一行,如果是合计信息单独输出,如果非合计信息按照原本样式输出)
if(list.size() > 1){
for(int i = 1 ;i < list.size()-1;i++){
colunData = (List) list.get(i);
row = sheet.createRow(i);// 创建第i行
for (short j = 0; j < colunData.size(); j++) {
cell = row.createCell(j); // 创建第j列
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(colunData.get(j).toString());
}
}
if(isSum == 0){//无需统计信息
colunData = (List) list.get(list.size()-1);
row = sheet.createRow(list.size()-1);// 创建第i行
for (short j = 0; j < colunData.size(); j++) {
cell = row.createCell(j); // 创建第j列
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(colunData.get(j).toString());
}
}else if(isSum == 1 ){
colunData = (List) list.get(list.size()-1);//此处留下最后一列
row = sheet.createRow(list.size()-1);// 创建第i行
sheet.addMergedRegion(new Region(list.size()-1, (short)0, list.size()-1, (short) 2));
for (short j = 0; j < colunData.size(); j++) {
if(j == 0){
cell = row.createCell(j); // 创建第j列
cell.setCellStyle(style);//设置居中
}else{
cell = row.createCell((short) (j+2)); // 创建第j列
}
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(colunData.get(j).toString());
}
}
}
}
return workbook;
}
/**
* 将Workbook写入到InputStream
*
* @param workbook HSSFWorkbook
* @param fileName String 文件名
*
* */
private void workbook2InputStream(HSSFWorkbook workbook, String fileName) throws Exception {
this.setFileName(URLEncoder.encode(fileName,"UTF-8"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
workbook.write(baos);
baos.flush();
byte[] aa = baos.toByteArray();
excelStream = new ByteArrayInputStream(aa, 0, aa.length)
baos.close();
}
public void setFileName(String fileName) throws UnsupportedEncodingException{
HttpServletRequest request = ServletActionContext.getRequest();
String agent = request.getHeader("User-Agent");
if(null != agent){
agent = agent.toLowerCase();
if (agent.indexOf("firefox") != -1) {
this.fileName = new String(URLDecoder.decode(fileName,"UTF-8").getBytes(),"iso-8859-1");
}else {
this.fileName = fileName;
}
}
}
http://www.cnblogs.com/jzzlo/archive/2013/03/08/struts2.html