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报表上报&统计系统能够将电子表格软件MS Excel和大型数据库管理系统MS SQL Server 2000/2005/2008集成为一个网络报表平台。在这个平台上,用户可以充分利用MS Excel软件,通过本系统,实现Excel报表的收集及统计,轻松 、快速构建能够适应变化的网络报表系统,是一个非常实用的报表收集及统计工具。 Excel报表上报&统计系统,也可以在互联网上使用。 1.1 系统特色 1.灵活的模板管理功,通过报表模板定义,用户可以定义上报报表样式、填报单元格、统计单元格,可适应报表灵活的变化。 2.可控制报表的查询、填写权限,由用户根据权限设计、管理模板,大大增强了系统的适应性和可用性 3.可以使用户通过互联网或局域网进行填报 、修改、查询数据和引用外部数据源。 5.具有组织机构字典,可以分部门层次管理报表。 6.支持报表导入、导出功能。 7.只要会用Excel,就很容易使用本系统,培训成本和维护成本大大降低。 8.支持报表表间统计功能。 9.采用MS SQL Server2000作为系统数据库,企业的Excel文件和业务数据具有安全保障。 10.软件采用B/S结构,适用于局域网和广域网。只在一服务器端安装,其它用户只要用IE就可使用本系统,安装维护方便。 11.支持模板导入和模板导出功能。 12.灵活的用户权限管理。 13.可定制按条件删除数据任务。 14.支持Excel2000、Excel 2003、Excel 2007。 [返回页首] 1.2 系统主要功能 1、报表分部门上报收集功能。 2、报表查询功能。 3、报表多表合并统计功能。 4、报表模板自定义功能。 5、用户权限管理功能。 6、部门管理功能。 7、报表从Excel导出、打印功能。 [返回页首] 1.3 系统应用对象 政府机关、邮电通信、计算机、网络、商业/贸易、银行/金融/证券/保险/投资、税务、咨询、社会服务、旅游/饭店、健康/医疗服务、房地产、交通运输、法律/司法、娱乐/体育、媒介/广告、科研/教育、农业/渔业/林业/畜牧业、矿业/制造业等行业的报表管理用户。 2.软件注册 未注册的软件是试用版,试用版功能未有限制,但只能上报可达5张报表,使用次数可达15次。 如果您需要购买正式版,请遵循以下的购买流程。 第一步、用户与南昌鸣谦科技公司联系,商定合同。 联系方式: 电话:18970088701 电子邮件:mqcell@163.com 第二步、用户汇款 收款单位:南昌市鸣谦科技有限公司 开户银行:国银行南昌市省府大院支行 帐号 :726466844258091001 第三步、用户把注册程序的机器码,通过电子邮件发送到鸣谦科技 或电话通知鸣谦科技公司。 第四步、鸣谦科技公司收到机器码和汇款后,将注册码通过电子邮件发送给用户或短信、电话通知对方。 第五步、用户输入注册码,软件变成正式版。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值