springboot利用easyexcel在浏览器中下载excel

前言

项目中操作excel是一种很常用的功能,比如下载一份excel的报价单。这篇文章会介绍一款excel的处理工具以及导出遇到的三个常见异常(重要)。

之前遇到一个这样的需求:后台管理页面,点击下载按钮,下载一份excel格式的报价清单

在这里插入图片描述

是不是让人头疼? 别怕,往下看,很简单~

easyexcel

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能,这是阿里开源项目,官方文档:https://easyexcel.opensource.alibaba.com/docs/current/

文档里面有"读Excel",“写Excel”,"填充Excel"这三个栏目,从上面的需求来看,我们导出的表格不是规则的表格,并且里面还有特定的样式,因此我们选择填充Excel

文档写得非常详细,又是中文,大家可以自己看文档。我这里给出一个简单的例子

引入依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

文档好像没有直接给出依赖

浏览器下载示例:

public void down(){
    ExcelWriter excelWriter = null; // Ⅰ
    try {
        //boards 数据省略
        //access 数据省略
        
        ServletRequestAttributes servletRequestAttributes =  (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = servletRequestAttributes.getResponse();// Ⅱ

        String fileName = URLEncoder.encode(LocalDate.now() + " 测试.xlsx", StandardCharsets.UTF_8.toString()).replace("+", "%20"); // Ⅲ
        
        response.setContentType("application/force-download");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        InputStream inputStream = this.getClass().getResourceAsStream("/static/price-template.xlsx");// Ⅳ
        excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();
		
        //Ⅴ
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        excelWriter.fill(new FillWrapper("list1", boards), fillConfig, writeSheet);
        excelWriter.fill(new FillWrapper("list2", access), fillConfig, writeSheet);
        excelWriter.fill(orderEntity, writeSheet);

        Map<String, BigDecimal> map = new HashMap<>();
        map.put("boardsTotalPrice", boardsTotalPrice);
        map.put("accessTotalPrice", accessTotalPrice);
        map.put("totalPrice", boardsTotalPrice.add(accessTotalPrice));

        excelWriter.fill(map, writeSheet);
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        if (!Objects.isNull(excelWriter)){
            excelWriter.close();
        }
    }
}

**Ⅰ:**try catch之前定义一个ExcelWriter,最后在finally里面关闭,释放资源

**Ⅱ:**HttpServletResponse response可以通过参数传入,这里直接通过对象获取

**Ⅲ:**输出格式如下的文件”2023-12-11 测试.xlsx“,因为是中文,所以使用URLEncoder,因为有空格,所以有这样的代.replace(“+”, “%20”)

**Ⅳ:**以流的形式读取模板,注意模板是放在resource下的static目录下

**Ⅴ:**这里就是填充数据了,因为有两个列表,因此定义list1和list2,下面看看填充的模板

在这里插入图片描述

总得来说大部分代码是固定的,只有填充数据那里是动态的

遇到的问题

这里讲讲开发过程中遇到的问题

1.依赖冲突

先看看会报什么错误

com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoSuchMethodError: 'void org.apache.poi.ss.usermodel.Cell.setBlank()'

com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoSuchMethodError: 'javax.xml.parsers.DocumentBuilder org.apache.poi.util.XMLHelper.newDocumentBuilder()'

出现这个问题大概率就是引入了

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.0</version>
</dependency>

因为

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

已经包含了上面的两个依赖。

2.模板文件编译后损坏

报错:

com.alibaba.excel.exception.ExcelGenerateException: Create workbook failure

Caused by: org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) file
	at org.apache.poi.openxml4j.util.ZipArchiveThresholdInputStream.getNextEntry(ZipArchiveThresholdInputStream.java:145)
Caused by: java.util.zip.ZipException: Unexpected record signature: 0X9

因为文件损坏,无法创建workbook,如遇到这个问题在pom文件添加以下插件即可

