使用EasyExcel和POI操作Excel实现文件上传和下载

使用easyExcel实现文件读写

实现流程

1.导入依赖

2.定义数据模型

3.定义监听器

4.读取或写入数据

5.释放资源

实现

导入依赖

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

定义数据模型

@@ExcelProperty(value = "id" ,index = 0)  列的字段名称和索引

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CategoryExcelVo {@ExcelProperty(value = "id" ,index = 0)private Long id;@ExcelProperty(value = "名称" ,index = 1)private String name;@ExcelProperty(value = "图片url" ,index = 2)private String imageUrl ;@ExcelProperty(value = "上级id" ,index = 3)private Long parentId;@ExcelProperty(value = "状态" ,index = 4)private Integer status;@ExcelProperty(value = "排序" ,index = 5)private Integer orderNum;}

定义监听器

public class ExcelListener<T> extends AnalysisEventListener<T> {private static final int BATCH_COUNT = 100;private List cacheList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);private CategoryMapper categoryMapper;public ExcelListener(CategoryMapper categoryMapper){this.categoryMapper = categoryMapper;}//读取结束之前,每次调用invoke()方法@Overridepublic void invoke(T t, AnalysisContext analysisContext) {CategoryExcelVo categoryExcelVo = (CategoryExcelVo) t;cacheList.add(categoryExcelVo);if(cacheList.size() >= BATCH_COUNT){saveData();cacheList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {saveData();}private void saveData(){categoryMapper.insertData(cacheList);}
}

读取

@Override
public void importData(MultipartFile file) {try {ExcelListener<CategoryExcelVo> listener = new ExcelListener<>(categoryMapper);EasyExcel.read(file.getInputStream(),CategoryExcelVo.class,listener).sheet().doRead();} catch (IOException e) {throw new GuiguException(ResultCodeEnum.DATA_ERROR);}
}

写入

