有时候我们需要实现一个功能,就是把数据库当中的数据导入到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请求还要方便一点啊。