Java通过浏览器导出Excel

标签 java spring-boot

我想通过浏览器导出Excel。如果我点击导出按钮,我可以在 Chrome 网络中看到信息,但它没有下载。我可以将excel下载到我的项目文件夹中,但是如何通过浏览器导出excel?下面是 Ajax 和 Controller 代码。

这是我的 Excel 实用程序:

public class WriteExcel {

/**
 * @param answerList
 * @return
 */
public static void writeData(List<Answer> answerList, String paperName, HttpServletResponse response) throws IOException {

    Workbook workbook = new HSSFWorkbook();

    Sheet sheet = workbook.createSheet("test");
    for(int i=0; i<answerList.size();i++){
        Answer answer = answerList.get(i);
        Row row = sheet.createRow(i);
        Cell cell = row.createCell(0);
        cell.setCellValue(answer.getAnswerpname());
        List<AnswerReceive> answerReceives = JSON.parseArray(answer.getAnswerdata(), AnswerReceive.class);
        for(int j=0; j<answerReceives.size(); j++){
            AnswerReceive answerReceive = answerReceives.get(j);
            Cell tmp_cell = row.createCell(j+1);
            tmp_cell.setCellValue(answerReceive.getData());
        }
    }
    response.setContentType("application/octet-stream;charset=UTF-8");
    response.setHeader("Content-Disposition", "attachment;filename="
            .concat(String.valueOf(URLEncoder.encode(paperName, "UTF-8"))));
    OutputStream out = response.getOutputStream();
    workbook.write(out);

}
}

我的 Controller :

@PostMapping("/export")
@ResponseBody
public Object exportExcel(@RequestParam("paperId") String paperId, HttpServletResponse response) throws IOException {
    List<Answer> answerList = answerService.getData(paperId);
    WriteExcel.writeData(answerList, "test", response);
}

我的 Ajax:

$("button[name='export']").click(function () {
    $.ajax({
        url: "/export",
        type: "post",
        data: {"paperId":$(this).attr("data-paper-id")},
        success: function (data) {
            console.log(data.flag);
            console.log(data.Message);
        }
    })
})

最佳答案

尝试以下操作: 但是你使用 Apache FileUtils 来实现它

@PostMapping("/export", produdes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Object exportExcel(@RequestParam("paperId") String paperId, HttpServletResponse response) throws IOException {
    List<Answer> answerList = answerService.getData(paperId);
    InputStream excelFile = WriteExcel.writeData(answerList, "test", response);
    response.setHeader("Content-Disposition", "attachment; filename=Export" + LocalDate.now() + ".xlsx");
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    FileCopyUtils.copy(excelFile, response.getOutputStream());
    response.flushBuffer();

}

要创建输入流,请附加到您的 writeData 函数:

ByteArrayInputStream bais = null;
try {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  workbook.write(baos);
  baos.flush();

  byte[] buffer = baos.toByteArray();

  bais = new ByteArrayInputStream(buffer);
  baos.close();
} catch (IOException e) {
  e.printStackTrace();
}
  return bais;

关于Java通过浏览器导出Excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824419/

相关文章:

Java 字符串与数组的区别

java - JDT AST,如何生成声明

java - 句子中元音的降序排列

java - Java将int转换为字节时的奇怪行为?

java - Cloud Foundry 数据源oracle JDBC超时为什么?

java - Spring Boot 项目设置设计决策

java - 与Hibernate事务代码相关的问题

java - 由于 firebase sdk 依赖性,构建失败

spring-boot - SpringDoc - 如何以编程方式添加模式

java - 嵌套异常是 java.lang.NoClassDefFoundError : MappingJacksonHttpMessageConverter after making changes in pom. xml