首页 > 编程语言 >Java 下载excel模板下载之后无法正常打开,提示损坏

Java 下载excel模板下载之后无法正常打开,提示损坏

时间:2022-10-13 22:44:11浏览次数:53  
标签:文件 下载 Java excel maven 模板 resources

简单版:resources 目录下放模板 excel 文件,通过接口下载后,有文件,但打不开。

解决:maven 构建时对该 excel 模板进行了过滤,导致文件损坏,解决办法,在过滤的时候把 xlsx 排除掉(<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>)。

<build>
	<plugins>
    	<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <nonFilteredFileExtensions>
						<!--不加这一行,xlsx文件会被过滤,然后在maven build的时候,去target下看对应的xlsx就是损坏的-->
                        <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
        </plugin>
    </plugins>
</build>

具体过程

问题: springboot 项目简单的下载excel 模板功能,模板放在resources/template/目录中,

public static void downloadTemplate(String downloadName, String classPath) {
    // 处理下中文乱码问题获取response
    HttpServletResponse response = ResponseUtils.getHttpResponse(downloadName + XLSX);
    try (InputStream inputStream = new ClassPathResource(classPath).getStream();
         OutputStream outputStream = response.getOutputStream()) {
        IOUtils.copy(inputStream, outputStream);
    } catch (IOException e) {
        log.error(String.format("下载%s失败", downloadName), e);
    }
}

代码挺简单,一运行,也挺顺利,很快就把文件下好了。点开看看,咦,怎么回事,怎么提示我可能是内存不足,不足以打开这个文件呢?

尝试一

当时电脑也有点卡,心想可能是内存不够了,关了一些文件,还是无法正常打开;而打开那个模板文件就是正常的。排除提示的情况, 确定是文件出错了。

尝试二

代码是直接从之前做的项目直接拷贝的,之前运行的都没问题,按理来说,也应该没问题啊。直接去搜 java excel下载无法打开, 有说什么 Response 要设置 Content-Length 才行。试了一下还是不行。

尝试三

直接尝试从本地文件的 excel 文件,写到另一个文件,发现可以正常写入;从 classpath读取,写入失败。也就是,从 classpath 读取的时候,就是一个有问题的 excel 文件。

尝试四

之前一直着眼于代码结构中的模板文件了,后来想到, 太傻了, 要去 target 目录下去看看才是。打开一看,好家伙,编译过后的 excel 文件就是损坏的。

尝试五

这个时候才想到搜索时有文章提到 maven 的 filtering,发现是 <filtering>true</filtering>

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
            <include>**/*.json</include>
            <include>**/*.ftl</include>
        </includes>
    </resource>
</resources>

当然,粗暴一点解决就是改为 false, 以前的项目也一直是 false;当中也试了很多 <excludes>,现在看起来是白费力气, 它喵的, <excludes> 就直接排除了,你重新 mvn clean compile 的时候,直接看不到 excel 模板了。最后还是采用了开头描述的方案。

总结

有的时候,程序报的错误会误导我们,尽管它告诉我们错误是由于“原因a”引起的,但排查到最后,可能是“原因z”引起的。在遇到问题的时候,我们就应该仔细思考一下,哪些是没问题的,有哪些可能导致了问题的发生。而不是被某个错误原因所误导。

虽然问题还是比较简单,但还是耗费了不少时间趟这条弯路。因此记录一下,作为警示。

标签:文件,下载,Java,excel,maven,模板,resources
From: https://www.cnblogs.com/studentytj/p/16790002.html

相关文章

  • 部分Java基本知识(本人小白中小白,敲错轻喷)
    目录CONTENTS注释,标识符,关键字数据类型类型转换变量,常量运算符包机制,JavaDoc注释,标识符,关键字:注释(三种):单行注释://注释多行注释:/注释/文档注释:JavaDoc文档......
  • 在apache-tomcat-7.0.109中运行Structs2返回java.lang.NoSuchFieldException: resourc
    文章目录​​小结​​​​问题​​​​Noresultdefinedforactionandresultinput​​​​运行Structs2返回java.lang.NoSuchFieldException:resourceEntries错误​​......
  • bootstrap table + java 分页案例 --- 两种分页方法详细解析
    本文主要介绍了使用bootstraptable与java实现的数据拉取与分页展示的2个案例。第一个案例通过分页参数limit与offset直接从数据查询,第二个案例则是使用com.g......
  • java基础语法[03]
    二、变量java为强类型语言,每个变量必须声明类型;java变量为程序之后最基本的存储单元,其要素包括变量名,变量类型和作用域。typevarname[=value]{[,varname[=value]}......
  • excel常用公式
    条件查找IFNA(VLOOKUP(TBL_NAME!A1,TBL_NAME!$A$1:$C$10,3,0)&"","")vlookup()后加&“”可将空值0显示为空白ifna(vlookup(),"")可在vlookup函数显示#N/A时,自定义显示内......
  • Speech Recognition Java Code - HMM VQ MFCC ( Hidden markov model, Vector Quantiz
    Hieveryone,Ihavesharedspeechrecognitioncodein​​​https://github.com/gtiwari333/speech-recognition-java-hidden-markov-model-vq-mfcc​​Youcanfindcomp......
  • java_study(2)
    Java学习笔记[java](Java常量:Java常量的定义和分类(biancheng.net))Java学习笔记JavaJDK的使用:JDK是一种用于构建在Java平台上发布的应用程序、Applet和组件的......
  • 微软出品自动化神器【Playwright+Java】系列(五) 之 常见点击事件操作
    写在前面明天就是周五了,这周有那么一两天心情特别不好,真的是做什么都没兴致,所以导致整个人都很丧,什么都不想做。本打算周一就更新这篇文章的,但由于公司一直加班,每天到家......
  • JavaDoc
    /**@author作者名*@version版本号*@since最早jdk版本*@param参数名*@return返回值*@throws异常*/dos命令生成javadoc:在class目录中打开cmd,输入javadoc-e......
  • JavaScript高级程序设计笔记10 函数Function
    函数1.几种实例化函数对象的方式以函数声明的方式定义函数表达式箭头函数(arrowfunction)使用Function构造函数接收任意多个字符串参数,最后一个参数始终会被......