@Overridepublic void exportData(HttpServletResponse response) {try {// 设置响应结果类型response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("分类数据", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");//response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");// 查询数据库中的数据List<Category> categories = categoryMapper.selectAll();List<CategoryExcelVo> res = new ArrayList<>();categories.forEach(category ->{CategoryExcelVo temp = new CategoryExcelVo();BeanUtils.copyProperties(category,temp,CategoryExcelVo.class);res.add(temp);});EasyExcel.write(response.getOutputStream(),CategoryExcelVo.class).sheet().doWrite(res);} catch (IOException e) {throw new GuiguException(ResultCodeEnum.DATA_ERROR);}}

使用POI实现Excel文件的读写

导入依赖

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

读取

 /*** 通过POI获取Excel文件中的内容* @throws Exception*/public static void read() throws Exception{FileInputStream in = new FileInputStream("E:\\info.xlsx");XSSFWorkbook excel = new XSSFWorkbook(in);XSSFSheet sheet = excel.getSheetAt(0);//获取有文字的最后一行行号int lastRowNum = sheet.getLastRowNum();for(int i = 1;i <= lastRowNum;i++){//获得某一行XSSFRow row = sheet.getRow(i);System.out.println(row.getCell(1).getStringCellValue() + " " +row.getCell(2).getStringCellValue());}excel.close();in.close();}

写入

    /*** 通过POI创建Excel文件且写入文件内容*/public static void write() throws Exception{//在内容中创建一个Excel文件XSSFWorkbook excel = new XSSFWorkbook();//在Excel文件中创建sheet页XSSFSheet sheet = excel.createSheet("info");//在Excel文件中创建对象  索引从0开始XSSFRow row = sheet.createRow(1);//创建单元格并且写入文件内容row.createCell(1).setCellValue("姓名");row.createCell(2).setCellValue("城市");//创建一个新行row = sheet.createRow(2);//创建单元格并且写入文件内容row.createCell(1).setCellValue("张三");row.createCell(2).setCellValue("北京");row = sheet.createRow(3);//创建单元格并且写入文件内容row.createCell(1).setCellValue("李四");row.createCell(2).setCellValue("南京");//通过输出流将内存中的内容写入磁盘OutputStream out = new FileOutputStream(new File("E:\\info.xlsx"));excel.write(out);out.close();excel.close();}

使用场景(数据导出)

 public void exportBusinessData(HttpServletResponse response) {//查数据库,获取营业数据LocalDate dateBegin = LocalDate.now().minusDays(30);LocalDate dateEnd = LocalDate.now().minusDays(1);LocalDateTime begin = LocalDateTime.of(dateBegin, LocalTime.MIN);LocalDateTime end = LocalDateTime.of(dateEnd, LocalTime.MAX);//查询概览数据BusinessDataVO businessDataVO = workspaceService.getBusinessData(begin, end);//通过POI将数据写入到Excel中InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");try {//基于模板文件创建一个新的Excel文件XSSFWorkbook excel = new XSSFWorkbook(in);//填充数据//获取表格文件sheet标签页XSSFSheet sheet = excel.getSheet("sheet1");//填充时间段sheet.getRow(1).getCell(1).setCellValue("时间: " + dateBegin + " 至 " + dateEnd);//获得第四行XSSFRow row = sheet.getRow(3);row.getCell(2).setCellValue(businessDataVO.getTurnover());row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());row.getCell(6).setCellValue(businessDataVO.getNewUsers());row = sheet.getRow(4);row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());row.getCell(4).setCellValue(businessDataVO.getUnitPrice());for(int i = 0;i < 30;i++){LocalDate date = dateBegin.plusDays(i);//查询某一天的数据BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));row = sheet.getRow(7 + i);row.getCell(1).setCellValue(date.toString());row.getCell(2).setCellValue(businessData.getTurnover());row.getCell(3).setCellValue(businessData.getValidOrderCount());row.getCell(4).setCellValue(businessData.getOrderCompletionRate());row.getCell(5).setCellValue(businessData.getUnitPrice());row.getCell(6).setCellValue(businessData.getNewUsers());}//通过输出流将Excel文件下载到客户端浏览器ServletOutputStream out = response.getOutputStream();excel.write(out);in.close();out.close();excel.close();} catch (IOException e) {e.printStackTrace();}}

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

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

相关文章

知识管理系统(KMS):一文扫盲,能和chatGPT相融吗?

一、什么是KMS&#xff0c;有什么作用 KMS&#xff08;Knowledge Management System&#xff09;知识管理系统是一种用于组织、存储、共享和利用知识的软件系统或平台。它旨在帮助组织有效地管理和利用内部和外部的知识资源&#xff0c;以支持决策、创新和持续学习。 KMS知识管…

华为云CodeArts IDE For Python 快速使用指南

CodeArts IDE 带有 Python 扩展&#xff0c;为 Python 语言提供了广泛的支持。Python 扩展可以利用 CodeArts IDE 的代码补全、验证、调试和单元测试等特性&#xff0c;与多种 Python 解释器协同工作&#xff0c;轻松切换包括虚拟环境和 conda 环境的 Python 环境。本文简要概述…

数据治理——元数据管理实施步骤

一、元数据管理概述 1.1 数据管理面临的问题 数据治理的概念是对数据数据管理的管理&#xff0c;在数据管理的过程中遇到的问题有&#xff1a; 1.1.1 数据不可理解 海量数据&#xff0c;标准不统一&#xff0c;各系统、各部门对统一指标和概念的解释不一致&#xff0c;统计口…

python机器学习库中Scikit-learn和TensorFlow如何选择?

在Python机器学习库中&#xff0c;Scikit-learn和TensorFlow是两个非常流行的选择&#xff0c;但它们各自有不同的特点和适用场景。以下是根据搜索结果的一些考虑因素&#xff0c;帮助你做出选择&#xff1a; 1. 项目需求&#xff1a; 如果你的项目主要涉及传统的机器学习算…

OpenCV基本图像处理操作(三)——图像轮廓

轮廓 cv2.findContours(img,mode,method) mode:轮廓检索模式 RETR_EXTERNAL &#xff1a;只检索最外面的轮廓&#xff1b;RETR_LIST&#xff1a;检索所有的轮廓&#xff0c;并将其保存到一条链表当中&#xff1b;RETR_CCOMP&#xff1a;检索所有的轮廓&#xff0c;并将他们组…

魔方网表 存在 mailupdate.jsp接口 任意文件上传漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 魔方网表mailupdate.jsp接口存在任意文件上传漏洞 …

数据仓库—维度建模—事实表设计

事实表 事实表是数据仓库中的核心表,用于记录与业务过程相关的事实信息,是进行数据分析和挖掘的主要数据来源。 在ER模型中抽象出了有实体、关系、属性三种类别,在现实世界中,每一个操作型事件,基本都是发生在实体之间的,伴随着这种操作事件的发生,会产生可度量的值,…

ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写教程

原文链接&#xff1a;ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601506&idx2&sn5dae3fdc3e188e81b8a6142c5ab8c994&chksmfa820c85cdf58593356482880998fc6eb98e6889b261bf621e1d…

Git 实用技巧2——新建空白分支 | 重命名分支 | 回退到历史 commit

git version 2.39.2.windows 1. 新建空白分支 参考&#xff1a;Git - git-switch Documentation: https://git-scm.com/docs/git-switch/zh_HANS-CN 使用 --orphan 参数&#xff0c;创建一条不基于任何现有提交的空白分支。其初始提交&#xff08;即 HEAD&#xff09;不指向任…

箭头函数多个函数体

当箭头函数需要多个语句组成函数体时&#xff0c;需要使用花括号 {} 将多个语句包裹起来&#xff0c;并且需要显式地使用 return 关键字返回值。下面是一个包含多个函数体语句的箭头函数示例&#xff1a;‘ var greet name > { var greeting "Hello, "; …

了解在 Docker 和 Kubernetes 中运行Go程序的影响

根据 2021 年对 Go 开发人员的调查,使用 Go 编写服务是最常见的用途。同时,Kubernetes 是部署这些服务的最广泛使用的平台。了解在 Docker 和 Kubernets 中运行 Go 的含义非常重要,可防止出现 CPU 节流等常见情况。 GOMAXPROCS 变量定义了负责同时执行用户级代码的操作系统线…

python生成二维码

要在Python中生成二维码&#xff0c;可以使用第三方库qrcode。首先&#xff0c;确保已经安装了qrcode库&#xff1a; pip install qrcode然后&#xff0c;使用以下代码生成二维码&#xff1a; import qrcodedata "https://mp.csdn.net/mp_blog/creation/editor?spm100…

c++ std::map 介绍

在 C 中&#xff0c;字典通常指的是 std::map&#xff0c;它是一个关联容器&#xff0c;用于存储键-值对&#xff0c;并且按照键的顺序进行排序。除了 std::map&#xff0c;C 标准库还提供了其他一些类似字典的容器&#xff0c;比如 std::unordered_map&#xff08;无序字典&am…

Kafka服务端(含Zookeeper)一键自启软件

1. 前言 本文介绍了一款集成图形化界面配置和一键自启功能的Kafka与Zookeeper服务管理软件。该软件通过直观易用的图形界面&#xff0c;使用户能够轻松完成Kafka和Zookeeper的配置工作&#xff0c;有效避免了手动编辑配置文件可能带来的错误和不便。同时&#xff0c;软件还提供…

【附gpt4.0升级秘笈】百度智能云万源全新一代智能计算操作系统发布:引领AI新纪元

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;作为引领未来发展的关键技术&#xff0c;正逐步渗透到社会的每一个角落。百度&#xff0c;作为中国AI领域的领军企业&#xff0c;始终站在技术创新的前沿&#xff0c;不断推出引领行业的重磅产品。今日&…

SRTP + RTCP + SCTP

SRTP&#xff08;Secure Real-time Transport Protocol&#xff09; 主要功能&#xff1a;SRTP 是 RTP 的一个扩展&#xff0c;提供额外的安全特性&#xff0c;如加密、完整性校验和认证。它旨在保护实时传输的音频和视频流不被窃听或篡改。加密传输&#xff1a;SRTP 使用强加密…

论文略读:SWE-bench: Can Language Models Resolve Real-world Github Issues?

iclr 2024 oral reviewer评分 5668 现有的语言模型&#xff08;LMs&#xff09;的基准测试已经饱和&#xff0c;无法捕捉到最先进的语言模型能做什么和不能做什么的前沿。 ——>要具有挑战性的基准测试论文引入了SWE-bench 在现实软件工程环境中评估语言模型的基准测试 ​​…

使用 code-server 搭建在线的 VS Code 编辑器

文章目录 前言安装体验后记 前言 VS Code 是一个非常流行的代码编辑器&#xff0c;安装各种拓展下也可以当作全功能的IDE使用。VS Code本身是基于Web方案构建的&#xff0c;完全可以搭建服务器&#xff0c;然后通过浏览器访问。事实上官方就是这么设计的。现在打开任何一个Git…

(Talk-Bot,ichat助手,ChatK,DGAL,NextChat,FreeGPT,动点原版chatgpt)分享7个好用ChatGPT

目录 目录 1、Talk-Bot 2、ichat助手 3、ChatK 4、DGAI 5、NextChat 6、Chkzh-Aink

【数据分享】历次人口普查数据(一普到七普)

国之情&#xff0c;民之意&#xff0c;查人口&#xff0c;定大计。 第七次人口普查已经结束&#xff0c;那么&#xff0c;为了方便大家把七普数据与之前的数据做对比&#xff0c;地理遥感生态网整理了从一普到七普人口数据&#xff0c;并且把第七次人口普查的数据也一并分享给…