当前位置:网站首页>六.实战——Excel表格的导入和导出
六.实战——Excel表格的导入和导出
2022-07-21 00:37:00 【这不比博人传燃?】
总结:
- 导出:写操作,将数据库中的内容写入到excel表格中。
- 导入:读操作,将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;
}
边栏推荐
猜你喜欢
随机推荐
Use the esp32 download tool to burn firmware for esp32
视频4413.8 区域卷积神经网络(R-CNN)系列 13.5多尺度目标检测&13.6目标检测数据集
Incomplete printing of fluent | print and Dio
STM32F103 LED flashing program realized by four methods
Be diligent in sharing foreign lead tasks
Raspberry pie 3B builds Flink cluster
掌握 Dowanward API 的妙用,轻松拿捏 kubernetes 环境变量
C语言并行程序编程(一)
[BJDCTF2020]EasySearch-1
Homeland defense | technical guide for whole stack IOT irrigation system
In the available fields list of s/4hana extended fields, what should I do if I can't see the extended fields I created
Codeblocks的安装与配置
Baize_foc esp32无刷电机驱动错误问题记录贴
Colon usage video 41 13.3 Target detection and bounding box QA 13.4 anchor box
@The difference between document annotation and Lombok
聊聊Redis内存优化的7个神技
Mobilevit: challenge the end-to-side overlord of mobilenet
动态内存管理
C form controls can be referenced in other classes
Summary of the most complete MySQL data types in history (Part 2)