SSM使用POI实现数据批量导出到Ecel

版权声明:整理不易,转载请注明出处。 https://blog.csdn.net/linmengmeng_1314/article/details/83113982

上一篇写了关于SSM使用POI解析Excel数据并实现批量导入到数据库 ,这里记录一下怎么将查询出来的数据导出到Excel。

需要引入的包,在上一篇博客中有介绍,这里直接贴代码。

本来想写在工具类里的,结果涉及到数据的读取和添加感觉不如直接写在Controller里方便。

Controller类代码

这里使用的导出格式是.xls,也就是office2003+支持的,.xlsl是2007+版本支持的,使用xlsl的话,里面引用的包和创建表格文件的语句是不一样的。

@RequestMapping("/exportFile")
	//@ResponseBody
	public void exportFile(String macId, String boxId, String payType,
			HttpServletResponse response) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("macId", macId);
		map.put("boxId", boxId);
		map.put("payType", payType);
		List<Order> orderList = orderService.selectOrderList(map);     // 需要导出的数据
		System.out.println("orderList:" + orderList);
		if (orderList != null && orderList.size() > 0) {
			String fileName = "OrderReportForm.xls";
			try {
				response.setHeader(
						"Content-disposition",
						"attachment;filename="
								+ new String(fileName.getBytes("gb2312"),
										"ISO8859-1"));
			} catch (UnsupportedEncodingException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}// 设置文件头编码格式
			response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");// 设置类型
			response.setHeader("Cache-Control", "no-cache");// 设置头
			response.setDateHeader("Expires", 0);// 设置日期头
			
			// 这里是表格的头部
			String[] titles = { "订单编号", "流水单号", "商品名称", "商品价格", "商品进价", "交易时间",
					"设备编号", "柜子ID", "支付方式" };

			try {
				// 第一步,创建一个workbook,对应一个Excel文件
				HSSFWorkbook workbook = new HSSFWorkbook();

				// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
				HSSFSheet hssfSheet = workbook.createSheet("sheet1");

				// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short

				HSSFRow row = hssfSheet.createRow(0);
				// 第四步,创建单元格,并设置值表头 设置表头居中
				HSSFCellStyle hssfCellStyle = workbook.createCellStyle();

				// 居中样式
				hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

				HSSFCell hssfCell = null;
				for (int i = 0; i < titles.length; i++) {
					hssfCell = row.createCell(i);// 列索引从0开始
					hssfCell.setCellValue(titles[i]);// 列名1
					hssfCell.setCellStyle(hssfCellStyle);// 列居中显示
				}
				// 第五步,写入实体数据

				for (int i = 0; i < orderList.size(); i++) {
					row = hssfSheet.createRow(i + 1);
					Order order = orderList.get(i);

					// 第六步,创建单元格,并设置值
					
					row.createCell(0).setCellValue(order.getTrade_no());
					row.createCell(1).setCellValue(order.getOut_trade_no());
					row.createCell(2).setCellValue(order.getGoods_name());
					row.createCell(3).setCellValue(order.getTotal_price() + "");
					row.createCell(4).setCellValue(order.getGoods_net_price() + "");
					row.createCell(5).setCellValue(order.getPay_time());
					row.createCell(6).setCellValue(order.getMac_id() + "");
					row.createCell(7).setCellValue(order.getBox_id() + "");
					row.createCell(8).setCellValue(order.getPay_type());
				}

				// 第七步,将文件输出到客户端浏览器
				try {
					workbook.write(response.getOutputStream());
					response.getOutputStream().flush();
					response.getOutputStream().close();

				} catch (Exception e) {
					e.printStackTrace();
				}
			} catch (Exception e) {
				System.out.println("导出信息失败!");
				e.printStackTrace();
			}
		}else{
			System.out.println("查询结果为空!");
		}
	}

js提交导出Excel,提交的时候加入了条件查询:

<script type="text/javascript">
$(function(){
	$("#export").click(function(){
		var macId = $("#macId").val();
		var boxId = $("#boxId").val();
		var payType = $("#payType").val();

		var href = "order/exportFile.do" + "?macId=" + macId + "&boxId=" + boxId + "&payType=" + payType;
        window.location.href = href;
        return false;
	})
});
</script>
<input id="export" type="button" class="scbtn" value="导出Excel" />

刚开始是使用的ajax提交的,但是不知道哪里出错了,没有报错,但是没有导出文件,直接在url里面访问,是可以正常导出表格的,于是便换成了使用window.location.href

这里有一个bug,就是文件名不能为中文,否则IE浏览器导出的文件名是乱码的,而Chrome浏览器则是正常的。我查了一下之后发现是IE浏览器对url编码的问题,修改这个感觉有点麻烦,还不如直接使用英文命名。

猜你喜欢

转载自blog.csdn.net/linmengmeng_1314/article/details/83113982