Maven 打包 Excel 文件损坏

栏目: Java · 发布时间: 5年前

前几天在项目中遇到一个小问题,有一个 Excel 文件放在 classpath 下,通过流下载下来,本地测试的时候一点问题都没,但是部署到测试环境却不行了,说文件已损坏,然后打不开,简单代码如下:

@RequestMapping(value = "/export", method = RequestMethod.GET)
    public void export(HttpServletResponse response) {

        ServletOutputStream servletOutputStream = null;
        String filename = "template.xlsx";
        InputStream inputStream = ExcelHandleController.class.getClassLoader().getResourceAsStream(filename);
        try {
            byte[] b = new byte[inputStream.available()];
            inputStream.read(b);
            response.setCharacterEncoding(StandardCharsets.UTF_8.name());
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);
            response.setContentType("application/octet-stream;charset=UTF-8");
            //获取响应报文输出流对象
            servletOutputStream = response.getOutputStream();
            //输出
            servletOutputStream.write(b);
        } catch (IOException e) {
            logger.error("文件下载出错", e);
        } finally {
            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    logger.error("文件下载出错", e);
                }
            }
            if (null != servletOutputStream) {
                try {
                    servletOutputStream.flush();
                    servletOutputStream.close();
                } catch (IOException e) {
                    logger.error("文件下载出错", e);
                }

            }

        }

    }

当时就感觉这代码很简单啊,没什么问题的,但是下载下来就是不对,想到是不是测试环境有什么问题,查了一下没什么特殊之处,最后发现 Git 上的代码中的文件并没有什么问题,但是打成 war 包解压之后这文件本身就已经损坏了,而且比对了一下两个文件,发现 war 包之中的文件变大了,搜了一下资料,才知道原来 maven 打包会对一些文件转码,这个过程中会损坏一些文件,所以打不开,网上的资料也挺多,最简单的就是增加一个 plugin,不让该文件转码,代码如下:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                        <nonFilteredFileExtension>xls</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>

看着很像那么回事,而且很多人都是信誓旦旦的说没问题,但是我负责的系统有些问题,所以并没有生效,如果有遇到这个问题的同学可以测试一些,最后实在心烦,其实下载的就是一个小 Excel 文件而已,不要模板了,直接生成一个下载,代码如此简单:

@RequestMapping(value = "/export", method = RequestMethod.GET)
    public void export(HttpServletResponse response) {

        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("模板");

        // 产生表格标题行
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);
        cell.setCellValue("第零行第零列数据");
        cell = row.createCell(1);
        cell.setCellValue("第零行第一列数据");

        ServletOutputStream servletOutputStream = null;
        String filename = "template.xlsx";
        try {
            response.setCharacterEncoding(StandardCharsets.UTF_8.name());
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);
            response.setContentType("application/octet-stream;charset=UTF-8");
            //获取响应报文输出流对象
            servletOutputStream = response.getOutputStream();
            //输出
            workbook.write(servletOutputStream);
        } catch (IOException e) {
            logger.error("文件下载", e);
        } finally {

            if (null != servletOutputStream) {
                try {
                    servletOutputStream.flush();
                    servletOutputStream.close();
                } catch (IOException e) {
                    logger.error("文件下载", e);
                }
            }
            if (null != workbook) {
                try {
                    workbook.close();
                } catch (IOException e) {
                    logger.error("文件下载", e);
                }
            }

        }

    }

其实这个本没必要写一篇文章,但是其实就是想告诉大伙,1. maven 打包文件会转码;2. 工作中有时候解决问题不要自古华山一条道,其实换个思路立马柳暗花明,但是学习东西,确实有时候只有深究才有进步。

全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。

作 者: BridgeLi,https://www.bridgeli.cn

原文链接: https://www.bridgeli.cn/archives/596

版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。


以上所述就是小编给大家介绍的《Maven 打包 Excel 文件损坏》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

跨越鸿沟

跨越鸿沟

[美] 杰弗里·摩尔(Geoffrey A. Moore) / 赵娅 / 机械工业出版社 / 2009-1 / 36.00元

在真正涉足高科技领域之前,你有必要读一读这本书——在这个节奏飞快、竞争激烈的技术竞技场上,这本书绝对能够帮助你更容易地获得成功。 ——威廉姆·劳森 罗盛软件公司董事会主席兼CEO 最近40年来,本书对高科技营销各个方面所做出的贡献远远超过了其他任何相关书籍。如今已经有无数企业和大学分别在自己的运营和教学过程中引入了鸿沟思想,如果你还不是这些企业或大学中的一员,你可能就要担心自己的未来了......一起来看看 《跨越鸿沟》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具