Java-Excel导⼊导出通⽤实现Demo(附源码Git地址)在使⽤过程中如果有不懂的地⽅,请随时在项⽬issue中提问,我会在最短的时间内答复。 如果有好的建议也⼗分希望不吝赐教。
⽬录
讲道理,建议结合源码看,源码地址介绍的⽐这⾥简单多了,光看这篇⽂章。。。我⾃⼰都不想看!
导语
bigdecimal转换为integer⽤户上传⼀个表格⽂件的时候,⼤部分表格中主要包含两类信息,⼀类我称之为散数据,如:定义在表格开头的 有效开始时间 或者 作者等,另⼀类我称之为核⼼数据,也就是该表格中的主要数据。
对于获取表格数据的想法是这样:
散数据 通过⾏列参数获取
核⼼数据 通过表格逐⾏遍历获取,并且⽤⼀个List<T> 装起来。
可能⾯临的问题:
1. ⽤户不按照规定的模板写⽂件,还上传!搞个屁,不按照模板还要我处理,处理⽑线啊!!!
2. 不按照模板处理也分为两种,⼀种是数据出现的位置,也就是模板的第⼀⾏第⼆列应该写⼊作者名字,但是⽤户偏偏把名字写在了第100⾏第1000列??还有⼈性吗? WTF!! 反正我没法搞定。还有⼀种稍微⼈性化⼀点的问题,数据格式不正确,数据重复验证,多列数据组合重复验证,数据能否为空等,像这样⼈性化⼀点的问题,我也将尝试着⼲⼀下。
3. 如果⽤户上传的⽂件中存在明显或者不明显的错误数据,如何告诉⽤户?
最后再⽤⼏句话总结⼀下,这个⼯具到底想⼲嘛:
1 - 将⽂件流转换成POI可以处理的对象格式
2 - 处理的时候,把核⼼数据取出来放到预定义的对象中
3 - 在转换过程中对可能出现的⼈性化的错误进⾏收集
4 - 对于散数据,提供⼀个⽅法,参数为⾏列值即可返回相应值,⾄于怎么处理由开发者⾃⼰根据业务需求决定。
5 - 将收集到的每⼀⾏的错误信息重写到表格⽂件中,并将得到的⽂件进⾏存储(计划使⽤Redis),提供给⽤户下载说这么多空话,我们来开始⼲吧。
哦对了,POI我不做介绍了吧,还不了解的百度⼀下就⾏啦。
开始了。
第⼀步创建项⽬
创建项⽬不⽤教程吧。项⽬结构?帖⼦最后会贴上源码地址。
我⽤的是IntelliJ Idea,新建项⽬
File -> New Project -> Spring Iniyializr ->Project SDK 1.8 -> ......
名字什么的⾃⼰起了,我创建的是⼀个SpringBoot Web项⽬,因为最后要通过接⼝从前端获取⽂件流。
创建完成之后再在启动类的同⽬录下新建⼏个⽂件夹,结构就是如图所⽰
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.poi</groupId>
<artifactId>excel-deal</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>excel-deal</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--start basic-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--end basic-->
<!--start core-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!--end core-->
<!--start tool-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!--end tool-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第⼆步引⼊POI依赖(第⼀步中是所有的依赖)
<dependencies>中添加poi的依赖⽤于⽀持表格⽂件的读取和操作
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
第三步开始撸代码
后边由于内容⽐较多,细节也⽐较多,所以⼤多数需要注意的地⽅我会在代码中⽤备注的形式提⽰,其实逻辑都很简单,如果想了解细节,只需要跟着代码⾛⼀遍就清楚了。
3.1 创建类ExcelImportObject,⽤于定义在转换过程中需要预定义的各类参数。
package ldeal.util;
import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 关于涉及到表格⾏列的属性,统⼀都是从1开始计数
* </p>
*
* @author zhangxianwen
* @since 2018/12/20 15:39
*/
@Data
public class ExcelImportObject<T extends ExcelModelRequest> {
/
**
* 待转换的⽂件流byte
*/
byte[] fileInputStream;
/**
* 转换成功结果List[该结果仅仅是对数据在进⾏表格到对象之间的转换时成功的条数]
*/
private List<T> successList = new ArrayList<>();
/**
* 转换失败结果List[该结果仅仅是对数据在进⾏表格到对象之间的转换时失败的条数]
*/
private List<T> failedList = new ArrayList<>();
/**
* ⽆论该⾏数据转换失败与否均写⼊到该List
*/
private List<T> resultList = new ArrayList<>();
/**
* 最终校验成功可⽤于导⼊的List对象
*/
private List<T> importList = new ArrayList<>();
/**
* 单元格是否允许有空值
* 默认不允许
*/
private Boolean notNullCell = true;
/**
* 从第⼏⾏开始读取[序号] 为空时,若标注了标题⾏,则⿐癌提⾏下⼀⾏为开始读取的⾏,否则从⾸⾏ * 注意:在选取⾏的时候请选择主要数据开始的⾏,不包含标题以及其他备注信息
*/
private Integer firstRowNum;
/**
* 第⼏⾏结束读取[序号],选填
* 当该参数为空时,默认读取到整个表格没有数据的⼀⾏
*/
private Integer lastRowNum;
/**
* ⾸列[从1开始计数]
*/
private Integer firstCellNum;
/**
* 操作的列数
*/
private Integer cellCount;
/**
* 标题⾏[从0开始计数] 默认为操作开始⾏的前⼀⾏
*/
private Integer titleRowNum;
/**
* 验证成功条数[该结果仅仅是对数据在进⾏表格到对象之间的转换时成功的条数]
*/
private int successCount = 0;
/**
* 验证失败条数[该结果仅仅是对数据在进⾏表格到对象之间的转换时失败的条数]
*/
private int failedCount = 0;
/**
* 需要验证重复数据的列序号如: new Integer[]{1,2,3}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论