使用poi实现excel导入导出
开始准备工作,需要使用到的工具类放到了最后
1、pom文件添加依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version> </dependency> <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version> </dependency> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version> </dependency>
2、 先实现导出
编写导出的实体类
你要导出那些字段就写那些字段 案例如下:
@Data @HeadRowHeight(value = 35) @ContentRowHeight(value = 25) public class Student_export implements Serializable {@ExcelProperty({"学生信息","编号"})private Integer id;@ExcelProperty({"学生信息","姓名"})private String name;@ExcelProperty({"学生信息","年龄"})private String age;@ExcelProperty({"学生信息","性别"})private String sex;@ExcelProperty({"学生信息","手机号"})private String phone;@ExcelProperty({"学生信息","QQ"})private String QQ;@ExcelProperty({"学生信息","微信"})private String weixin;@ExcelProperty({"学生信息","咨询员id"})private String netpusherId;@ExcelIgnoreprivate String stuStatus;@ExcelProperty({"学生信息","状态"})private String stuStatusName;public String getStuStatusName() {if("1".equals(this.stuStatus)){return stuStatus = "已录入未分配" ;} else if("2".equals(this.stuStatus)){return stuStatus = "已分配咨询师" ;}else if("3".equals(this.stuStatus)){return stuStatus = "正在跟踪" ;}else if("4".equals(this.stuStatus)){return stuStatus = "跟踪结束(已缴费)" ;}else if("5".equals(this.stuStatus)){return stuStatus = "跟踪结束(失败)" ;}return stuStatus;}@ExcelProperty({"学生信息","咨询员姓名"})private String createUser;@ExcelProperty({"学生信息","咨询师id"})private String askerId;@ExcelProperty({"学生信息","咨询师姓名"})private String ziXunName;@ExcelProperty({"学生信息","创建时间"})private String createTime;@ExcelIgnoreprivate String isPay;@ExcelProperty({"学生信息","是否付款"})private String isPayName;public String getIsPayName(){if ("0".equals(this.isPay)){return isPay = "未付款";}else if ("1".equals(this.isPay)){return isPay = "已付款";}return isPay;}@ExcelProperty({"学生信息","付款时间"})private String payTime;@ExcelProperty({"学生信息","付款金额"})private String money;
实现导出核心实现代码:
public void exportMember(HttpServletResponse response, Students students){//全查需要导出的数据 List<Student_export> list = studentsService.exportStudent(students);//执行导出 student_demo是导出的文件名 students是excel文件的下方的sheet名称 ExcelUtil.export(response,"student_demo","students",list,Student_export.class); }
实现导入
导入和导出同理,先根据导入文件那些内容,书写实体类 案例如下:
@Data @HeadRowHeight(value = 35) @ContentRowHeight(value = 25) public class Student_import implements Serializable {@ExcelProperty({"学生信息","编号"})private Integer id;@ExcelProperty({"学生信息","姓名"})private String name;@ExcelProperty({"学生信息","年龄"})private String age;@ExcelProperty({"学生信息","性别"})private String sex;@ExcelProperty({"学生信息","手机号"})private String phone;@ExcelProperty({"学生信息","QQ"})private String QQ;@ExcelProperty({"学生信息","微信"})private String weixin;}
实现导入核心实现代码:
public Map<String,Object> importMember(MultipartFile file,Integer netpusherId,String createUser){List<Student_import> importList = ExcelUtil.importExcel(file, Student_import.class,null);System.out.println("读取完成");// 复制集合:把improtList 复制到 一个新的集合List<Students> studentsList = ObjectConversion.copy(importList,Students.class);//执行保存for (Students s:studentsList){s.setNetpusherId(netpusherId);s.setCreateUser(createUser);}Boolean rsl= studentsService.saveBatch(studentsList);Map<String, Object> rslmap = new HashMap<>();rslmap.put("code", rsl ? "0" : "1");rslmap.put("msg", rsl ? "导入成功" : "导入失败");return rslmap;}
使用到的工具类
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;/*** excel工具类* 使用的是alibaba的easyExcel*/
public class ExcelUtil {/*** 写出一个 excel 文件到本地* <br />* 将类型所有加了 @ExcelProperty 注解的属性全部写出** @param fileName 文件名 不要后缀* @param sheetName sheet名* @param data 写出的数据* @param clazz 要写出数据类的Class类型对象* @param <T> 写出的数据类型*/public static <T> void writeExcel(String fileName, String sheetName, List<T> data, Class<T> clazz) {writeExcel(null, fileName, sheetName, data, clazz);}/*** 按照指定的属性名进行写出 一个 excel** @param attrName 指定的属性名 必须与数据类型的属性名一致* @param fileName 文件名 不要后缀* @param sheetName sheet名* @param data 要写出的数据* @param clazz 要写出数据类的Class类型对象* @param <T> 要写出的数据类型*/public static <T> void writeExcel(Set<String> attrName, String fileName, String sheetName, List<T> data, Class<T> clazz) {fileName = StringUtils.isBlank(fileName) ? "学生管理系统" : fileName;sheetName = StringUtils.isBlank(sheetName) ? "sheet0" : sheetName;try (FileOutputStream fos = new FileOutputStream(fileName)) {write(fos, attrName, sheetName, data, clazz);} catch (Exception exception) {exception.printStackTrace();}}/*** 读取 指定格式的 excel文档** @param fileName 文件名* @param clazz 数据类型的class对象* @param <T> 数据类型* @return*/public static <T> List<T> readExcel(String fileName, Class<T> clazz) {return readExcel(fileName, clazz, null);}/*** 读取 指定格式的 excel文档* 注意一旦传入自定义监听器,则返回的list为空,数据需要在自定义监听器里面获取** @param fileName 文件名* @param clazz 数据类型的class对象* @param readListener 自定义监听器* @param <T> 数据类型* @return*/public static <T> List<T> readExcel(String fileName, Class<T> clazz, ReadListener<T> readListener) {try (FileInputStream fis = new FileInputStream(fileName)) {return read(fis, clazz, readListener);} catch (Exception exception) {exception.printStackTrace();}return null;}/*** 导出 一个 excel* 导出excel所有数据** @param response* @param fileName 件名 最好为英文,不要后缀名* @param sheetName sheet名* @param data 要写出的数据* @param clazz 要写出数据类的Class类型对象* @param <T> 要写出的数据类型*/public static <T> void export(HttpServletResponse response, String fileName, String sheetName, List<T> data, Class<T> clazz) {export(response, null, fileName, sheetName, data, clazz);}/*** 按照指定的属性名进行写出 一个 excel** @param response* @param attrName 指定的属性名 必须与数据类型的属性名一致* @param fileName 文件名 最好为英文,不要后缀名* @param sheetName sheet名* @param data 要写出的数据* @param clazz 要写出数据类的Class类型对象* @param <T> 要写出的数据类型*/public static <T> void export(HttpServletResponse response, Set<String> attrName, String fileName, String sheetName, List<T> data, Class<T> clazz) {fileName = StringUtils.isBlank(fileName) ? "student-system-manager" : fileName;sheetName = StringUtils.isBlank(sheetName) ? "sheet0" : sheetName;response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setCharacterEncoding("utf-8");response.addHeader("Content-disposition", "attachment;filename=" + fileName + ExcelTypeEnum.XLSX.getValue());try (OutputStream os = response.getOutputStream()) {write(os, attrName, sheetName, data, clazz);} catch (IOException e) {e.printStackTrace();}}/*** 接收一个excel文件,并且进行解析* 注意一旦传入自定义监听器,则返回的list为空,数据需要在自定义监听器里面获取** @param multipartFile excel文件* @param clazz 数据类型的class对象* @param readListener 监听器* @param <T>* @return*/public static <T> List<T> importExcel(MultipartFile multipartFile, Class<T> clazz, ReadListener<T> readListener) {try (InputStream inputStream = multipartFile.getInputStream()) {return read(inputStream, clazz, readListener);} catch (IOException e) {e.printStackTrace();}return null;}private static <T> void write(OutputStream os, Set<String> attrName, String sheetName, List<T> data, Class<T> clazz) {ExcelWriterBuilder write = EasyExcel.write(os, clazz);// 如果没有指定要写出那些属性数据,则写出全部if (!CollectionUtils.isEmpty(attrName)) {write.includeColumnFiledNames(attrName);}write.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet(sheetName).doWrite(data);}private static <T> List<T> read(InputStream in, Class<T> clazz, ReadListener<T> readListener) {List<T> list = new ArrayList<>();Optional<ReadListener> optional = Optional.ofNullable(readListener);EasyExcel.read(in, clazz, optional.orElse(new AnalysisEventListener<T>() {@Overridepublic void invoke(T data, AnalysisContext context) {list.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("解析完成");}})).sheet().doRead();return list;}}
一般导入导出还会有一个下载模板,原因是:如果不根据模板来书写数据,上传文件的花,肯定是有问题的,
所以使用这个方法一定要固定一个模板,模板可以选择放在oss上,也可以放在前端代码的静态文件下
使用poi实现excel导入导出相关推荐
- Java poi 实现excel导入导出工具类
最近项目上又要大量的涉及excel导入导出,网上各种导入导出的方式层出不穷,我是比较青睐官方的poi,但是要自己去操作工作簿对象自己一行一行的读取,会有很多的重复代码,重复劳动,也极为不美观,基于合成 ...
- POI之excel导入导出
下载地址http://poi.apache.org/ <dependency><groupId>org.apache.poi</groupId><artifa ...
- poi实现Excel导入导出依赖
<!--文件上传组件--><dependency><groupId>commons-fileupload</groupId><artifactId ...
- SpringBoot集成文件 - 集成POI之Excel导入导出
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!
在我们平时工作中经常会遇到要操作Excel的功能,比如导出个用户信息或者订单信息的Excel报表.你肯定听说过POI这个东西,可以实现.但是POI实现的API确实很麻烦,它需要写那种逐行解析的代码(类 ...
- 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出
由于 poi 本身只是针对于 excel 等office软件的一个工具包,在一些常规的 excel 导入导出时,还需要再做一次精简的封装,简化代码耦合. 一.现状 本人经历过几家公司的代码封装,导入导 ...
- excel 导入导出使用poi自定义注解
excel导入导出使用poi自定义注解 最近在做一个数据导入导出的模块 在网上找了一些例子 在这里整理一下 这里就不再贴原作者的地址 (以下代码来自网上非原创 稍作简单修改) 首先引入pom.xm ...
- Java POI Excel导入导出
Java POI Excel导入导出 1.maven引入依赖 2.导入Excel 3.导出Excel 1.maven引入依赖 <!-- POI Excel 操作 --> <depen ...
最新文章
- 大粤桂谋定发展-丰收节交易会·林裕豪:从玉农业协作项目
- Bigo 实时计算平台建设实践
- JBoss AS 7类加载说明
- java去掉字符串中前后空格函数_Java去除字符串中的空格
- 开发 Windows 8 Bing地图应用(2)
- Oracle 给字符串补空格、补0
- 前台性能和服务器性能是什么,前端性能优化指南[2]--什么是Web性能?
- 百度贴吧 “只看某人” 小工具
- mysql报1665_mysql错误处理之ERROR 1665 (HY000)_MySQL
- java 编写浏览器_用Java自己写一个浏览器 —— JavaFX 入门
- iOS逆向 和班尼特福迪一起攻克难关(unity)
- 桌面的快捷方式图标异常
- 1308:【例1.5】高精除
- 乐客巴巴集团年会于2021年1月17日在广州举行
- 双十一买什么充电宝好?实惠好用的充电宝推荐
- Kali Linux 安装教程和使用技巧
- 计算机组成原理与体系结构 - 6分
- Android软键盘使用
- STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(3):Cortex-M3指令描述
- hive 正则表达式-regexp