在开发同步导出功能是遇到了如标题所示的问题,解决后遂记录下来供大家参考。
@RestController
public class XxxController {@PostMapping("/export")public BaseResponse export(@RequestBody PolicyErrorAnalysisExportReq exportReq, HttpServletResponse response) {BaseResponse res = new BaseResponse();try {// ...} catch(Exception e) {}return res}
}
执行如上方法导出时,打开的 Excel 文件会提示:发现Excel中的部分内容有问题。是否让我们尽量尝试恢复? 如果您信任此工作簿的源,请单击“是”。
因为前端在处理文件流时,不知道文件流的长度,会全量处理文件流,由于指定了 @RestController
注解,除了文件流之外, BaseResponse res
的 JSON 体也会被包含在响应体中,那么这样前端便解析到了无关的字符。将导出的 Excel 文件修改成 .xml 后缀查看其中信息,如下所示:
发现果然包含了响应对象的 JSON 格式,解决该问题也非常简单,第一种方案是直接将返回值改成 void,让前端只处理流即可
@RestController
public class XxxController {@PostMapping("/export")public void export(@RequestBody PolicyErrorAnalysisExportReq exportReq, HttpServletResponse response) {try {// ...} catch(Exception e) {}}
}
第二种方案是在响应头中指定输出流的长度,到了指定长度后前端便不再处理,只解决 Excel 文件相关的内容即可。