<!-- 避免font文件的二进制文件格式压缩破坏 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
</plugin>

3.线上无法读取模板

先看看报错

java.io.FileNotFoundException: file:/data2/xxx0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/static/template/price-template.xlsx (No such file or directory)

你本地是没有问题的,但是部署到线上却有问题

首先出现这样的问题大概率是你在读取模板的时候使用了以下的方式

ResourceUtils.getFile("classpath:static\xxx");ResourceUtils.getURL("/static/price-template.xlsx").getPath();

通过这种正常路径访问

比如说我上面的代码刚开始是这样写的

String path = ResourceUtils.getURL("/static/price-template.xlsx").getPath();
FileInputStream inputStream = new FileInputStream(path);

本地是没有问题的,因为price-template.xlsx文件就是真实的存储在磁盘里面的static目录下,但到线上就不一样了,因为当打成jar包,该文件是存在jar包文件资源里,而不是真实存在于磁盘路径上。

所以后面我把代码改成

InputStream inputStream = this.getClass().getResourceAsStream("/static/price-template.xlsx");

直接获取jar包里面的模板,并且输出文件流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/236186.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——策略模式(Strategy Pattern)

概述 策略模式又叫政策模式&#xff0c;是一种对象行为型模式。它是将定义的算法家族分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;从而让算法的变化不会影响到使用算法的用户。策略模式的主要目的是将算法的定义与使用分开&#xff0c;也就是将算法的行为和环…

NV040D语音芯片应用于取暖桌:智能语音提高用户体验

科技与生活的结合&#xff0c;是科技发展的展示。天气的降温&#xff0c;取暖桌越来越取得用户的心&#xff0c;时至今日传统的取暖桌已经没有办法满足用户的需求&#xff0c;智能语音取暖桌给用户的生活带来了不一样的体验。 NV040D语音芯片是一款性能稳定的芯片&#xff0c;拥…

arcgis api for js 图层标注文本不显示

在打包arcgis api for js 项目后&#xff0c;更新到现场所有地图文本要素不显示的时候。 可能就是环境设置问题了&#xff0c;需要配置iis或者ngixs里边配置如下类型 iis发布的项目 1、打开iis中发布的网站 2、找到网站的MIME类型如下图 3、添加一下类型&#xff08;一个都不…

CentOS系统下配置HTTP服务器的步骤

在CentOS系统下配置HTTP服务器涉及到一系列的步骤。以下是一个基本的步骤概述&#xff0c;帮助你了解如何为CentOS系统配置HTTP服务器。 安装HTTP服务器软件&#xff1a; 首先&#xff0c;你需要在CentOS系统上安装HTTP服务器软件。常见的选择是Apache HTTP服务器。你可以使用…

前端开发新趋势:Web3、区块链与虚拟现实

文章目录 Web3&#xff1a;下一代互联网区块链技术去中心化应用程序&#xff08;DApps&#xff09; 区块链&#xff1a;重塑数字世界数字钱包NFT&#xff08;非同质化代币&#xff09; 虚拟现实&#xff1a;沉浸式体验WebVR和WebXR三维图形 新挑战与机会性能与复杂性安全性创新…

9.静态路由

静态路由 中小型网络都会用到&#xff0c;防火墙核心交换机用的很多&#xff0c;一般是用在出口 路由表&#xff1a;路由器用来转发数据包唯一的依据 NextHop下一跳 Static静态路由需要手动设置 ip route-static 目标网段 掩码 下一跳例如&#xff1a;ip route-static 192…

我们一起做过的SPA——Nuxt.js介绍

Nuxt.js 1 我们一起做过的SPA SPA&#xff08;single page web application&#xff09;单页 Web 应用&#xff0c;Web 不再是一张张页面&#xff0c;而是一个整体的应用&#xff0c;一个由路由系统、数据系统、页面&#xff08;组件&#xff09;系统等等&#xff0c;组成的应…

