最近的项目中有个导出excel的需求,由于导出excel的源数据是在动态变化的,而且业务上要求导出excel后便不能允许在导出了,因此考虑直接生成输出流的方式保存到客户端中。该项目的框架是ssh,导出excel的代码也放在了action与service中。
action中的代码:
public void exportExcel(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception { String ids = request.getParameter("ids"); String[] sid = ids.split(","); OutputStream os = response.getOutputStream();//取得输出流 response.reset();//清空输出流 response.setContentType("application/xls;charset=GB2312");//定义输出类型 response.setHeader("Content-disposition", "attachment; filename=applyList.xls");//设定输出文件头 WritableWorkbook wbook = procurementApplyPoolService.exportExcel(sid, os); wbook.write(); //写入文件 response.flushBuffer();//刷新 wbook.close(); os.close(); procurementApplyPoolService.setExportFlag(sid); }
该action没有返回值,因为导出excel后不需要刷新页面。
service中的代码:
public WritableWorkbook exportExcel(String[] ids,OutputStream os) throws Exception { List modelList = new ArrayList(); List dtoList = null; for(int i=0;i<ids.length;i++){ modelList.add(this.getHibernateTemplate().get(MpsProcurementApplyDetail.class, new Long(ids[i]))); } dtoList = procurementApplyDetailService.buildDtoList(modelList); WritableWorkbook wbook = Workbook.createWorkbook(os); //建立excel文件 SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); WritableSheet wsheet = wbook.createSheet(sdf1.format(date)+" 采购清单", 0); //创建Excel工作表 ProcurementApplyDetailDto dto; Label label; /*********************设置excle中的头行*****************/ WritableFont wfc = new WritableFont(WritableFont.ARIAL, 25, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); WritableCellFormat wcfFc = new WritableCellFormat(wfc); wcfFc.setAlignment(jxl.write.Alignment.CENTRE);//水平居中 label = new Label(0, 0, "采购清单", wcfFc); wsheet.addCell(label); /**********************设置标题************************/ WritableFont wfc1 = new WritableFont(WritableFont.ARIAL, 12, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); WritableCellFormat wcfFc1 = new WritableCellFormat(wfc1); wcfFc1.setBackground(Colour.GRAY_25);//设置背景色 wcfFc1.setVerticalAlignment(VerticalAlignment.CENTRE);//垂直居中 wcfFc1.setAlignment(jxl.write.Alignment.CENTRE); wcfFc1.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN);//设置细边框 label = new Label(0, 1, "请购编号",wcfFc1);//请购编号 wsheet.addCell(label); label = new Label(1, 1, "请购单位",wcfFc1);//请购单位 wsheet.addCell(label); label = new Label(2, 1, "请购人",wcfFc1);//请购人 wsheet.addCell(label); label = new Label(3, 1, "产品名称",wcfFc1);//产品名称 wsheet.addCell(label); label = new Label(4, 1, "产品配置描述",wcfFc1);//产品配置描述 wsheet.addCell(label); label = new Label(5, 1, "规格型号",wcfFc1);//规格型号 wsheet.addCell(label); label = new Label(6, 1, "型号描述",wcfFc1);//型号描述 wsheet.addCell(label); label = new Label(7, 1, "批次号",wcfFc1);//批次号 wsheet.addCell(label); label = new Label(8, 1, "数量",wcfFc1);//数量 wsheet.addCell(label); label = new Label(9, 1, "计量单位",wcfFc1);//计量单位 wsheet.addCell(label); label = new Label(10, 1, "地市配额",wcfFc1);//地市配额 wsheet.addCell(label); label = new Label(11, 1, "费用列支",wcfFc1);//费用列支 wsheet.addCell(label); label = new Label(12, 1, "项目类型",wcfFc1);//项目类型 wsheet.addCell(label); label = new Label(13, 1, "供应商",wcfFc1);//供应商 wsheet.addCell(label); label = new Label(14, 1, "项目名称",wcfFc1);//项目名称 wsheet.addCell(label); label = new Label(15, 1, "项目编码",wcfFc1);//项目编码 wsheet.addCell(label); label = new Label(16, 1, "收货方",wcfFc1);//收货方 wsheet.addCell(label); label = new Label(17, 1, "接收组织",wcfFc1);//接收组织 wsheet.addCell(label); label = new Label(18, 1, "库存组织",wcfFc1);//库存组织 wsheet.addCell(label); label = new Label(19, 1, "到货日期",wcfFc1);//到货日期 wsheet.addCell(label); label = new Label(20, 1, "收货人",wcfFc1);//收货人 wsheet.addCell(label); label = new Label(21, 1, "联系方式",wcfFc1);//联系方式 wsheet.addCell(label); label = new Label(22, 1, "交货地点",wcfFc1);//交货地点 wsheet.addCell(label); label = new Label(23, 1, "使用(安装)地点",wcfFc1);//使用(安装)地点 wsheet.addCell(label); label = new Label(24, 1, "属性",wcfFc1);//属性 wsheet.addCell(label); wsheet.setRowView(1, 400);//设置行高 /**********************设置内容************************/ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); WritableFont wfc2 = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); WritableCellFormat wcfFc2 = new WritableCellFormat(wfc2); wcfFc2.setVerticalAlignment(VerticalAlignment.CENTRE);//垂直居中 wcfFc2.setAlignment(jxl.write.Alignment.CENTRE); wcfFc2.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN);//设置细边框 for(int i=0;i<dtoList.size();i++){ dto = (ProcurementApplyDetailDto)dtoList.get(i); label = new Label(0, i+2, dto.getApplyCode(),wcfFc2);//请购编号 wsheet.addCell(label); label = new Label(1, i+2, dto.getCreaterunitname(),wcfFc2);//请购单位 wsheet.addCell(label); label = new Label(2, i+2, dto.getCreatername(),wcfFc2);//请购人 wsheet.addCell(label); label = new Label(3, i+2, dto.getProductname(),wcfFc2);//产品名称 wsheet.addCell(label); label = new Label(4, i+2, dto.getConfiguration(),wcfFc2);//产品配置描述 wsheet.addCell(label); label = new Label(5, i+2, dto.getMaterialname(),wcfFc2);//规格型号 wsheet.addCell(label); label = new Label(6, i+2, dto.getMaterialproperty(),wcfFc2);//型号描述 wsheet.addCell(label); label = new Label(7, i+2, dto.getBatchnumber(),wcfFc2);//批次号 wsheet.addCell(label); Long amount = dto.getAmount()==null?new Long(0):dto.getAmount(); label = new Label(8, i+2, amount.toString(),wcfFc2);//数量 wsheet.addCell(label); label = new Label(9, i+2, dto.getUnits(),wcfFc2);//计量单位 wsheet.addCell(label); label = new Label(10, i+2, dto.getCompanyQuota(),wcfFc2);//地市配额 wsheet.addCell(label); label = new Label(11, i+2, dto.getExpendname(),wcfFc2);//费用列支 wsheet.addCell(label); label = new Label(12, i+2, dto.getProjecttype(),wcfFc2);//项目类型 wsheet.addCell(label); label = new Label(13, i+2, dto.getProvidername(),wcfFc2);//供应商 wsheet.addCell(label); label = new Label(14, i+2, dto.getProjectname(),wcfFc2);//项目名称 wsheet.addCell(label); label = new Label(15, i+2, dto.getProjectcode(),wcfFc2);//项目编码 wsheet.addCell(label); label = new Label(16, i+2, dto.getShiptolocation(),wcfFc2);//收货方 wsheet.addCell(label); label = new Label(17, i+2, dto.getOrganizationname(),wcfFc2);//接收组织 wsheet.addCell(label); label = new Label(18, i+2, dto.getWarehousename(),wcfFc2);//库存组织 wsheet.addCell(label); if(dto.getArrivedate() == null){ label = new Label(19, i+2, "",wcfFc2);//到货日期 }else{ label = new Label(19, i+2, sdf.format(dto.getArrivedate()),wcfFc2);//到货日期 } wsheet.addCell(label); label = new Label(20, i+2, dto.getReceivername(),wcfFc2);//收货人 wsheet.addCell(label); label = new Label(21, i+2, dto.getPhone(),wcfFc2);//联系方式 wsheet.addCell(label); label = new Label(22, i+2, dto.getDeliveryaddress(),wcfFc2);//交货地点 wsheet.addCell(label); label = new Label(23, i+2, dto.getInstalladdress(),wcfFc2);//使用(安装)地点 wsheet.addCell(label); label = new Label(24, i+2, dto.getProperty(),wcfFc2);//属性 wsheet.addCell(label); wsheet.setRowView(i+2, 350); } wsheet.mergeCells(0, 0, 24, 0);//合并单元格 return wbook; }
这个功能任然存在着问题,就是导出excel的中问文件名的问题。使用中文后总是下载不了。由于action没有返回值,在页面中进行其他刷新页面的处理时需要给from的action重新赋值,不然不论做其他刷新操作都会访问导出excel的action方法。