java excel处理-easyExcel easyExc

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

easyExcel

导入依赖(easyexcel依赖中已经有poi的依赖)

1
2
3
4
5
xml复制代码<dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>easyexcel</artifactId>
           <version>2.1.6</version>
       </dependency>

字段实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
typescript复制代码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;
  }
}

指定列的前后顺序

1
2
3
4
5
6
ini复制代码@ExcelProperty(value = "姓名",index = 1)
   private String string;
   @ExcelProperty(value = "日期",index = 2)
   private Date date;
   @ExcelProperty(value = "学号",index = 0)
   private int aDouble;

如果指定列写入,那么忽略的列就会空出来

复杂头

1
2
3
4
5
6
kotlin复制代码@ExcelProperty({"主标题", "字符串标题"})
   private String string;
   @ExcelProperty({"主标题", "日期标题"})
   private Date date;
   @ExcelProperty({"主标题", "数字标题"})
   private int aDouble;

image.png

写入

将数据写入list

1
2
3
4
5
6
7
8
9
10
11
12
ini复制代码   //写入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

1
2
3
4
5
6
7
csharp复制代码 //将list写入excel
  @Test
  public void write(){
      //   第一个参数为路径,第二个参数为标题的实体类
//         然后写入木板,再将执行list方法
      EasyExcel.write(PATH+"easy.xlsx",excel.class).sheet("模板").doWrite(data());
  }

image.png

指定列写入

set用来存储需要忽略的列名,add指定忽略的列,列明为字段名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vbnet复制代码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());
  */ }

忽略学号

image.png

注意点,如果指定了列的顺序,那么指定列写入就会使其他的列空着

image.png

写入图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ini复制代码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();
  }

image.png

读取

监听器

读取exccel数据,需要一个监听器用于判断
每次读取100条数据就进行保存操作,由于每次读都是新new UserInfoDataListener的,所以这个list不会存在线程安全问题.
读取到的数据会变成JSON字符串打印出来,放入list中,判断list存的数据是否超过限度,超过就存入数据库并将list清空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
csharp复制代码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中的数据是否存入数据库

1
2
3
4
5
csharp复制代码@Test
   public void read(){
       
       EasyExcel.read(PATH+"easy.xlsx",excel.class,new UserInfoDataListener()).sheet().doRead();
  }

image.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%