VMware虚拟机cpu不支持avx指令集处理

原创作者&#xff1a;运维工程师 谢晋 VMware虚拟机cpu不支持avx指令集处理 客户虚拟化环境内有台虚拟机内应用程序需要使用到avx指令集&#xff0c;排查过物理主机CPU是支持avx指令集&#xff0c;但虚拟机内缺无法正常应用&#xff0c;需将虚拟机CPU修改为硬件模式。将虚拟…

高压配电系统智能监测

高压配电系统智能监测是一种基于现代信息技术的电力系统监测手段&#xff0c;依托电易云-智慧电力物联网&#xff0c;旨在提高高压配电系统的安全性、可靠性和运行效率。具体而言&#xff0c;高压配电系统智能监测包括以下方面&#xff1a; 实时监测&#xff1a;通过安装传感器…

笔记69:Conv1d 和 Conv2d 之间的区别

笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体 a a a a a a a a a a a

L1-028:判断素数

题目描述 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于231的需要判断的正整数。 输出格式&#xff1a; 对每个需要判断的…

stable video diffusion:scaling latent video diffusion models to large datasets

【AIGC-AI视频生成系列-5】Stable Video Diffusion -长文解读视频/3D生成变革的开始 - 知乎一句话总结&#xff1a;长文解读一份Stability AI 最新力作Stable Video Diffusion&#xff0c;如同实验报告的论文&#xff0c;构建了一个高质量的视频生成通用模型&#xff0c;在多种…

cache教程 5.分布式节点的通信

0.对原教程的一些见解 其回顾完请求流程就是抽象了两个接口&#xff0c;PeerPicker和PeerGetter。这样操作&#xff0c;读者阅读时可能很难快速明白其含义&#xff0c;不好理解为什么就创建出两个接口&#xff0c;感觉会比较疑惑。原教程的评论中也有讨论这点。 本教程就先不创…

Error opening file for writing报错解决

报错展示及描述 在安装pycharm的时候出现了一下报错&#xff0c; Error opening file for writing。 报错原因 一般出现这种报错都是文件权限的原因&#xff0c;检查一下&#xff0c;果然这个文件夹权限是【只读】 查看文件权限的方式&#xff1a;【右击】文件夹名称&#xff0…

【23真题】拜托再练一套!保持手感!

今天分享的是23年河北科技大学882的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年河北科技大学822考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;本套试题难度中等偏下&#xff0c;题量适中&#xff0c;对于很多基础知识…

大创项目推荐 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

mycat部署和配置读写分离(二)

说明&#xff1a; MyCAT 是使用 JAVA 语言进行编写开发&#xff0c;使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性&#xff0c;所以要求必须在 JDK7 以上的版本上运行。 1. jdk1.8安装 详见jdk环境安装 2. Mysql安装 详见mysql8.0.11源码安装…

Oracle(2-15)RMAN Incomplete Recovery

文章目录 一、基础知识1、The Procedure 不完全恢复步骤2、UNTIL TIME Example 基于时间的恢复3、UNTIL SEOUENCE Example 基于序列的恢复 二、基础操作1、不完全恢复准备工作2、不完全恢复开始恢复 RMAN Incomplete Recovery RMAN的不完全恢复 目标&#xff1a; 使用“UNTIL T…

【开源】基于Vue和SpringBoot的计算机机房作业管理系统

项目编号&#xff1a; S 017 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S017&#xff0c;文末获取源码。} 项目编号&#xff1a;S017&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课…

Linux基础指令(2)

今天我们继续来学我们有关于Linux的指令&#xff0c;今天的指令要比上次多多了。开始我们的学习吧。 man手册 先来看标题&#xff0c;手册我们第一时间想到的就是手册的查阅功能&#xff0c;我们都知道在我们上小学的时候&#xff0c;如果遇到不会的字&#xff0c;我们会通过…