[alibaba/easyexcel]浏览器下载0KB数据,postman可以下载数据

2024-02-19 537 views
3
触发场景描述

通过postman可以下载到excel数据,但是提供给前端调用无法下载excel数据,下载office打开excel损坏,WPS打开为无数据。

触发Bug的代码
public OperationResult queryInvtSmtTraceabilityInfo(PageParam pageParam, HttpServletResponse response) { 
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding(Charsets.UTF_8.name());
        fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), clazz).registerWriteHandler(writeHandler).sheet(sheetName).doWrite(dataList);
return new OperationResult();
}
提示的异常或者没有达到的效果

终端错误:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:288) at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:180) at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:119) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)

回答

6
image
2

烦请看一下 [#3354] ,可能我说的那个原因. 即没有真正的excel文件生成

8
dataList

但是我的dataList 是一定有数据的,因为postman调下载有数据 但是会报错。,通过web浏览器前端调就下载了,打不开excel,。

7
  1. 我遇到了wps能打开空文件,但office打不开空文件的问题, 是因为wps给提供了更好的兼容性. 本质上该文件确实是个普通文件,并不是excel文件
  2. 你可以把你的链式调用拆开,分别打断点看文件的情况, 应该还是哪里有问题的. 或者是换成一种更简易的写法, 然后再逐步往上增加逻辑
  3. postman可以下载excel,并该excel中有数据, 但是会报错的意思是: office/wps提示"该文件有异常, 是否只读, 是否兼容性模式打开"?
  4. 如果是3那种情况,说白了就是生成的excel文件是错的. js下载又会有轻微差异, 也就导致直接打不开了. 建议用步骤2的第二种方法排查一下
7

还有就是js下载的response各种头属性, 做不到和postman完全一致, 所以还是建议先从一个简单的正确的excel文件开始往上加逻辑

2

你说这么多无非是api使用错误,你按照文档写代码不好吗

2

能看看上面哪里使用错误了吗 ,错误点在哪里,就是简单做个封装也不行? @SneakyThrows public static void export(HttpServletResponse response, List dataList, Class clazz, WriteHandler writeHandler) { export(response, DateUtils.format(new Date(), DateUtils.DATE_FORMAT_14), "导出数据", dataList, clazz,writeHandler); }

/**
 * 导出excel
 *
 * @param response  响应类
 * @param fileName  文件名
 * @param sheetName sheet名
 * @param dataList  数据列表
 * @param clazz     class类
 * @param <T>       泛型
 */
@SneakyThrows
public static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> dataList, Class<T> clazz,WriteHandler writeHandler) {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding(Charsets.UTF_8.name());
    fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name());
    response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
    EasyExcel.write(response.getOutputStream(), clazz).registerWriteHandler(writeHandler).sheet(sheetName).doWrite(dataList);
}