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,有需要的可以看看
 关注公众号
关注公众号
					低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 
							
								
								    上一篇
								      Java 面向对象 之 代码块http://www.verejava.com/?id=16992781354342 /** 知识点: 代码块 1. 普通代码块 2. 构造代码块 3. 静态代码块 */ public class CodeBlock { //写在构造方法里的叫 构造代码块 public CodeBlock() { System.out.println("CodeBlock 初始化"); } //写在 static 块里的叫 静态代码块 static { System.out.println("static 执行"); } public static void main(String[] args) { //写在方法里的叫 普通代码块 System.out.println("hello"); new CodeBlock(); } } /** 注意: 静态代码块是在程序编译期运行 所以静态代码块会在构造方法前调用 */ http://www.verejava.com/?id=16992781354342 
- 
							
								
								    下一篇
								      GO------小白之并发聊天室因为没有写客户端、可以在cmd中利用 nc -u 来充当客户端 广播用户上线: 1、主go程中创建socket、defer 2、循环监听客户端连接请求 3、有一个客户端链接、创建新go程处理客户数据 4、组织用户相关信息、全局变量(结构体、map、channel) 5、Hadlconn、初始化新用户结构体信息、获取客户端IP和port、初始化新用户结构体信息、 name==addr 6、创建manager管理go程、要在for循环accpet之前、实现manager、初始化在线用户map.循环读取全局的channel、如果无数据阻塞、如果有数据遍历在线用户 map、将数据写到用户的channel中 7、新用户添加到map中、key==ip+port value==结构体 8、创建WriteToClient go程专门给当前用户发送消息、遍历自带C、读数据、Conn.Write写到客户端 9、Hadlconn中。结束位置、组织用户上线信息、将用户上线信息写到... 
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 面试大杂烩
- Red5直播服务器,属于Java语言的直播服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL表碎片整理

 
			 
				 
				 
				 
				 
				 
				 
				



 微信收款码
微信收款码 支付宝收款码
支付宝收款码