需求:需要传入集合到后台查询数据,并导出excel,这时候get方式就不好用了,需要post请求带集合参数传入后台

ajax本身不支持下载文件,所以实现这个需求要分两步:

1、使用ajax带集合参数去后台请求数据并生成文件;

2、在请求成功的函数中创建get请求的链接进行下载

============

前端代码:

$.ajax({
   async: true,
    url: url,
    type: "post",
    dataType: "json",
    data: data,
    success: function (result, status, xhr) {
    	// 创建get请求路径
		let downloadUrl = "../FileDownloadExport?fileName="+data.fileName;
		// 创建a标签
		let label = $("<a>");
		// 添加属性
		label.prop("href",downloadUrl);
		// 追加标签
		$("body").append(label);
		// 点击a标签,为什么要加[0]不懂,不加点击函数不生效
		label[0].click();
		// 点击后移除标签
		label.remove();
        
    },
    error: function (xhr, status, error) {
        alert("请求失败")
    }
});

=============

后端请求文件代码(调用了hutool的工具类):

@PostMapping("/FileDownloadRequest")
@ResponseBody
protected Map<String,String> doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{

    // 文件存储路径
    String path = "D:/fileupload/file/Export/";

    // 文件名
    String fileName = request.getParameter("fileName");

    // 获取导出文件格式
    String op = request.getParameter("op");

    // 条件集合对象
    Map<String, String> map = new HashMap<>();

    // 存放题目数据
    List<Question> questionsForExport = questionService.getQuestionsForExport(map);

    // 转换集合类型
    ArrayList<Question> questionArrayList = CollUtil.newArrayList(questionsForExport);


    if ("exportExcel".equals(op)){

        // 导出excel文件
        ExcelWriter writer = ExcelUtil.getWriter(path + fileName);
        writer.write(questionArrayList,true);
        writer.close();
    }else if ("exportWord".equals(op)){

        //导出word文件
        Word07Writer word07Writer = new Word07Writer();
        for (Question question : questionArrayList) {
            word07Writer.addText(new Font("微软雅黑",Font.PLAIN,16), question.toString());
        }
        File file = FileUtil.file(path + fileName);
        word07Writer.flush(file);
        word07Writer.close();

    }else if ("exportTxt".equals(op)){

        // 导出txt文件
        FileWriter fileWriter = new FileWriter(path+fileName);
        fileWriter.writeLines(questionsForExport);

    }
    Map<String,String> fileInfoMap = new HashMap<>();
    fileInfoMap.put("fileName", fileName);
    return fileInfoMap;
}

==============

后端下载文件代码(调用了在hutool工具类的基础上封装的工具类):

@GetMapping("/FileDownloadExport")
protected void doDownload(HttpServletRequest request, HttpServletResponse response) throws IOException{
   String path = "D:/fileupload/file/Export/";
   String fileName = request.getParameter("fileName");

   // 文件写入输出流
   DownloadUtil.downLoadFile(path, fileName, response);
}

更多推荐

使用ajax请求下载excel文件