Excel模板导入、导出工具类

1.引入maven依赖,利用hutool的excel读取

Hutool-poi对excel读取、写入

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>        <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>net.sf.jxls</groupId><artifactId>jxls-core</artifactId><version>1.0.6</version></dependency><dependency><groupId>net.sf.jxls</groupId><artifactId>jxls-reader</artifactId><version>1.0.3</version></dependency>

注意:说明 hutool-4.x的poi-ooxml 版本需高于 3.17(别问我3.8版本为啥不行,因为3.17 > 3.8 ) hutool-5.x的poi-ooxml 版本需高于 4.1.2 hutool-5.6.x支持poi-ooxml 版本高于 5.0.0 xercesImpl版本高于2.12.0(非必须)

2.导出模板创建,内容如下,也可以参考最上面上传资源

3.excel导入、导出工具类

package com.demo.utils;import cn.hutool.core.collection.CollUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import lombok.extern.log4j.Log4j2;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StopWatch;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Description: 导出工具类*/
@Log4j2
public class ExportUtil {/*** 导出excel** @param templatePath excel模板路径* @param listData     导出数据* @param fileName     导出文件名* @param request* @param response* @throws IOException*/public static void exportExcel(String templatePath,List<?> listData,String fileName,HttpServletRequest request,HttpServletResponse response) throws IOException {Map<String, Object> map = new HashMap<>();map.put("dataList", listData);response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("Set-Cookie", "fileDownload=true; path=/");response.setHeader("Content-Disposition", "attachment;filename=" +new String(fileName.getBytes("utf-8"), "iso8859-1"));StopWatch watch = new StopWatch();watch.start();ClassPathResource classPathResource = new ClassPathResource(templatePath);try (InputStream inputStream = classPathResource.getInputStream();ServletOutputStream out = response.getOutputStream()) {XLSTransformer xlsTransformer = new XLSTransformer();Workbook workbook = xlsTransformer.transformXLS(inputStream, map);workbook.write(out);workbook.close();watch.stop();log.info("导出excel共耗时:{}毫秒!", watch.getTotalTimeMillis());} catch (InvalidFormatException e) {e.printStackTrace();log.error("导出失败:{}", e.getMessage());}}/*** 获取导入excel文件的数据** @param templatePath  模板地址* @param file          导入的excel文件* @return*/public static List<Map<String, Object>> getImportExcelData(String templatePath,MultipartFile file) {// 判断是否上传的是excelif ("xlsx".equals(file.getContentType()) || "xls".equals(file.getContentType())) {try (ExcelReader reader = ExcelUtil.getReader(file.getInputStream())) {// 获取模板excel表头List<Object> excelTitleList = getExcelTitle(templatePath);// 导入的文件excel表头List<Object> importTitleList = reader.readRow(0);boolean exist = importTitleList.containsAll(excelTitleList);// 判断导入的excel与模板的excel标题是否一致,即判断上传的模板是否正确if (!exist) {throw new RuntimeException("模板不匹配,请下载正确模板!");}// 读取excel数据StopWatch stopWatch = new StopWatch();stopWatch.start();List<Map<String, Object>> dataList = reader.readAll();if (CollUtil.isEmpty(dataList)) {throw new RuntimeException("导入文件的内容不能为空!");}stopWatch.stop();log.info("一共{}条数据,耗时{}毫秒!", dataList.size(), stopWatch.getTotalTimeMillis());return dataList;} catch (IOException e) {e.printStackTrace();log.error("导入的excel文件出错:{}", e.getMessage());throw new RuntimeException("导入的excel文件有问题!");}} else {throw new RuntimeException("请上传xls或xlsx格式文件!");}}/*** 根据模板excel获取excel表头** @param excelFilePath 模板地址* @return*/public static List<Object> getExcelTitle(String excelFilePath) {ClassPathResource classPathResource = new ClassPathResource(excelFilePath);try (InputStream in = classPathResource.getInputStream();) {ExcelReader reader = ExcelUtil.getReader(in, 0);return reader.readRow(0);} catch (Exception e) {e.printStackTrace();log.error("Excel读取失败:" + e.getMessage());throw new RuntimeException("Excel读取失败:" + e.getMessage());}}public static void main(String[] args) {List<Object> excelTitle = getExcelTitle("templates/excel/exports/test.xlsx");excelTitle.stream().forEach(x -> {System.out.println(x.toString());});}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux之安装Nginx

目录 传送门前言一、快速安装二、反向代理语法1、基本语法2、location语法1. 基本语法2. 匹配规则3. 修饰符4. 权重5. 嵌套location6. 其他指令7.案例 三、配置反向代理 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff0…

Java 海报-基于Graphics2D 实现个人头像的圆形裁剪

效果&#xff1a; 代码&#xff1a; private static BufferedImage resizeAndClipToCircle(BufferedImage image, int size) {// 缩小图片BufferedImage resizedImage new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);Graphics2D g2d resizedImage.createGraphi…

5.组合与继承

1.面向对象 在C中&#xff0c;面向对象&#xff08;Object-Oriented&#xff09;是一种程序设计范式&#xff0c;它使用“对象”来设计应用程序和软件。面向对象编程&#xff08;OOP&#xff09;的核心概念包括类&#xff08;Class&#xff09;、对象&#xff08;Object&#x…

Vivado综合属性SRL_STYLE怎么用?

“SRL_STYLE”属性是Vivado中用于控制移位寄存器&#xff08;Shift Register Logic, SRL&#xff09;映射方式的关键属性。 本文将详细介绍SRL_STYLE的工作原理、可选值及其在实际设计中的应用代码示例。 一、什么是SRL_STYLE&#xff1f; SRL_STYLE属性用于指导Vivado综合工…

方便快捷!使用Roboflow进行数据增强(附详细操作)

最近使用自定义数据集训练yolov8模型的时候突然发现一件很令人头疼的事情。那就是&#xff0c;数据集中图片太少了。于是想通过数据增强的方法扩大数据集。 通过查阅资料发现&#xff0c;大部分人都是用python中的imgaug库进行图像处理&#xff1b;这种方法最大的不便就是需要转…

【贪心算法】Leetcode 55. 跳跃游戏【中等】

跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&…

RTT设备驱动框架学习(GPIO)

基类对象&#xff0c;定义在rtdef.h中 struct rt_object {char name[RT_NAME_MAX];rt_uint8_t type; //设备类Devicert_uint8_t flag;rt_list_t list; }; //同一类对象挂接在一个链表上设备基类&#xff0c;定义在rtdef.h中&#xff08;属于设备接口层&#xff09; struct rt…

如何通过需求跟踪矩阵加强需求管理?

需求跟踪矩阵是强化需求管理的有效工具&#xff0c;它能直观地展示需求与项目各阶段产出物之间的映射关系&#xff0c;确保每个需求从提出到最终实现都得到严密的跟踪与控制&#xff0c;从而提高需求质量和开发效率&#xff0c;保障项目顺利交付。 如果没有需求跟踪矩阵&#x…

多图详解VSCode搭建Python开发环境

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Elasticsearch】Elasticsearch 从入门到精通(二):基础使用

《Elasticsearch 从入门到精通》共包含以下 2 2 2 篇文章&#xff1a; Elasticsearch 从入门到精通&#xff08;一&#xff09;&#xff1a;基本介绍Elasticsearch 从入门到精通&#xff08;二&#xff09;&#xff1a;基础使用 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的…

用Python将原始边列表转换为邻接矩阵

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在图论和网络分析中&#xff0c;图是一种非常重要的数据结构&#xff0c;它由节点&#xff…

Python 中元组和列表的根本区别是什么?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在 Python 中&#xff0c;元组&#xff08;Tuple&#xff09;和列表&#xff08;List&#xff09;都是用于存储数据序列的数据结构&#xff0c;它们可以存储任何类型的数据&#xff0c;支持通过索引访问…

【AI开发:音频】一、GPT-SoVITS整合工具包的部署问题解决(GPU版)

前言 目前GPT-SoVITS的合成效果比较不错&#xff0c;相比较其他厂商的产品要规整的多。众多厂家中也是国内使用最多的一款了&#xff0c;并且这个整合包里携带了&#xff0c;除背景音、切割、训练、微调、合成、低成本合成等一些列完整的工具&#xff0c;也可以作为API进行使用…

StartAI智能绘图软件出现“缺少Python运行库”怎么办?

StartAI做为一款国产AI界的新秀&#xff0c;是一款贴合AIGC新手的智能绘图软件。新手安装遇见“缺少Python运行库”怎么办”&#xff1f;小编一招搞定~ 解决方法&#xff1a;手动下载【resource文件】&#xff0c;将文件添加到安装目录下。 点击链接进行手动下载噢~ 确保 Star…

React首次加载渲染2次的问题

在开发React项目的时候&#xff0c;发现useEffect会调用2次的情况&#xff0c;依赖数组明明没有变化&#xff0c;怎么会调用2次&#xff1f;百思不得其解&#xff0c;依赖没变化的话&#xff0c;那肯定是整个组件重渲染了。 最最简单的代码如下&#xff1a; const container …

【抽代复习笔记】14-群(八):变换群中的旋转、位似、平移变换群

定理1&#xff1a;集合A上的所有一一变换的集合G关于变换的乘法&#xff08;复合&#xff09;作成群。 证&#xff1a;首先&#xff0c;恒等变换ɛ:A→A(ɛ(x) x)是集合A上的一一变换&#xff0c;所以ɛ∈G&#xff0c;即G≠∅&#xff1b; ①对任意的f,g∈G&#xff0c;由映…

AI人工智能培训老师叶梓:大数据治理的关键工具:开源数据血缘分析系统

在大数据时代&#xff0c;数据的产生和传播速度日益加快&#xff0c;数据之间的关系也变得日益复杂。为了更好地管理和理解数据之间的关系&#xff0c;数据血缘分析系统应运而生。本文将介绍几个开源的数据血缘分析系统&#xff0c;它们在数据治理、数据质量管理和数据隐私保护…

ragflow 大模型RAG知识库使用案例

参考: https://github.com/infiniflow/ragflow/blob/main/README_zh.md 支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据, 网页等。 运行步骤: 1、确保 vm.max_map_count 不小于 262144 【更多】: 如需确认 vm.…

ThingsBoard服务端使用RPC通过网关给设备发送消息

一、概述 1、发送服务器端网关RPC 二、案例&#xff1a; 1、建立设备与网关之间的通讯 2、查看设备和网关是否在线状态啊 3、通过 仪表盘&#xff0c;创建设备A的模拟RPC调用的窗口链接 4、在客户端的网关设备上订阅RPC网关的主题信息 5、通过服务端的窗口&#xff0c;发…

3DGS CUDA代码笔记

本篇文章 一Scaffold GS 为例子。 目标在里面添加 Render Depth 的代码&#xff1a; 将可见的 Gaussians Render 到 2D 图像上面 from diff_gaussian_rasterization import GaussianRasterizationSettings, GaussianRasterizer .......rasterizer GaussianRasterizer(raster…