【在线教育】EasyExcel入门(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: EasyExcel入门

1.5 复杂操作


1.5.1 复合表头


packagecom.czxy.zx.demo02;
importcom.alibaba.excel.annotation.ExcelProperty;
importcom.alibaba.excel.annotation.format.DateTimeFormat;
importcom.alibaba.excel.annotation.write.style.ColumnWidth;
importcom.alibaba.excel.annotation.write.style.ContentRowHeight;
importcom.alibaba.excel.annotation.write.style.HeadRowHeight;
importlombok.Data;
importjava.util.Date;
/*** @author 桐叔* @email liangtong@itcast.cn*/@Data@ContentRowHeight(20)
@HeadRowHeight(20)  //行高@ColumnWidth(25)    //列宽publicclassStudent2 {
@ExcelProperty("编号")
privateStringid;
@ExcelProperty({"基本信息","姓名"})   //复制表头privateStringname;
@ExcelProperty({"基本信息","年龄"})
privateIntegerage;
@ExcelProperty("电话")
privateStringtelephone;
@ExcelProperty("邮箱")
privateStringemail;
@ExcelProperty("生日")
@DateTimeFormat("yyyy年MM月dd日")
privateDatebrithday;
}

1.5.2 写操作:多表


packagecom.czxy.zx.demo02;
importcom.alibaba.excel.EasyExcel;
importcom.alibaba.excel.ExcelWriter;
importcom.alibaba.excel.write.metadata.WriteSheet;
importcom.czxy.zx.demo01.Student;
importorg.junit.Test;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;
/*** @author 桐叔* @email liangtong@itcast.cn*/publicclassTestExcel2 {
/*** 获得根路径* @return*/publicStringgetPath() {
returnthis.getClass().getResource("/").getPath();
    }
/*** 准备数据* @return*/privateList<Student2>getData(Integerflag){
List<Student2>list=newArrayList<Student2>();
for(intm=0 ; m<10 ; m++){
Stringi=""+flag+m ;
Student2student=newStudent2();
student.setId("stu"+i);
student.setName("wang"+i);
student.setAge( 18 );
student.setTelephone("1361234"+i);
student.setEmail("wang"+i+"@czxy.com");
student.setBrithday(newDate());
list.add(student);
        }
returnlist;
    }
@TestpublicvoidtestMoreSheetWrite(){
Stringfile=getPath() +"student_demo2.xls";
ExcelWriterexcelWriter=EasyExcel.write(file).build();
for (inti=0; i<5; i++) {
WriteSheetwriteSheet=EasyExcel.writerSheet(i, "模板"+i).head(Student2.class).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<Student2>data=getData(i);
excelWriter.write(data, writeSheet);
        }
excelWriter.finish();
    }
}

1.5.3 读操作:多表


  • 具有缓存处理类
packagecom.czxy.zx.demo02;
importcom.alibaba.excel.context.AnalysisContext;
importcom.alibaba.excel.event.AnalysisEventListener;
importjava.util.ArrayList;
importjava.util.List;
/*** Created by liangtong.*/publicclassStudent2ListenerextendsAnalysisEventListener<Student2> {
// 批量操作数privatestaticfinalintBATCH_COUNT=10;
// 用于缓存信息privateList<Student2>cache=newArrayList<Student2>();
publicvoidinvoke(Student2student, AnalysisContextanalysisContext) {
//保存学生信息cache.add(student);
if(cache.size() >=BATCH_COUNT){
// 保存数据saveData();
        }
    }
publicvoiddoAfterAllAnalysed(AnalysisContextanalysisContext) {
//最后的不够 BATCH_COUNT 倍数saveData();
    }
privatevoidsaveData() {
// 集合不为空if(!cache.isEmpty()) {
// 处理缓存数据System.out.println(cache);
// 清空缓存cache.clear();
        }
    }
}
读操作@TestpublicvoidtestMoreRead(){
Stringfile=getPath() +"student_demo2.xls";
//EasyExcel.read(文件, 封装对象, 处理类).sheet("表").doRead();ExcelReaderexcelReader=EasyExcel.read(file, Student2.class, newStudent2Listener()).build();
// 确定需要解析的sheetfor (inti=0; i<5; i++) {
ReadSheetreadSheet=EasyExcel.readSheet("模板"+i).build();
excelReader.read(readSheet);
        }
