actual combat 6——Excel表格的导入和导出

总结:

  1. 导出:写操作,将数据库中的内容写入到excel表格中。
  2. 导入:读操作,将excel表格中的内容出来,插入到数据库中,一般都是先将excel表格中的内容使用流,读到集合(list)中,然后再对集合进行遍历插入。

一. easyExcel

1. 写(导出)

(1)pom依赖
<!--导入依赖-->
<dependencies>
    <!--fastjson-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version >1.2.62</version>
    </dependency>
    <!--easyexcel-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version >2.2.0-beta2</version>
    </dependency>
    <!--日期格式化工具-->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10.1</version>
    </dependency>
    <!--test-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
</dependencies>
(2)实体类(模板类)

字段上加注解就行:
@ExcelProperty("表中字段名")
@ExcelIgnore:要忽略的字段。

(3)业务层进行写操作
EasyExcel.write(文件名, 模板类.class).sheet("表名").doWrite(list集合);

2. 读(导入)

(1)监听器
// 1.继承AnalysisEventListener
public class DemoDataListener extends AnalysisEventListener<DemoData> {
	// 2.一行一行的读取内容(list集合),但是不读表头。
	@Override
	public void invoke(DemoData data, AnalysisContext context) {
		//一般在这里进行导入集合操作(在项目中,一般所有业务操作,都在这个方法中进行)
	}
	// 3.读表头内容
	@Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    	//将表头信息导入集合(实际中不需要)
    }
    // 4.所有都读取完了,执行这个方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
    	//一般在这里进行插入数据库操作(当然这只是我个人认为的,在尚医通项目和在线教育项目中,这个项目都是空的,插入数据库的操作在invoke()方法中进行。而且invokeHeadMap方法也用不到,因为不需要读取表头信息,读取时导入,数据库中有字段(表头),不需要再导)
    	//狂神讲的课中用到了这个方法,可以具体去看一下他的笔记
    }
}
(2)读
//EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
EasyExcel.read(文件名, 模板类.class, 监听器对象).sheet().doRead();

更多详细信息,可以看尚医通的笔记(语雀)。
https://www.yuque.com/docs/share/3df0e6c8-54d4-4b4c-9c2b-dc188e47345c?# 《EasyExcel》

二. POI-Excel

与EasyExcel相比,这个要难得多,比如:没有注解的使用,要导入表头部分需要手动导入。但是可以对POI-Excel进行封装,例如若依项目,就是对POI-Excel做了封装,让POI-Excel也可以使用注解,用法难度也不高,很。。可恶,被他装到了。但是我认为,还是使用EasyExcel简单方便一些(毕竟是阿里的)。
如果要问若依项目是如何对poi-excel进行封装的,那就是反射机制。不得不说封装的真大啊!
下面是若依如何获取表头的代码:

    /**
     * 获取字段注解信息
     */
    public List<Object[]> getFields()
    {
        List<Object[]> fields = new ArrayList<Object[]>();
        List<Field> tempFields = new ArrayList<>();
        tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
        tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
        for (Field field : tempFields)
        {
            // 单注解
            if (field.isAnnotationPresent(Excel.class))
            {
                Excel attr = field.getAnnotation(Excel.class);
                if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
                {
                    field.setAccessible(true);
                    fields.add(new Object[] { field, attr });
                }
            }

            // 多注解
            if (field.isAnnotationPresent(Excels.class))
            {
                Excels attrs = field.getAnnotation(Excels.class);
                Excel[] excels = attrs.value();
                for (Excel attr : excels)
                {
                    if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
                    {
                        field.setAccessible(true);
                        fields.add(new Object[] { field, attr });
                    }
                }
            }
        }
        return fields;
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值