点击Button,发送 AJAX请求使用POI如何实现Excel文件自动下载(JAVA后端)

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



猜你喜欢

转载自blog.csdn.net/qq_38455201/article/details/80267989
今日推荐