excelReader.finish();
    }

1.6.4 写操作:多对象


Student@Data@NoArgsConstructor@AllArgsConstructorpublicclassStudent {
@ExcelProperty("姓名")
privateStringname;
@ExcelProperty("年龄")
privateIntegerage;
}
Book@Data@NoArgsConstructor@AllArgsConstructor@HeadRowHeight(50)
@HeadFontStyle(fontName="黑体",italic=BooleanEnum.TRUE, color=Font.COLOR_RED, underline=2)
publicclassBook {
@ExcelProperty("编号")
privateStringid;
@ExcelProperty({"作者信息","姓名"})
privateStringauthorName;
@ExcelProperty({"作者信息","年龄"})
privateIntegerauthorAge;
@ExcelProperty({"书籍基本信息","标题"})
privateStringtitle;
@ContentFontStyle(fontName="楷书",italic=BooleanEnum.TRUE, color=Font.COLOR_RED, underline=-1)
@ExcelProperty({"书籍基本信息","价格"})
privateDoubleprice;
@ExcelProperty({"书籍基本信息","出版日期"})
@DateTimeFormat("yyyy年MM月dd日")
privateDatepublishDate;
}
实现packagecom.czxy.zx.demo03;
importcom.alibaba.excel.EasyExcel;
importcom.alibaba.excel.ExcelWriter;
importcom.alibaba.excel.write.metadata.WriteSheet;
importcom.czxy.zx.demo01.Student;
importcom.czxy.zx.demo02.Book;
importorg.junit.Test;
importjava.util.*;
/*** @author 桐叔* @email liangtong@itcast.cn*/publicclassTestManyObject {
// 获得当前项目的运行时的根目录publicStringgetPath() {
returnthis.getClass().getResource("/").getPath();
    }
// 模拟数据publicList<Student>getStudentData() {
List<Student>list=newArrayList<>();
for (inti=0; i<20; i++) {
list.add(newStudent("张三"+i, 18+i));
        }
returnlist;
    }
publicList<Book>getBookData() {
List<Book>list=newArrayList<>();
for (inti=0; i<20; i++) {
list.add(newBook(i+"" , "张三"+i , 18+i, "坏蛋是怎么"+i, 998d+i, newDate()));
        }
returnlist;
    }
// 遍历map即可privateMap<Class<?>, List<?>>getData() {
Map<Class<?>, List<?>>map=newHashMap<>();
map.put(Student.class, getStudentData());
map.put(Book.class, getBookData());
returnmap;
    }
@TestpublicvoidtestManyObject() {
Stringfile=getPath() +"many_object.xlsx";
//1 开始写ExcelWriterexcelWriter=EasyExcel.write(file).build();
//2 依次写每一个对象for(Map.Entry<Class<?>, List<?>>entry : getData().entrySet()) {
Class<?>clazz=entry.getKey();            //类型List<?>data=entry.getValue();            //数据WriteSheetwriteSheet=EasyExcel.writerSheet(clazz.getSimpleName()).head(clazz).build();
excelWriter.write(data, writeSheet);
        }
//3 写完成excelWriter.finish();
    }
}

1.6 扩展:excel备份数据库


image.png

  • 步骤
  • 步骤1:添加坐标
  • 步骤2:编写封装类
  • 步骤3:编写核心类

image.png

