有时候我们需要实现一个功能,就是把数据库当中的数据导入到Excel文件当中下载下来,或者对数据进行一系列的处理之后,把数据导入到Excel当中,然后下载下来,方便别人分析,特别是一些财务,运营,信息相关的数据。那么我们就需要实现Excel的导出功能。
第一步:引入maven的poi依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency>
第二步:写java后台
SimpleDateFormat sdforYMDHMS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //获取我们需要转化成Excel表格的数据,在这里我转化成JSONArray格式的数据 JSONArray jsonArray = JSON.parseArray( resultJsonObject.getString("data")); logger.info("放入excel表格当中的数据是:"+jsonArray.toJSONString()); //excel文件的头信息我们一般情况下是知道的,所以在这里定义一个数组 String[] excelHeader = {"序号", "奖项类型", "奖项内容","已发数量", "库存数量","是否特殊概率奖项"}; //创建HSSFSheet对象 HSSFWorkbook wb = new HSSFWorkbook(); //设置excel文件的名称 HSSFSheet sheet = wb.createSheet("奖品发放数据"); HSSFRow row = sheet.createRow((int) 0); HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); for (int i = 0; i < excelHeader.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellValue(excelHeader[i]); cell.setCellStyle(style); sheet.autoSizeColumn(i); //设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一 sheet.setColumnWidth(cell.getColumnIndex(), 100 * 50); } for (int i = 0; i < jsonArray.size(); i++) { row = sheet.createRow(i + 1); JSONObject jsonObject = jsonArray.getJSONObject(i); row.createCell(0).setCellValue(jsonObject.getIntValue("id")); row.createCell(1).setCellValue(jsonObject.getString("awardType")); row.createCell(2).setCellValue(jsonObject.getString("awardContent")); row.createCell(3).setCellValue(jsonObject.getIntValue("awardSendNum")); row.createCell(4).setCellValue(jsonObject.getIntValue("awardStock")); row.createCell(5).setCellValue(jsonObject.getString("specialProbability")); } //返回给前端信息 OutputStream output = response.getOutputStream(); response.addHeader("Content-Disposition", "inline;filename=" + sdforYMDHMS.format(new Date()) + ".xls"); response.setContentType("application/msexcel"); wb.write(output); output.flush(); output.close();
第三步:处理页面点击事件,来请求这个controller
$("#export").click(function () { $.ajax({ type: "get", url: "请求的url地址", contentType: "application/json; charset=utf-8", dataType: "json", success: function (data) { }, error:function (XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(textStatus); } }); }想法非常的好,一步两步三步全部写好了,现实非常的残酷啊,无论我怎么点击,就是不自动下载。
开始网上找信息去调试,比如网上说你的response返回的头信息里面给加上设置,这样就浏览器才能自动下载,比如通过ajax请求后台生成一个临时文件通过流的方式返回给前端,比如得修改ajax的contentType属性和dataType的属性,种种方法,最后ajax请求都显示成功了,但是无论如何都不能自动下载Excel文件,在浏览器response信息当中,出现一堆乱码。
最后研究表明,想直接下载Excel文件,因为文件的下载是以二进制的形式读取的,而ajax的请求是字符型的请求,所以没有办法实现下载,最后只能抛弃ajax的方法,改写成下面的,就成功了。
$("#export").click(function () { window.location.href="你请求的url地址"; }哈哈,是不是比ajax请求还要方便一点啊。