这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战」
easyExcel
导入依赖(easyexcel依赖中已经有poi的依赖)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
复制代码
字段实体类
public class excel {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private int aDouble;
public excel() {
}
public excel(String string, Date date, int aDouble) {
this.string = string;
this.date = date;
this.aDouble = aDouble;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int getaDouble() {
return aDouble;
}
public void setaDouble(int aDouble) {
this.aDouble = aDouble;
}
}
复制代码
指定列的前后顺序
@ExcelProperty(value = "姓名",index = 1)
private String string;
@ExcelProperty(value = "日期",index = 2)
private Date date;
@ExcelProperty(value = "学号",index = 0)
private int aDouble;
复制代码
如果指定列写入,那么忽略的列就会空出来
复杂头
@ExcelProperty({"主标题", "字符串标题"})
private String string;
@ExcelProperty({"主标题", "日期标题"})
private Date date;
@ExcelProperty({"主标题", "数字标题"})
private int aDouble;
复制代码
写入
将数据写入list
//写入list
private List<excel> data(){
List< excel > excels = new ArrayList<>();
for(int i = 0;i < 10; i++){
excel e = new excel();
e.setaDouble(i);
e.setString("yzy");
e.setDate(new Date());
excels.add(e);
}
return excels;
}
复制代码
简单的写入方法
list写入excel
//将list写入excel
@Test
public void write(){
// 第一个参数为路径,第二个参数为标题的实体类
// 然后写入木板,再将执行list方法
EasyExcel.write(PATH+"easy.xlsx",excel.class).sheet("模板").doWrite(data());
}
复制代码
指定列写入
set用来存储需要忽略的列名,add指定忽略的列,列明为字段名
public void daochuzhidinglie(){
/*忽略到导出的列*/
Set<String> set = new HashSet<>();
set.add("aDouble");
//过滤写入
EasyExcel.write(PATH+"导出指定列1.xlsx",excel.class).excludeColumnFiledNames(set).sheet("1").doWrite(data());
/*指定要导出的列*/
/*//set用来存储需要忽略的列名
Set<String> set1 = new HashSet<>();
set1.add("date");
set1.add("string");
//过滤写入
EasyExcel.write(PATH+"导出指定列1.xlsx",excel.class).includeColumnFiledNames(set1).sheet("指定学号名称").doWrite(data());
*/ }
复制代码
忽略学号
注意点,如果指定了列的顺序,那么指定列写入就会使其他的列空着
写入图片
public void pic() throws Exception {
//InputStream inputStream = null;
ArrayList< excel > excels = new ArrayList<>();
excel excel = new excel();
//图片路径
String picPath = PATH+"1.jpg";
/*五种类型的图片*/
excel.setBytes(FileUtils.readFileToByteArray(new File(picPath)));
//excel.setFile(new File(picPath));
//excel.setPic(picPath);
//inputStream = FileUtils.openInputStream(new File(picPath));
//excel.setUrl(new URL(""));
excels.add(excel);
EasyExcel.write(PATH+"pic.xlsx",excel.class).sheet().doWrite(excels);
//inputStream.close();
}
复制代码
读取
监听器
读取exccel数据,需要一个监听器用于判断
每次读取100条数据就进行保存操作,由于每次读都是新new UserInfoDataListener的,所以这个list不会存在线程安全问题.
读取到的数据会变成JSON字符串打印出来,放入list中,判断list存的数据是否超过限度,超过就存入数据库并将list清空
public class UserInfoDataListener extends AnalysisEventListener<excel> {
private static final int BATCH_COUNT = 100;
List<excel> list = new ArrayList<>();
@Override
//excel 类型
//AnalysisContext 分析上下文
public void invoke(excel data, AnalysisContext analysisContext) {
System.out.println("解析到一条数据:{}"+ JSON.toJSONString(data));
list.add(data);
if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
System.out.println("所有数据解析完成!");
}
//写入数据库的业务
private void saveData() {
System.out.println("{}条数据,开始存储数据库!" +list.size());
//userService.save(list);
System.out.println("存储数据库成功!");
}
}
复制代码
读取方法: read的第三个参数是监听器用于判断list中的数据是否存入数据库
@Test
public void read(){
EasyExcel.read(PATH+"easy.xlsx",excel.class,new UserInfoDataListener()).sheet().doRead();
}
复制代码
近期评论