步骤1:添加坐标<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.7</version></dependency></dependencies>步骤2:编写封装类packagecom.czxy.zx.demo03;
importcom.alibaba.excel.annotation.ExcelProperty;
importcom.alibaba.excel.annotation.write.style.ColumnWidth;
importcom.alibaba.excel.annotation.write.style.ContentRowHeight;
importcom.alibaba.excel.annotation.write.style.HeadRowHeight;
importlombok.Data;
importjava.util.Date;
importjava.util.List;
/*** 课程**/@Data@ContentRowHeight(20)
@HeadRowHeight(20)  //行高@ColumnWidth(25)    //列宽publicclassChapter {
@ExcelProperty("章节ID")
privateStringid;
@ExcelProperty("课程ID")
privateStringcourseId;
@ExcelProperty("章节名称")
privateStringtitle;
@ExcelProperty("显示排序")
privateIntegersort;
@ExcelProperty("创建时间")
privateDategmtCreate;
@ExcelProperty("更新时间")
privateDategmtModified;
}
packagecom.czxy.zx.demo03;
importcom.alibaba.excel.annotation.ExcelProperty;
importcom.alibaba.excel.annotation.format.DateTimeFormat;
importcom.alibaba.excel.annotation.write.style.ColumnWidth;
importcom.alibaba.excel.annotation.write.style.ContentRowHeight;
importcom.alibaba.excel.annotation.write.style.HeadRowHeight;
importlombok.Data;
importjava.util.Date;
/*** 课程**/@Data@ContentRowHeight(20)
@HeadRowHeight(20)  //行高@ColumnWidth(25)    //列宽publicclassCourse {
@ExcelProperty("课程ID")
privateStringid;
@ExcelProperty("课程讲师ID")
privateStringteacherId;
@ExcelProperty("课程专业ID二级分类ID")
privateStringsubjectId;
@ExcelProperty("一级分类ID")
privateStringsubjectParentId;
@ExcelProperty("课程标题")
privateStringtitle;
@ExcelProperty("课程销售价格,设置为0则可免费观看")
privateDoubleprice;
@ExcelProperty("总课时")
privateIntegerlessonNum;
@ExcelProperty("课程封面图片路径")
privateStringcover;
@ExcelProperty("销售数量")
privateLongbuyCount;
@ExcelProperty("浏览数量")
privateLongviewCount;
@ExcelProperty("乐观锁")
privateLongversion;
@ExcelProperty("视频状态 Draft未发布  Normal已发布")
privateStringstatus;
@ExcelProperty("创建时间")
@DateTimeFormat("yyyy年MM月dd日")
privateDategmtCreate;
@ExcelProperty("更新时间")
@DateTimeFormat("yyyy年MM月dd日")
privateDategmtModified;
}
步骤3:编写核心类packagecom.czxy.zx.demo03;
importcom.alibaba.excel.EasyExcel;
importcom.alibaba.excel.ExcelWriter;
importcom.alibaba.excel.write.metadata.WriteSheet;
importcom.czxy.zx.demo02.Student2;
importorg.apache.commons.dbutils.BasicRowProcessor;
importorg.apache.commons.dbutils.DbUtils;
importorg.apache.commons.dbutils.GenerousBeanProcessor;
importorg.apache.commons.dbutils.QueryRunner;
importorg.apache.commons.dbutils.handlers.BeanListHandler;
importorg.junit.Test;
importjava.sql.*;
importjava.util.*;
/*** @author 桐叔* @email liangtong@itcast.cn*/publicclassTestBackdb {
publicClassgetClassByTableName(StringtableName) {
Map<String,Class>map=newHashMap<>();
map.put("edu_chapter", Chapter.class);
map.put("edu_course", Course.class);
returnmap.get(tableName);
    }
publicStringgetPath() {
returnthis.getClass().getResource("/").getPath();
    }
publicConnectiongetConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
Stringurl="jdbc:mysql://127.0.0.1:3306/zx_edu_course?useUnicode=true&characterEncoding=utf8";
Stringusername="root";
Stringpassword="1234";
Propertiesprops=newProperties();
props.setProperty("user", username);
props.setProperty("password", password);
props.setProperty("remarks", "true");               //设置可以获取remarks信息props.setProperty("useInformationSchema", "true");  //设置可以获取tables remarks信息returnDriverManager.getConnection(url, props);
        } catch (Exceptione) {
thrownewRuntimeException(e);
        }
    }
