Easyexcel导入导出多个sheet

EasyExcel对于导入导出的操作十分简洁,记录一下多个sheet且内容不一致的导入导出。

引入 easyExcel依赖

    <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.1</version></dependency>
  1. 导出下载

提示:其中部分代码操作Dao层可以删除,可以自己创建ExportUserExcel 对象进行测试,思路数据映射到excel中。
这里ExportUserExcel .class 映射的模板替换下面代码中

@AllArgsConstructor
@NoArgsConstructorUser
@Builder
@HeadRowHeight(value = 20)
public class ExportUserExcel {@ExcelProperty(value = "姓名",index = 0)@ColumnWidth(value = 10)private String userName;@ExcelProperty(value = "年龄",index = 1)@ColumnWidth(value = 20)private String age;@ExcelProperty(value = "性别",index = 2)@ColumnWidth(value = 20)private String gender;
}
  1. 导出下载 ExportUserExcel.class 模板
 public void modelExport(HttpServletResponse response, Long id) {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码try {String fileName = URLEncoder.encode("Physical", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");//新建ExcelWriterExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();//获取sheet0对象WriteSheet mainSheet = EasyExcel.writerSheet(0, "模型信息").head(ExportUserExcel.class).build();//获取模型信息,向sheet0写入数据DmmPhysicalModel dmmPhysicalModel = dmmPhysicalModelMapper.selectById(id);List<DmmPhysicalModel> dmmPhysicalModels1 = Arrays.asList(dmmPhysicalModel);excelWriter.write(dmmPhysicalModels1, mainSheet);//获取sheet1对象WriteSheet detailSheet = EasyExcel.writerSheet(1, "词条信息").head(ExportUserExcel.class).build();HashMap entryHashMap = new HashMap<>();entryHashMap.put("model_id", id);//获取词条信息,向sheet1写入数据List<DmmPhysicalEntry> list = dmmPhysicalEntryMapper.selectByMap(entryHashMap);excelWriter.write(list, detailSheet);//关闭流excelWriter.finish();} catch (IOException e) {log.error("导出异常{}", e.getMessage());}}
  1. 导入excel 存入数据库,

    2.1 接收excel实体数据类
    

    注意:一定要和excel表标题内容一致 ,
    @ExcelProperty(value = “标题名称”)

/*** Copyright 2022 bejson.com */
package com.dtyunxi.yundt.cube.biz.item.svr.rest;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;/*** Auto-generated: 2022-07-20 14:18:43** @author bejson.com (i@bejson.com)* @website http://www.bejson.com/java2pojo/*/
@Data
public class ModelImportVO{@ExcelProperty(value = "标题名称")private String title;@ExcelProperty(value = "标题名称")private String merchant_no;@ExcelProperty(value = "标题名称")private String terminal_id;@ExcelProperty(value = "标题名称")private String token;}

这里很多博客的代码没有贴全,少了一个监视器读取excel的类!

package com.infinitus.dmm.service.impl;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.util.ArrayList;
import java.util.List;/*** excel表格读取监视器*/
public class ExcelListener extends AnalysisEventListener {//可以通过实例获取该值private List<Object> datas = new ArrayList<Object>();public void invoke(Object o, AnalysisContext analysisContext) {datas.add(o);doSomething(o);}private void doSomething(Object object) {}public List<Object> getDatas() {return datas;}public void setDatas(List<Object> datas) {this.datas = datas;}public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

2.excel导入到数据库 多个sheet、
ModelImportVO.class这也是模板,自己可以定义,对应的值。

 @PostMapping("test/excel/import")public void modelImport(MultipartFile serviceFile) throws IOException {//输入流InputStream inputStream = serviceFile.getInputStream();//监视器ExcelListener listener = new ExcelListener();ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();// 第一个sheet读取类型ReadSheet readSheet1 = EasyExcel.readSheet(0).head(ModelImportVO.class).build();// 第二个sheet读取类型ReadSheet readSheet2 = EasyExcel.readSheet(1).head(EntryImportVO.class).build();// 开始读取第一个sheetexcelReader.read(readSheet1);//excel sheet0 信息List<Object> list = listener.getDatas();//List<object> 转 List<实体类>List<JsonRootBean> dtoList = new ArrayList<>();//List object for 转换 实体类for (Object objects : list) {JsonRootBean dto = (JsonRootBean) objects;dtoList.add(dto);}//List 转JOSNString json = JSON.toJSONString(dtoList);System.out.println("json = " + json);// 清空之前的数据listener.getDatas().clear();// 开始读取第二个sheetexcelReader.read(readSheet2);//excel sheet1 信息List<Object> entry = listener.getDatas();//copy上面作法}

执行psotman接口请求
在这里插入图片描述

补充获取sheet名称 长度等信息方法
//获取从第二个sheet读取类型 词条多个sheet
//监视器
ExcelListener listener = new ExcelListener();
ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();
//弃用方法 List sheets = excelReader.getSheets();
// 新方法
List sheets = excelReader.excelExecutor().sheetList();

导入文件没有创建实例类模板

兼容任何标题的Excel

  //文件获取流InputStream inputStream = checkDTO.getFile().getInputStream();//excel监听器NoModelDataListener noModelDataListener = new NoModelDataListener(tableType);EasyExcel.read(inputStream, noModelDataListener).sheet().doRead();

数据统一在监听器进行插入更新

package io.sugo.cdp.upload.download.config;import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import io.sugo.cdp.upload.download.util.RegularUtils;
import lombok.Data;
import org.apache.commons.lang.StringUtils;import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;/*** easyExcel监听器* 不创建实体读取excel方式泛型用map:<Map<Integer, String>>** @author*/
@Data
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {/*** excel标题字段类型*/private List<String> excelType;/*** 统计对比错误次数*/private AtomicInteger rowCountError = new AtomicInteger();/*** 执行总条数*/private AtomicLong rowCount = new AtomicLong();/*** 返回错误信息的结果集*/List<String> results = new ArrayList<>();@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {//mapfor (Map.Entry<Integer, String> next : data.entrySet()) {String message = next.getValue();if (message != null) {message = message.replaceAll("[\\t\\n\\r]", "");}//正则检验每一列String result = RegularUtils.excelRegular(excelType.get(next.getKey()), message);if (StringUtils.isNotBlank(result)) {//返回前10条校验错误信息if (rowCountError.get() < 10) {long numberOfRows = rowCount.get() + 1L;String stringResult = "校验失败 - 第" + numberOfRows + "行:" +"(" + next.getValue() + ") " + result;String jsonString = JSON.toJSONString(stringResult);results.add(jsonString);rowCountError.incrementAndGet();}}}//统计总行数rowCount.incrementAndGet();}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {saveData();System.out.println("rowCount = " + rowCount.get());}/*** 加上存储数据库*/private void saveData() {}public NoModelDataListener(List<String> excelType) {this.excelType = excelType;}}
常用excel导入 数据转JSON 格式  快速构建工具代码  配合上面的监视器
package com.dtyunxi.yundt.cube.biz.item.svr.rest;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson.JSON;
import com.dtyunxi.yundt.cube.biz.item.svr.rest.ExcelListener;
import com.dtyunxi.yundt.cube.biz.item.svr.rest.ModelImportVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @author 瑾秋* @date 2022-08-05 9:56*/
@RestController
public class Test11 {@PostMapping("test/excel/import")public void modelImport(MultipartFile serviceFile) throws IOException {//输入流InputStream inputStream = serviceFile.getInputStream();//监视器ExcelListener listener = new ExcelListener();ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();// 第一个sheet读取类型ReadSheet readSheet1 = EasyExcel.readSheet(0).head(ModelImportVO.class).build();// 开始读取第一个sheetexcelReader.read(readSheet1);//excel sheet0 信息List<Object> list = listener.getDatas();//List<object> 转 List<实体类>List<ModelImportVO> dtoList = new ArrayList<>();//List object for 转换 实体类for (Object objects : list) {ModelImportVO dto = (ModelImportVO) objects;dtoList.add(dto);}List<ModelImportVO> ten = new ArrayList<>();//每个二十个输出一次for (ModelImportVO modelImportVO : dtoList) {if (ten.size() == 20) {System.out.println( JSON.toJSONString(ten));ten.clear();}ten.add(modelImportVO);}//最后不足二十输出一次System.out.println(JSON.toJSONString(ten));}}

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

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

相关文章

EasyExcel实现Excel文件多sheet导入导出

一、概述 最近公司需要做一个需求&#xff0c;通过excel上传病例信息&#xff0c;并将病例信息进行归档和整理&#xff1b;该需求可以简化为excel模板下载和excel上传并解析归档。既然知道需求了&#xff0c;找excel的操作工具jar包吧&#xff0c;发现以前常用的poi需要写的代…

导入导出excel表格EasyExcel操作

一、添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.3</version> </dependency>二、创建实体类 /*** 创建User类,用于构建向Excel表格中写数据的类型;* ExcelPropert…

EasyExcel的导入导出使用

1、说明 EasyExcel是阿里出的一款基于Java的、快速、简洁、解决大文件内存溢出的处理Excel的开源工具&#xff0c;本文主要是使用这个工具对Excel导入导出进行讲解。 官网&#xff1a; https://easyexcel.opensource.alibaba.com/github&#xff1a; https://github.com/alib…

EasyExcel实现execl导入导出

引言 在实际开发中&#xff0c;处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库&#xff0c;提供了简单易用的 API&#xff0c;可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能&#xff0c;以及一些相关的技巧和注…

导入Excel---post提交通用版

前端界面 通过点击导入弹出一个文本框下载导入的模板 直接进入代码实现环节: 前端部分添加导入按钮: <a href"javascript:;" class"btn btn-primary radius professional_btn">导入</a> 导入的文本框 //导入 $(".professional_btn&qu…

EasyExcel实现Excel文件导入导出

1 EasyExcel简介 EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址: https://github.com/alibaba/easyexcel 官方文档: https://www.yuque.com/easyexcel/doc/easyexcel B站视频: https://www.bilib…

导出Excel表格(调用后端接口方式)

在开发中我们会遇到导出Excel表格的需求&#xff0c;但是导出分为前端生成和后端生成。 前端生成的方式CSDN其他小伙伴已经做出了很多教程&#xff0c;是依赖 xlsx插件。 但是&#xff0c;今天我讲的是&#xff0c;调用后端接口的方式生成Excel表格。 1.调用后端提供的导出接口…

如何快速构建网站chatgpt插件

在本文中&#xff0c;我们将一步一步地探索并构建一个名为"AI Prompt Testing"的项目。该项目是一个网站插件&#xff0c;旨在帮助网站生成一个ChatGPT提示测试题&#xff0c;以巩固当前网页的内容。 1、抽象提取 这个网站chatgpt插件大概的效果&#xff0c;类比的…

【ChatGPT】ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。

ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。 更新了 4 月 25 日,集成自治代理 AI 部分。 图片来源:作者,Midjourney。 目录 ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。…

伟大的创造不是计划出来的!来自OpenAI科学家的反直觉建议

来源 | 中国企业家杂志 每天几乎从一睁眼&#xff0c;我们的工作与生活都会被大大小小的目标所牵引。 诚然&#xff0c;若只想实现一些普普通通的小愿望&#xff0c;那么目标导向会非常有效。但对于那些与探索创造、创新发明有关的愿望&#xff0c;目标还有效吗&#xff1f; 近…

GitHub放大招!CEO现场挑战18分钟开发小游戏,人还在台上网友已经玩到了

梦晨 明敏 发自 凹非寺量子位 | 公众号 QbitAI GitHub CEO&#xff0c;直播AI写代码&#xff0c;挑战18分钟完成一个小游戏。 结果只用了不到15分钟&#xff0c;直接成功在线部署&#xff0c;这边人还在讲台上&#xff0c;全球网友已经能玩上了。 整个项目从一片空白的新建文件…

字节跳动副总裁谢欣:未来组织的30条思考

上一篇&#xff1a;支付系统就该这么设计&#xff0c;稳的一批&#xff01;&#xff01; 透明、共享是是创造愉悦工作环境、吸引牛人的前提&#xff0c;是弹性组织有效运作的根基&#xff0c;是未来组织的基石。 来源 | 华麓之音 01 组织升级&#xff1a; 员工需要被激发&#…

用ChatGPT实际沟通的结果[有图有真相]

笔者因为没有办法正常注册账号&#xff0c;所以使用的是试用版的chatgpt&#xff0c;语言模型当下试用版的是Chatgpt3.5的模型&#xff0c;而不是商用版的ChatGPT-4的模型。 首先问AI对单词词汇的含义的理解。 回答的很得体&#xff0c; 然后问对职业的区分&#xff0c;这些我都…

CnOpenData·A股上市公司标准数据

一、数据简介 按照《中华人民共和国标准化法》的定义&#xff0c;标准是指农业、工业、服务业以及社会事业等领域需要统一的技术要求。标准作为一种通用性的规范语言&#xff0c;在合理利用国家资源、保障产品质量、提高市场信任度、促进商品流通、维护公平竞争、保障安全等方面…

ChatGPT炒股:批量下载北交所上市公司的招股说明书

打开北京证券交易所官网&#xff0c;点击发行上市&#xff0c;然后点击公开发行信息披露&#xff0c;然后在查询框里面输入关键词&#xff1a;在北京证券交易所上市招股说明书&#xff0c;然后选择时间&#xff0c;点击查询&#xff0c;就可以看到所有北交所上市公司的招股说明…

万兴科技WondershareFilmora焕新上线已率先接入ChatGPT母公司OpenAI相关服务

AIGC加速布局&#xff01;近日&#xff0c;创意软件A股上市公司万兴科技&#xff08;300624.SZ&#xff09;旗下视频创意软件Wondershare Filmora焕新上线&#xff0c;新版本全新接入ChatGPT母公司OpenAI相关服务&#xff0c;率先在视频创作领域集成AIGC新技术。另据介绍&#…

巴比特 | 元宇宙每日必读:多家上市公司宣布将ChatGPT与虚拟数字人融合,是蹭概念,还是真未来?...

摘要&#xff1a;据财联社星矿数据统计&#xff0c;截至目前&#xff0c;A股中包括元隆雅图、风语筑、天娱数科等17家上市公司公布称&#xff0c;相关业务已经接入类似ChatGPT技术&#xff0c;或正在研究相关技术与数字人结合的应用场景。多位业内人士表示&#xff0c;接入Chat…

ChatGPT 回答什么是敏捷测试

Jenkins 官方文档&#xff1a;https://jenkins.io/doc/JUnit 插件文档&#xff1a;JUnit | Jenkins pluginTestNG 插件文档&#xff1a;https://plugins.jenkins.io/testng-plugin/Jenkins 教程&#xff1a;https://jenkins.io/doc/tutorials/JUnit 教程&#xff1a;JUnit 5 Us…

chatGPT回答如何使用axios?

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;可以用于浏览器和 node.js 中。 要使用 Axios&#xff0c;首先需要在项目中安装它&#xff1a; npm install axios然后&#xff0c;可以在你的代码中引入 Axios&#xff1a; const axios require(axios);或者&#xf…

面试题总结

1.js的数据类型 分为基本数据类型和引用数据类型。 基本数据类型 ES5的5种&#xff1a;Null&#xff0c;undefined&#xff0c;Boolean&#xff0c;Number&#xff0c;String&#xff0c; ES6新增&#xff1a;Symbol表示独一无二的值 ES10新增&#xff1a;BigInt 表示任意大的…