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导入可以分为几步

  1. 上传excel文件
  2. 将excel转换为数据,有需要的数据进行转换

2 使用

2.1 ExcelImport工具类

首先实例化ExcelImport工具类,我这里提供了一个构造函数

public ExcelImport(Class<T> clazz, List<CellParam> cellParams)
复制代码
参数含义
clazzClass对象(需要转换为Bean的Class对象)
cellParamsCellParam的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);
    }
}
复制代码

项目位置:github.com/rainbowda/u…,有需要的可以看看

一个将excel文件导入到SQLServer表的程序 一 双击Input.exe运行程序,将弹出一个窗口,这时请你在"数据库名"后面的 输入栏输入数据库名(如果是千方百剂就是输入帐套名).你如果没对数 据库的登录进行特殊修改的话,那"用户名和密码"就没必要修改了. 二 填好以上输入框后,真接单击"连接数据库",如果连接成功,将弹出"数据库 连接成功,你现在可以导入数据"的对话框,你按"OK"后将弹出新的一个数据 导入的窗口. 三 在这个窗口上单击"打开EXCEL文件"按钮,然后选择你要导入Excel文件, 按打开(这时如果你数据比较多的话你可能要多等一会儿时间),之后就弹 出一个让你选择Excel工作区的窗口,你可以在下拉框选择你数据所在的 Excel工作区了.选完以后按确定,你可以看到你Excel里的数据已经在"Excel 数据信息"里面了.而且还可以看到多了一列"不导入"的选项了.你如果哪一行 的数据不导入的话你可以打勾,这一行将不被导入. 四 做完以上三步后,请在"表名"后面的下拉框选择你所要导入的表的名称. 选完后,你得到"数据转换信息如下"这一栏配置数据转换的对应关系. 五 双击Excel字段处从下拉框选择excel的列,双击表字段处从下拉框选 择SQL表的列,然后看这列是否是"关键字",是的话打勾,不是不打勾.选择 完第一行后,就按方向键的向下键,继续第二行的选择,直到配置完Excel列 和表字段的对应关系为止. 六 按"导入数据"按钮系统会自动将页面转到"转换信息"这一页面.你将可以看 到第几行导入成功,或第几行导入失改的信息.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值