@TestpublicvoidtestDB() throwsException {
Stringfile=getPath() +"db.xls";
QueryRunnerqueryRunner=newQueryRunner();
ExcelWriterexcelWriter=EasyExcel.write(file).build();
StringdbName="zx_edu_course";
//获得连接Connectionconn=getConnection();
//语句执行者Statementst=conn.createStatement();
//数据库的元数据DatabaseMetaDatadatabaseMetaData=conn.getMetaData();
//获得所有的数据库ResultSetcatalogResultSet=databaseMetaData.getCatalogs();
//遍历所有的数据库while(catalogResultSet.next()) {
//获得数据库的名称StringdatabaseName=catalogResultSet.getString(1);
if(dbName.equals(databaseName)) {
//使用数据库st.execute("use "+databaseName);
ResultSettableResultSet=databaseMetaData.getTables(databaseName, null, null, null);
//遍历所有的表名while(tableResultSet.next()) {
//表名StringtableName=tableResultSet.getString(3);             //TABLE_NAMEStringtableRemarks=tableResultSet.getString("REMARKS"); //获得表的备注// 通过表名获得excel处理类ClassexcelBeanClass=getClassByTableName(tableName);
if(excelBeanClass!=null) {
//获得当前表的所有数据Stringsql="select * from "+tableName;
//Listdata= (List) queryRunner.query(conn, sql, newBeanListHandler<>(excelBeanClass, newBasicRowProcessor(newGenerousBeanProcessor()) ));
// 创建sheetWriteSheetwriteSheet=EasyExcel.writerSheet(tableRemarks!=null?tableRemarks : tableName).head(excelBeanClass).build();
excelWriter.write(data, writeSheet);
                    }
                }
            }
        }
//写入完成excelWriter.finish();
    }
}


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
203 0
|
7月前
|
存储 物联网 大数据
Java+BS +saas云HIS系统源码SpringBoot+itext + POI + ureport2数字化医院系统源码
医院云HIS系统是一种运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它按照现代医疗卫生管理要求,在特定区域内以数字化形式收集、存储、传递和处理医疗卫生行业的数据。通过云HIS系统,可以实现区域内医疗卫生信息资源的集中统管、统一调配、按需服务,为居民、医疗机构、卫生管理机关和其他机构提供云服务。
84 1
|
7月前
|
Java 关系型数据库 MySQL
基于SpringBoot的冬奥会科普平台
基于SpringBoot的冬奥会科普平台
|
存储 NoSQL Oracle
SpringBoot资源整合——SpringData(课时十八)
SpringBoot资源整合——SpringData(课时十八)
117 0
|
数据可视化 Java API
谷粒学苑项目实战(三):整合Swagger2
前后端分离开发模式中,api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
143 0
谷粒学苑项目实战(三):整合Swagger2
|
JSON 前端开发 easyexcel
这年头谁还用POI,快来使用国人写的EasyExcel吧,SpringBoot+EasyExcel的快速入门
这年头谁还用POI,快来使用国人写的EasyExcel吧,SpringBoot+EasyExcel的快速入门
这年头谁还用POI,快来使用国人写的EasyExcel吧,SpringBoot+EasyExcel的快速入门
|
SQL Java API
SpringBoot快速掌握 - 核心技术|学习笔记
快速学习SpringBoot快速掌握 - 核心技术
SpringBoot快速掌握 - 核心技术|学习笔记
|
easyexcel Java Apache
|
前端开发 JavaScript Java
基于springboot的疫情网课教学平台
该系统基于springboot技术,采用Mysql数据库,选题新颖,页面美观,功能全面,数据库表结构适量,具有完整的业务逻辑,适合作为毕业设计、课程设计、数据库大作业。系统主要分为2个角色,分别为用户和管理员。
基于springboot的疫情网课教学平台
|
Java API Apache
下一篇
无影云桌面