excel导入工具
1 介绍
excel导入工具
整个项目的代码结构如下
\---excelExport # 导出工具包
| AsyncExportExcel.java #多线程导出
| ExcelImport.java # 导出工具类
|
+---data
| BaseParam.java # 基础导出参数类
|
+---dataConversion
| DataExportConversion.java # 属性导出转换接口
|
+---defaultDataHandle # 默认的数据处理
| AbstractDataHandler.java
| BooleanDataHandler.java
| DataHandlerFactory.java
| DateDataHandler.java
| StringDataHandler.java
|
\---style # 默认的样式
AbstractCellStyle.java
DefaultDataCellStyle.java
DefaultTitleCellStyle.java
com
\---utils
+---demo # 案例相关
| | ExcelImportApplication.java # springboot启动类
| |
| +---bean
| | DemoBean.java # 测试bean
| |
| +---controller
| | ExcelImportController.java # 测试从web导入excel和从文件导入excel
| |
| \---importParam
| | DemoImportParam.java # 导入参数
| |
| \---dataConversion
| HobbyConversion.java # 爱好属性导入转换类
|
\---excelImport # 导入工具包
| ExcelImport.java # 导入工具类
|
+---data
| CellParam.java # 导入列参数类
|
\---dataConversion
| DataImportConversion.java # 属性导入转换接口
|
\---impl
DateConversion.java # 日期属性导入转换接口
MapConversion.java # 键值对属性导入转换接口
简单的来说excel导入可以分为几步
- 上传excel文件
- 将excel转换为数据,有需要的数据进行转换
2 使用
2.1 ExcelImport工具类
首先实例化ExcelImport工具类,我这里提供了一个构造函数
public ExcelImport(Class<T> clazz, List<CellParam> cellParams)
| 参数 | 含义 |
|---|---|
| clazz | Class对象(需要转换为Bean的Class对象) |
| cellParams | CellParam的list列表(每一列对应的字段及数据转换类) |
实例化ExcelImport工具类之后,需要调用importExcel方法,方法定义如下
public List<T> importExcel(InputStream is)
只需要传入InputStream即可。
2.2 导入列参数类CellParam
CellParam类代码如下
public class CellParam {
private String fieldName;
private DataImportConversion conversion;
//Set Get Constructor
}
2.2.1 属性
可以看到CellParam类有两个属性
private String fieldName;
private DataImportConversion conversion;
| 参数 | 含义 |
|---|---|
| fieldName | 列对应Bean的属性 |
| conversion | 数据转换类 |
2.3 数据转换接口DataImportConversion
public interface DataImportConversion<T> {
T transferData(Object data);
}
我这里默认提供了两种数据转换,一个是键值对,另一个是日期
2.3.1 键值对数据转换
键值对数据转换类是为了将一些通用数据转换而提供的。
例如:男女、是否和一些不同名称对应的不同数字(正常-->0,异常-->1,其他-->2)
使用者可以通过传入的map的泛型决定返回值的类型。
public class MapConversion<K,V> implements DataImportConversion<V> {
private Map<K,V> map ;
private V defaultReturnValue;
public MapConversion(Map<K, V> map) {
this(map,null);
}
public MapConversion(Map<K, V> map,V defaultReturnValue) {
this.map = map;
this.defaultReturnValue = defaultReturnValue;
}
@Override
public V transferData(Object data) {
if (map == null) return null;
//如果data为null且map的null对应的值不为null,则直接返回map中null对应的值
if (data == null && map.get(null) != null){
return map.get(null);
}
//循环查找对应的key
for (Map.Entry<K,V> entry:map.entrySet()){
if (entry.getKey() != null && entry.getKey().equals(data)){
return entry.getValue();
}
}
//如果map里面找不到对应的数据,则返回defaultReturnValue
return defaultReturnValue;
}
}
2.3.2 日期数据转换
提供日期转换功能,通过传入的日期转换格式进行转换。
public class DateConversion implements DataImportConversion<Date> {
private SimpleDateFormat format;
public DateConversion(String pattern) {
this.format = new SimpleDateFormat(pattern);
}
@Override
public Date transferData(Object data) {
try {
return format.parse(data.toString());
} catch (Exception e){
e.printStackTrace();
}
return null;
}
}
3 案例
3.1 场景
原始数据如下
| 姓名 | 性别 | 出生日期 | 爱好 |
|---|---|---|---|
| 尘心 | 女 | 2018-08-08 14:59:11 | 舞刀,弄枪 |
| 千月 | 男 | 2018-08-08 14:59:11 | 唱歌,跳舞 |
需要转换为实体bean的列表,如下
DemoBean{name='尘心', sex=0, birthday=Wed Aug 08 14:13:45 CST 2018, hobbies=[舞刀, 弄枪]}
DemoBean{name='千月', sex=1, birthday=Wed Aug 08 14:13:45 CST 2018, hobbies=[唱歌, 跳舞]}
实体类如下
public class DemoBean {
//姓名
private String name;
//性别,0->女,1->男
private Integer sex;
//出生日期
private Date birthday;
//爱好
private List<String> hobbies;
//Set Get
}
3.2 数据转换
可以看到有三个属性需要转换,分别是性别、日期和爱好。性别和日期的数据转换可以使用默认的数据转换。爱好需要将字符串根据,分割并转换为list列表数据,下面是爱好的数据转换,
public class HobbyConversion implements DataImportConversion<List<String>> {
@Override
public List<String> transferData(Object data) {
if (data == null) return null;
//根据,分割字符串
String hobbyStr = data.toString();
String[] hobbyArray = hobbyStr.split(",");
//转换成list
List<String> hobbies = Arrays.asList(hobbyArray);
return hobbies;
}
}
3.3 导入参数类
数据转换类写好了之后,开始编写导入参数类,代码如下
public class DemoImportParam {
public static List<CellParam> getCellParams(){
Map<String,Integer> sexMap = new HashMap<>();
sexMap.put("女",0);
sexMap.put("男",1);
List<CellParam> cellParams = new ArrayList<>();
cellParams.add(new CellParam("name"));
cellParams.add(new CellParam("sex", new MapConversion(sexMap)));
cellParams.add(new CellParam("birthday", new DateConversion("yyyy-MM-dd HH:mm:ss")));
cellParams.add(new CellParam("hobbies", new HobbyConversion()));
return cellParams;
}
}
在DemoImportParam类中可以看到一个静态方法getCellParams,返回List。方法内部先定义了一个mao对象,存放性别字符串对应的数字,然后就是List的定义。
可以看到总共有4个列参数
- 第一列标题名称为姓名,对应的属性名称为name
- 第二列标题名称为性别,对应的属性名称为sex,数据转换对象MapConversion
- 第三列标题名称为出生日期,对应的属性名称为birthday,日期转换
- 第四列标题名称为爱好,对应的属性名称为hobbies,数据转换对象HobbyConversion
3.4 导出
接下来有两种数据导出方式,一种是url访问弹出下载excel文件,另外一种是导出excel到文件
3.4.1 从web导入excel
@ResponseBody
@PostMapping("/import")
public List<DemoBean> importByWeb(MultipartFile file) throws Exception {
ExcelImport excelImport = new ExcelImport(DemoBean.class, DemoImportParam.getCellParams());
List<DemoBean> list = excelImport.importExcel(file.getInputStream());
return list;
}
3.4.2 从文件导入excel
@Test
public void importByFile() throws Exception {
File file = new File("F:\\导出demo.xlsx");
FileInputStream inputStream = new FileInputStream(file);
//导入转换
ExcelImport excelImport = new ExcelImport(DemoBean.class, DemoImportParam.getCellParams());
List<DemoBean> list = excelImport.importExcel(inputStream);
//输出
for (DemoBean bean:list){
System.out.println(bean);
}
}
项目位置:https://github.com/rainbowda/utils/tree/master/excel_import,有需要的可以看看
excel导入工具的更多相关文章
- Excel导入工具类
项目需要从Excel导入数据,然后插入到数据库对应表中.设计了一个导入工具类,导入数据和导入结果如下图示: poi jar版本采用的3.15 导入工具类实现如下: package com.alphaj ...
- Excel导入工具类兼容xls和xlsx
package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import or ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Octopus——excel导入导出工具
Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...
- java中excel导入\导出工具类
1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...
- java简易excel导入导出工具(封装POI)
Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...
- Java基础学习总结(49)——Excel导入导出工具类
在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...
- Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java 版权声明:本 ...
- JXLS (Excel导入、导出工具使用)
JXLS (Excel导入.导出工具使用) 1:简介: jxls是一个简单的.轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局.java中成熟的excel导出工具有p ...
随机推荐
- BZOJ5341: [Ctsc2018]暴力写挂
BZOJ5341: [Ctsc2018]暴力写挂 https://lydsy.com/JudgeOnline/problem.php?id=5341 分析: 学习边分治. 感觉边分治在多数情况下都能用 ...
- Redis Sentinel(哨兵)主从高可用方案
环境搭建 三台服务器: 192.168.126.100(master) 192.168.126.110(slaver) 192.168.126.120(slaver) 拷贝192.168.126.10 ...
- 【转】LTE基本架构
这篇文章主要介绍LTE的最基础的架构,包括LTE网络的构成,每一个网络实体的作用以及LTE网络协议栈,最后还包括对一个LTE数据流的模型的说明. LTE网络参考模型 这是一张非常有名的LTE架构图,从 ...
- Thread之四:java线程返回结果的方法
两种方式:一种继承Thread类实现:一种通过实现Callable接口. 第一种方法: 因为实现Thread类的run方法自身是没有返回值的,所以不能直接获得线程的执行结果,但是可以通过在run方法里 ...
- 【转】bootstrap模态框(modal)使用remote方法加载数据,只能加载一次的解决办法
http://blog.csdn.net/coolcaosj/article/details/38369787 bootstrap的modal中,有一个remote选项,可以动态加载页面到modal- ...
- Oracle 多表查询(2)
四.统计函数及分组查询 1.统计函数 在之前学习过一个COUNT()函数,此函数的功能可以统计出表中的数据量,实际上这个就是一个统计函数,而常用的统计函数有如下几个: COUNT():查询表中的数据记 ...
- select *和select 全部
select *和select 全部字段 在查询上效果是一样的,速度也是一样的. 不过理论上来说select *反而会快点. 因为 1.select 全部字段在数据传输上消耗会更多,如果几百个字段这个 ...
- Python代码规范总结
1.缩进问题: Tip:用4个空格来缩进代码 不要用Tab键或者是Tab和空格混用, vim用户可以将tab键设置为4个空格的长度.要么选择垂直对齐换行的元素, 或者是使用4空格悬挂式缩进(第一行没有 ...
- docker 安装mysql 使用navicat访问 解决
1. 下载Mysql的Docker镜像: 2. 运行镜像,设置root账号初始密码(123456),映射本地宿主机端口3306到Docker端口3306.测试过程没有挂载本地数据盘: 3. 查看已运行 ...
- App启动原理和启动过程
一.程序启动原理 1.1.main函数中执行了一个UIApplicationMain这个函数UIApplicationMain(int argc, char *argv[], NSString ...