B/S中实时导出excel

最近的项目中有个导出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方法。

你可能感兴趣的:(框架,Excel,OS,ssh)