使用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 环境。本文简要概述…

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接口存在任意文件上传漏洞 …

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

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

python生成二维码

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

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

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

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

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

论文略读: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…

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

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

RISC-V微架构验证

对于RISC-V处理器因其灵活性和可扩展性而受到广泛关注&#xff0c;但如果没有高效验证策略&#xff0c;错误的设计实现可能会影响RISC-V的继续推广。 在RISC-V出现之前&#xff0c;对于大多数半导体公司来说&#xff0c;处理器验证几乎成为一门屠龙之技。专业知识被浓缩到少数几…

文献速递:深度学习肝脏肿瘤诊断---基于深度学习的表型分类重新划分联合肝细胞胆管癌

Title 题目 Deep learning-based phenotyping reclassifies combined hepatocellular cholangiocarcinoma 基于深度学习的表型分类重新划分联合肝细胞胆管癌 01文献速递介绍 Primary liver cancer arises either from hepatocytic or biliary lineage cells, giving rise to…

2024中国内燃机展-北京汽车发动机零部件展

2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会&#xff08;简称“动博会”&#xff09;将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…

通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 粒子群优化算法 (PSO) 4.2 反向学习粒子群优化算法 (OPSO) 4.3 多策略改进反向学习粒子群优化算法 (MSO-PSO) 5.完整程序 1.程序功能描述 分别对比PSO,反向学习PSO,多策略改进反向学…

为数据穿上安全的外衣——零售电商场景下的数据安全体系建设

在电子商务交易过程中&#xff0c;会涉及大量的个人和财务数据的传输和处理&#xff0c;随着电子商务的发展&#xff0c;数据安全风险也成为一个备受关注的问题。 而跨境电商&#xff0c;属于出海业务&#xff0c;涉及到海外不同国家的政策法规&#xff0c;且数据作为电商的业…

Linux内核之aligned用法实例(四十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

微信小程序生成链接或二维码的对比

二维码 1.小程序样式码 获取参数直接options.xxx&#xff08;参数名&#xff09; 方法&#xff1a;微信公众平台 》工具》生成小程序二维码&#xff1b; 样式图&#xff1a;就一看就是小程序的二维码&#xff1b; 2.正方形二维码/链接 方法&#xff1a;微信公众平台》开…

5-pytorch-torch.nn.Sequential()快速搭建神经网络

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言torch.nn.Sequential()快速搭建网络法1 生成数据2 快速搭建网络3 训练、输出结果 总结 前言 本文内容还是基于4-pytorch前馈网络简单&#xff08;分类&#xf…

Go 编译构建的一些细节

Go 编译构建的一些细节 发现自己竟然没有怎么认真研究过 go 的编译构建命令。 结论前置 go run 专门用来运行命令源码文件的命令&#xff0c;一般用来运行单个文件go build 主要是用于测试编译。编译某个包或者项目&#xff0c;在当前目录下生成可执行文件go install 编译并…