本文章仅讲述使用过程和代码情况,具体组件的学习请自行查阅。
一、easyexcel的使用流程,核心步骤三个:
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(() -> {return data();});
1、创建工作簿EasyExcel.write(fileName, DemoData.class);2、创建工作表EasyExcel.write(fileName, DemoData.class).sheet("模板");3、执行读or写操作EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(() -> {return data();});
二、项目实现
1、新建一个空项目
2、新建一个maven module
3、往pom.xml文件中导入项目依赖,这里由于使用了maven管理依赖,一定程度上避免了依赖冲突的发生。
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.27</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.27</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel-core</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.27</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.27</version>
</dependency>
</dependencies>
4、resources目录下写配置文件applicationContext.xml,jdbc.properties,mybatis.xml
<!-- applicationcontext 文件的作用主要是 用于加载配置文件以及配置创建管理bean -->
<!--把数据库的配置信息写在独立的文件,便于修改数据库的配置内容-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--声明数据源dataSource,作用连接数据库-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--声明是mybatis中提供的sqlsession-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="configLocation" value="classpath:mybatis.xml"/>
</bean>
<!--创建dao对象使用SQL session的getmapper 在内部调用getmapeer生成每个到接口的代理对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="org.example.testee2mybatis.dao"/>
</bean>
<!--声明service class是自己包内service接口的实现类-->
<bean id="demodataService" class="org.a.b..Impl">
<property name="demoDAO" ref="demoDAO"/>
</bean>
</beans>
-----jdbc.properties内容 * 自己的内容
jdbc.url=jdbc:mysql://localhost:3306/*?serverTimezone=UTC
jdbc.username=*
jdbc.password=*
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="myenv"><!--default值为一个env的id-->
<environment id="myenv">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/*"/>
<property name="username" value="*"/>
<property name="password" value="*"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/*/*/DemoDAO.xml"/>
<!--一个mapper标签指定一个sql映射文件
路径从类路径开始classes
-->
</mappers>
</configuration>
<!--mybatis的主配置文件:定义了数据库连接信息,sql映射文件位置信息。-->
5、项目结构
6、代码内容
---------------DemoDAO文件内容
@Service
public interface DemoDAO {
//保存数据到数据库的方法
int save(DemoData demoData);
}
---------------DemoDAO.xml内容
<mapper namespace="org.*.*.*.DemoDAO">
<insert id="save">
insert into user values (#{id},#{name},#{birthday},#{sex},#{email})
</insert>
</mapper>
----------------DemoData
public class DemoData {
/**
* 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
*/
@ExcelProperty("id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("生日")
@DateTimeFormat("yyyy-MM-dd")
private Date birthday;
@ExcelProperty("性别")
private String sex;
@ExcelProperty("邮箱")
private String email;
}
-----------------DemoDataListener
public class DemoDataListener extends AnalysisEventListener<DemoData> {
/**
* 每隔10条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 10;
List<DemoData> list = new ArrayList<>();
/**
* 这个每一条数据解析都会来调用
*/
@Override
public void invoke(DemoData data, AnalysisContext context) {
System.out.println("解析到一条数据:"+data);
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
//读取数据入库
saveData();
//读取数据 写入到新的excel
write2Excel();
// 存储完成清理 list
list.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
System.out.println("所有数据解析完成!");
}
/**
* 加上存储数据库
*/
private void saveData() {
String config = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
ExcelService demodataService = (ExcelService) ac.getBean("demodataService");
System.out.println("{}条数据,开始存储数据库!"+ list.size());
for (DemoData demoData : list) {
System.out.println("list里的:"+demoData);
demodataService.addUser(demoData);
}
System.out.println("存储数据库成功!");
}
//读取excel的数据写入到excel中去
public void write2Excel(){
String path = "D:*";
System.out.println("{}条数据,开始写入excel!"+ list.size());
String fileName = path + "easytest1.xlsx";
EasyExcel.write(fileName, org.example.testee2mybatis.dto.DemoData.class)
.sheet("模板")
.doWrite(() -> {
// 分页查询数据
return list;
});
System.out.println("存储数据库成功!");
}
}
-----------------------------ExeclService
public interface ExcelService {
int addUser(DemoData demoData);
}
---------------------------ExeclServiceImpl
public class ExcelServiceImpl implements ExcelService {
private DemoDAO demoDAO;
public void setDemoDAO(DemoDAO demoDAO) {
this.demoDAO = demoDAO;
}
@Override
public int addUser(DemoData demoData) {
int nums = demoDAO.save(demoData);
return nums;
}
}
--------------------------------测试类
public class Readtest {
@Test
public void readTest() {
String fileName ="C:*.xlsx";
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}
}
7、建表语句
CREATE TABLE `user` (
`id` int(11) NOT null,
`name` varchar(11) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`sex` varchar(3) DEFAULT NULL,
`email` varchar(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
祝顺利