EasyExcel的使用:入门到模板填充

这篇具有很好参考价值的文章主要介绍了EasyExcel的使用:入门到模板填充。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

EasyExcel

EasyExcel依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

EasyExcel相关网站

  • 官网:https://easyexcel.opensource.alibaba.com/
  • Github:https://github.com/alibaba/easyexcel
  • 3.0.5版本的JavaDoc:https://javadoc.io/doc/com.alibaba/easyexcel/3.0.5/index.html

EasyExcel简单读取Excel文件

前期准备

  • 准备Excel文件

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

  • 准备Excel文件对应的实体类:Student
    package com.study.easyexcel.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.Date;
    
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
      
      /**
       * id
       */
      private String id;
      
      /**
       * 学生姓名
       */
      private String name;
      
      /**
       * 学生出生日期
       */
      private Date birthday;
      
      /**
       * 学生性别
       */
      private String gender;
      
    }
    
    

编写代码-简单读取一个Excel中的Sheet的数据

  • 注意:在没有任何配置的情况下,Excel中的数据列顺序要与实体类的属性顺序保持一致

BasicRead-主代码

package com.study.easyexcel.basic;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;
import com.study.easyexcel.basic.listener.StudentListener;
import com.study.easyexcel.entity.Student;

import java.io.InputStream;


public class BasicRead {
  
  public static void main(String[] args) {
    //获取到要读取的Excel文件的输入流
    InputStream excelFileIs = BasicRead.class.getResourceAsStream("/excel/学员信息表.xlsx");
    
    //获取一个工作簿对象
    /*
     * @param inputStream:表示要读取的 Excel 文件的输入流。可以从文件、网络、数据库等地方获取。
     * @param head:表示要读取的 Excel 文件中的表头信息所对应的数据模型类型。可以是 Java 类型、Map 类型或 List 类型。
     * @param readListener:表示读取 Excel 文件时的数据监听器(ReadListener)实例,用于在读取过程中接收读取到的数据,并在读取过程中执行相应的操作。
     */
    ExcelReaderBuilder readWorkerBook = EasyExcel.read(excelFileIs, Student.class, new StudentListener());
    //获取一个工作簿对象
    ExcelReaderSheetBuilder sheet = readWorkerBook.sheet();
    //读取工作表中的内容
    sheet.doRead();
  }
  
}


StudentListener-继承了AnalysisEventListener的读监听类

package com.study.easyexcel.basic.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.study.easyexcel.entity.Student;


public class StudentListener extends AnalysisEventListener<Student> {
  
  /**
   * 在读取到 Excel 文件中的一行数据时会被调用
   *
   * @param data    读取到的一行数据,可以是 Java 对象、Map、List 等类型的数据
   * @param context 参数表示当前读取的上下文信息,包括当前 Sheet 页的信息、当前行号、表头行号等。
   */
  @Override
  public void invoke(Student data, AnalysisContext context) {
    //获取上下文信息
    ReadRowHolder readRowHolder = context.readRowHolder();
    Integer rowIndex = readRowHolder.getRowIndex();
    System.out.println("读取到了第 " + rowIndex + " 行数据 --> " + data);
    
  }
  
  /**
   * 在读取 Excel 文件完成后会被调用
   *
   * @param context 表示当前读取的上下文信息,包括当前 Sheet 页的信息、总行数等。
   */
  @Override
  public void doAfterAllAnalysed(AnalysisContext context) {
    System.out.println("读取完毕!");
  }
  
}

读取效果

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

EasyExcel简单写入Excel文件-默认样式

编写代码:BasicWrite

package com.study.easyexcel.basic;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.study.easyexcel.entity.Student;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class BasicWrite {
  
  public static void main(String[] args) {
    //设置输出的Excel文件的存储路径
    String savePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel\\学员信息表-Write.xlsx";
    //构建一个写的工作簿对象
    //如果写入的文件不存在,则会自动创建
    ExcelWriterBuilder write = EasyExcel.write(savePath, Student.class);
    //工作表对象
    ExcelWriterSheetBuilder sheet = write.sheet();
    //向工作表写入数据
    sheet.doWrite(getStudentList());
  }
  
  /**
   * 随机获取10个Student数据
   */
  private static List<Student> getStudentList() {
    List<Student> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
      list.add(new Student(
          String.valueOf((int) (Math.random() * 1000_0000) + 1000_0000),
          "张" + i,
          new Date((long) (System.currentTimeMillis() + Math.random() * 10_0000)),
          Math.random() < 0.5 ? "男" : "女"
      ));
    }
    return list;
  }
  
}

查看生成的Excel数据

  • 可以发现,默认情况下,使用的列名是属性名,且列宽也不适应数据

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

EasyExcel简单写入Excel文件-自定义样式(列名、行宽)

  • 在写入Excel文件时,可以使用EasyExcel提供的注解对列名、列顺序、行高、列宽等进行设置
  • 写入Excel的代码还是编写代码:BasicWrite类中的数据,只需要调整实体类的注解即可

修改实体类Student,添加相应的注解

package com.study.easyexcel.entity;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;


@Data
@AllArgsConstructor
@NoArgsConstructor

public class Student {
  
  /**
   * id
   */
  @ExcelProperty(value = "学生Id", index = 0)//设置列名和列顺序
  @ColumnWidth(value = 10)//设置列宽
  private String id;
  
  /**
   * 学生姓名
   */
  @ExcelProperty(value = "学生姓名", index = 1)
  @ColumnWidth(value = 15)
  private String name;
  
  /**
   * 学生出生日期
   */
  @ExcelProperty(value = "学生出生日期", index = 2)
  @ColumnWidth(value = 25)
  private Date birthday;
  
  /**
   * 学生性别
   */
  @ExcelProperty(value = "学生性别", index = 3)
  @ColumnWidth(value = 15)
  private String gender;
  
}

查看写出的Excel文件样式

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言


EasyExcel+SpringMVC简单的上传下载Excel文件

  • 准备一个普通的Webapp项目,然后进行配置:web.xml配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!-- Spring相关配置 -->
        <!-- 指定Spring配置文件名称位置 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring.xml</param-value>
        </context-param>
    
        <!-- ServletContext创建监听器,会触发创建Spring容器 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <!-- 拦截除了JSP以外的所有请求,需要在MVC配置文件中放行静态资源 -->
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <!-- 配置全局过滤器,设置编码为UTF-8,解决POST请求乱码问题 -->
        <filter>
            <filter-name>encodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>
    
    
  • resources目录配置文件:spring.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    
        <!-- 组件扫描-->
        <context:component-scan base-package="com.study.easyexcel">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
    </beans>
    
    
  • resources目录配置文件:spring-mvc.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.2.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!-- 组件扫描-->
        <context:component-scan base-package="com.study.easyexcel.controller"/>
    
        <!-- MVC文件上传多部件解析器 -->
        <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
              id="multipartResolver"/>
    
        <mvc:annotation-driven>
            <mvc:message-converters>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
    </beans>
    
    
    
  • controller层代码:StudentController
    package com.study.easyexcel.controller;
    
    import com.alibaba.excel.EasyExcel;
    import com.study.easyexcel.entity.Student;
    import com.study.easyexcel.listener.WebStudentListener;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.net.URLEncoder;
    import java.nio.charset.StandardCharsets;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    @RestController
    @RequestMapping("/student")
    public class StudentController {
      
      @Autowired
      WebStudentListener webStudentListener;
      
      /**
       * 上传Excel
       */
      @RequestMapping("/upload")
      public String uploadExcel(MultipartFile uploadExcel) {
        
        try {
          EasyExcel
              .read(uploadExcel.getInputStream(), Student.class, webStudentListener)
              .sheet()
              .doRead();
          return "上传成功";
        } catch (IOException e) {
          e.printStackTrace();
          return "上传失败";
        }
      }
      
      /**
       * 下载Excel
       */
      @RequestMapping("/download")
      public void downloadExcel(HttpServletResponse response) throws IOException {
        
        //设置响应类型
        response.setContentType("application/vnd.ms-excel");
        //设置响应编码
        response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
        //将文件名进行URL编码
        String fileName = URLEncoder.encode("学员数据", "UTF-8");
        //设置如何显示响应内容:inline->直接浏览、attachment->附件下载
        response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName + ".xlsx");
        
        //获取响应给客户端的输出流
        ServletOutputStream outputStream = response.getOutputStream();
        EasyExcel
            .write(outputStream, Student.class)
            .sheet()
            .doWrite(getStudentList());
      }
      
      /**
       * 随机获取10个Student数据
       */
      private static List<Student> getStudentList() {
        List<Student> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
          list.add(new Student(
              String.valueOf((int) (Math.random() * 1000_0000) + 1000_0000),
              "张" + i,
              new Date((long) (System.currentTimeMillis() + Math.random() * 10_0000)),
              Math.random() < 0.5 ? "男" : "女",
              Math.random() * 1_0000,
              "信息工程学院"
          ));
        }
        return list;
      }
      
    }
    
    
  • 编写Excel读取所需的Linstener:com.study.easyexcel.listener.WebStudentListener
    package com.study.easyexcel.listener;
    
    import com.alibaba.excel.context.AnalysisContext;
    import com.alibaba.excel.event.AnalysisEventListener;
    import com.study.easyexcel.entity.Student;
    import com.study.easyexcel.service.IStudentService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    @Component
    @Scope("prototype")//Listener不要配置成单例模式
    public class WebStudentListener extends AnalysisEventListener<Student> {
      
      @Autowired
      private IStudentService studentService;
      
      private List<Student> list = new ArrayList<>();
      
      @Override
      public void invoke(Student data, AnalysisContext context) {
        list.add(data);
        //每5条消息处理一次
        if(list.size() % 5==0){
          studentService.save(list);
          list.clear();
        }
      }
      
      @Override
      public void doAfterAllAnalysed(AnalysisContext context) {
      
      }
      
    }
    
    
  • 编写service接口:com.study.easyexcel.service.IStudentService
    package com.study.easyexcel.service;
    
    import com.study.easyexcel.entity.Student;
    
    import java.util.List;
    
    
    public interface IStudentService {
      
      void save(List<Student> students);
      
    }
    
    
  • 编写service接口实现类:com.study.easyexcel.service.impl.StudentImpl
    package com.study.easyexcel.service.impl;
    
    import com.study.easyexcel.entity.Student;
    import com.study.easyexcel.service.IStudentService;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    
    @Service
    public class StudentImpl implements IStudentService {
      
      @Override
      public void save(List<Student> students) {
        System.out.println("接收到上传解析出来的Excel数据:");
        students.forEach(System.out::println);
      }
      
    }
    
    
  • 上传接口:http://localhost:8080/student/upload
  • 下载接口:http://localhost:8080/student/upload

EasyExcel模板填充-概述

模板填充的语法-单条数据填充

  • 在需要填充的位置使用{属性名}的方式进行占位
    easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

  • 如果本身内容就有{}需要对其使用\进行转义,例如:\{name\}

  • 单行填充可以使用实体类或者Map作为填充数据源,那么实体类的属性或者Map的Key名要与Excel模板文件中的占位名称保持一致

  • 如果在一个单元格内需要填充两个数据,那么可以直接写两个占位的,可以是同名的,如果同名,则会重复填充(可以多行,但是只会重复相同的填充数据)
    easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

  • 如果希望在填充后的Excel文件中,让\{name\}显示为{name},那么与之一起的必须有一个能被正常填充的占位符
    easyexcel 模板填充数据,Java,Excel,excel,java,开发语言
    easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

  • 使用{属性名}方式占位时,如果强行传入多条数据,那么最后将不会进行任何数据填充

模板填充的语法-多条数据填充

  • 占位符语法:{.属性名}
  • 多条数据填充只是在属性名前面家里一个.,此时就可以传入一个集合类型的数据,那么最终填充出来的数据就会是整个集合中的数据

EasyExcel模板填充-最简单的单组数据填充-使用实体类填充

  • 准备一个要填充的模板,该模板的样式会在填充后仍然保留

    easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

用于填充的实体类-StudentByFill

package com.study.easyexcel.entity;

import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.RoundingMode;
import java.util.Date;


@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelIgnoreUnannotated
public class StudentByFill {
  
  /**
   * 学生Id
   */
  @ExcelProperty(value = "学生Id")
  private String id;
  
  /**
   * 学生姓名
   */
  @ExcelProperty(value = "学生姓名")
  private String name;
  
  /**
   * 学生出生日期
   */
  @DateTimeFormat(value = "yyyy-MM-dd")
  @ExcelProperty(value = "学生出生日期")
  private Date birthday;
  
  /**
   * 学生性别
   */
  @ExcelProperty(value = "学生性别")
  private String gender;
  
  /**
   * 学费
   */
  @ExcelProperty(value = "学费")
  @NumberFormat(value = "#.00", roundingMode = RoundingMode.HALF_UP)
  private Double tuition;
  
  /**
   * 学生院系
   */
  @ExcelProperty(value = "学生院系")
  private String department;
  
}

编写填充代码-OneLineFill

package com.study.easyexcel.fill.oneline;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.study.easyexcel.entity.StudentByFill;

import java.util.Date;


public class OneLineFill {
  
  public static void main(String[] args) {
    //要填充的Excel模板的路径
    String templatePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel_template\\简单的单行填充.xlsx";
    
    //获取工作簿对象(整个Excel文件)
    ExcelWriterBuilder workBook = EasyExcel
        .write("F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel\\简单的单行填充-Write.xlsx", StudentByFill.class)
        //与模板进行关联
        .withTemplate(templatePath);
    
    //获取Sheet对象
    ExcelWriterSheetBuilder sheet = workBook.sheet();
    
    //创建需要被填充的数据
    StudentByFill fillData = new StudentByFill("20222410666", "张三", new Date(978567730000L), "男", 21035.00, "信息工程学院");
    
    //执行数据填充
    sheet.doFill(fillData);//do开头的方法会自在操作结束后,自动关闭流
  }
  
}

填充效果

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

EasyExcel模板填充-最简单的单组数据填充-使用Map填充

  • 填充模板和属性仍然使用EasyExcel模板填充-最简单的单组数据填充-使用实体类填充中的
  • 这里只将填充方式从实体类填充变为Map填充

编写填充代码-OneLineFillByMap

package com.study.easyexcel.fill.oneline;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.study.easyexcel.entity.StudentByFill;

import java.util.HashMap;
import java.util.Map;


public class OneLineFillByMap {
  
  public static void main(String[] args) {
    //要填充的Excel模板的路径
    String templatePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel_template\\简单的单行填充.xlsx";
    
    //获取工作簿对象(整个Excel文件)
    ExcelWriterBuilder workBook = EasyExcel
        .write("F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel\\简单的单行填充-Write.xlsx", StudentByFill.class)
        //与模板进行关联
        .withTemplate(templatePath);
    
    //获取Sheet对象
    ExcelWriterSheetBuilder sheet = workBook.sheet();
    
    //创建需要被填充的数据
    Map<String, String> fillData = new HashMap<>();
    fillData.put("id", "20222410666");
    fillData.put("name", "张三");
    //这里要注意,由于日期直接使用了字符串填充,需要注意日期对象转成日期之后的格式
    //fillData.put("birthday",new Date(978567730000L).toString());//Thu Jan 04 08:22:10 CST 2001
    fillData.put("birthday", "2001-01-01 11:22:33");//Thu Jan 04 08:22:10 CST 2001
    fillData.put("gender", "男");
    fillData.put("tuition", "21035.00");
    fillData.put("department", "信息工程学院");
    
    //执行数据填充
    sheet.doFill(fillData);
  }
  
}

填充效果

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言


EasyExcel模板填充-垂直列表填充-使用List<T>填充

  • 准备一个要填充的模板,该模板的样式会在填充后仍然保留

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

  • 用于填充的实体类-StudentByFill同上

编写填充代码-MultilineFileByList

package com.study.easyexcel.fill.multiline;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.study.easyexcel.entity.StudentByFill;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MultilineFileByList {
  
  public static void main(String[] args) {
    //要填充的Excel模板的路径
    String templatePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel_template\\多行数据填充模板.xlsx";
    //填充后文件的保存路径
    String savePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel\\多行数据填充-Write.xlsx";
    //根据模板获取工作簿
    ExcelWriterBuilder workBook = EasyExcel.write(savePath, StudentByFill.class).withTemplate(templatePath);
    //获取工作表
    ExcelWriterSheetBuilder sheet = workBook.sheet();
    //获取要填充的数据源
    List<StudentByFill> fillDataList = getFillDataList();
    //填充模板
    sheet.doFill(fillDataList);
  }
  
  /**
   * 生成要用于填充的数据
   */
  public static List<StudentByFill> getFillDataList() {
    List<StudentByFill> list = new ArrayList<>();
    
    for (int i = 1; i <= 10; i++) {
      list.add(new StudentByFill(String.valueOf((int) (Math.random() * 1000_0000) + 1000_0000), "张" + i, new Date(), Math.random() < 0.5 ? "男" : "女", Math.random() * 1_0000, "信息工程学院"));
    }
    return list;
  }
  
}

填充效果

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

EasyExcel模板填充-水平列表填充

  • 准备一个要填充的模板,该模板的样式会在填充后仍然保留

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

  • 用于填充的实体类-StudentByFill同上

编写填充代码-HorizontalFill

package com.study.easyexcel.fill.multiline;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.enums.WriteDirectionEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.study.easyexcel.entity.StudentByFill;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class HorizontalFill {
  
  public static void main(String[] args) {
    //要填充的Excel模板的路径
    String templatePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel_template\\水平列表填充模板.xlsx";
    //填充后文件的保存路径
    String savePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel\\水平列表填充-Write.xlsx";
    //根据模板获取工作簿对象
    ExcelWriter workBook = EasyExcel
        .write(savePath, StudentByFill.class)
        .withTemplate(templatePath)
        .build();
    //获取工作表对象
    WriteSheet sheet = EasyExcel.writerSheet().build();
    
    //构建一个 FillConfig 对象,设置填充方向
    FillConfig build = FillConfig.builder()
        //设置填充方向为水平
        .direction(WriteDirectionEnum.HORIZONTAL)
        .build();
    
    //填充数据
    workBook.fill(getFillDataList(), build, sheet);
    //调用do开头的方法时,内部会自动关闭流,当调用fill()方法时,需要自己手动关闭流
    workBook.finish();
  }
  
  /**
   * 生成要用于填充的数据
   */
  public static List<StudentByFill> getFillDataList() {
    List<StudentByFill> list = new ArrayList<>();
    
    for (int i = 1; i <= 10; i++) {
      list.add(new StudentByFill(String.valueOf((int) (Math.random() * 1000_0000) + 1000_0000), "张" + i, new Date(), Math.random() < 0.5 ? "男" : "女", Math.random() * 1_0000, "信息工程学院"));
    }
    return list;
  }
  
}

填充效果

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言
easyexcel 模板填充数据,Java,Excel,excel,java,开发语言


EasyExcel模板填充-复杂数据填充

  • 填充列表时,会有多组数据填充和单组数据填充的混合使用。这种情况下就必须手动调用fill()方法进行填充
  • 如果多组数据在单组数据之前填充,那么需要用FillConfig设置多组数据填充时要从新行开始,这样就不会覆盖住底部的汇总数据

Excel模板

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言

代码需要的实体类-Bill

package com.study.easyexcel.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Date;


@Data
@AllArgsConstructor
public class Bill {
  
  /**
   * 日期
   */
  private Date date;
  
  /**
   * 收支类型
   */
  private String type;
  
  /**
   * 类别
   */
  private String category;
  
  /**
   * 金额
   */
  private Double amount;
  
  /**
   * 备注
   */
  private String note;
  
}

编写填充代码-AccountingFill

package com.study.easyexcel.fill.complex;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.study.easyexcel.entity.Bill;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class AccountingFill {
  
  public static void main(String[] args) throws ParseException {
    //要填充的Excel模板的路径
    String templatePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel_template\\组合数据填充模板.xlsx";
    //填充后文件的保存路径
    String savePath = "F:\\JavaCodeStandalone\\easy-excel-study\\eaey-excel-basic\\src\\main\\resources\\excel\\组合数据填充-Write.xlsx";
    
    //工作簿对象
    ExcelWriter workBook = EasyExcel.write(savePath, Bill.class)
        .withTemplate(templatePath)
        .build();
    
    //工作表对象
    WriteSheet sheet = EasyExcel.writerSheet().build();
    
    //配置多组数据填充完后,需要换行,防止覆盖模板中的单组数据模板
    FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
    
    //获取要填充的数据
    List<Bill> bills = getBills();
    
    //先填充出来多组数据(账单详情数据)
    workBook.fill(bills, fillConfig, sheet);
    
    //填充单组数据(汇总数据)
    long totalCount = bills.size();//账单条数
    double totalAmount = bills.stream().mapToDouble(Bill::getAmount).sum();//账单总金额
    
    HashMap<String, String> summaryMap = new HashMap<>();
    summaryMap.put("totalCount", String.valueOf(totalCount));
    summaryMap.put("totalAmount", String.valueOf(totalAmount));
    //手动单独填充单组数据
    workBook.fill(summaryMap, sheet);
    
    //关闭流
    workBook.finish();
  }
  
  /**
   * 生成账单数据
   */
  private static List<Bill> getBills() throws ParseException {
    List<Bill> list = new ArrayList<>();
    
    String datas = "2022-10-11\t支出\t购物\t18.36\t这里是备注内容\n" +
        "2022-10-11\t支出\t餐饮\t6\t这里是备注内容\n" +
        "2022-10-11\t支出\t学习\t1\t这里是备注内容\n" +
        "2022-10-11\t支出\t餐饮\t9\t这里是备注内容\n" +
        "2022-10-11\t支出\t学习\t1.5\t这里是备注内容\n" +
        "2022-10-10\t支出\t洗澡\t0.6\t这里是备注内容\n" +
        "2022-10-10\t支出\t餐饮\t6\t这里是备注内容\n" +
        "2022-10-10\t支出\t网络支出\t1\t这里是备注内容\n" +
        "2022-10-10\t支出\t餐饮\t9\t这里是备注内容";
    
    //分解出每一条数据
    for (String bill : datas.split("\n")) {
      String[] bills = bill.split("\t");
      Bill bill1 = new Bill(new SimpleDateFormat("yyyy-MM-dd").parse(bills[0]),
                  bills[1],
                  bills[2],
                  Double.parseDouble(bills[3]),
                  bills[4]);
      list.add(bill1);
    }
    return list;
  }
  
}

填充效果

easyexcel 模板填充数据,Java,Excel,excel,java,开发语言文章来源地址https://www.toymoban.com/news/detail-782847.html

到了这里,关于EasyExcel的使用:入门到模板填充的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA(EasyExcel)通过远程调用模板 导出数据 复杂表头

    最近接手一个需求,单组数据的显示,也有多组数据的显示,查了好多文章,都不是很明白.但是这篇文章和我的需求差不多非常相似(链接放在文末),根据这篇文章然后将自己的实现过程记录了下来,以防之后再用到. 这是我需要导出的excel格式 开头是单条数据的展示 之后是多条数据

    2024年02月03日
    浏览(37)
  • 使用EasyExcel实现模板下载、数据导入功能

    1.在你的工程下添加模板文件 2.编写代码实现下载功能 controller serviceImpl 好了,到这里,一个简单的下载模板功能就实现了。不过我在项目运行中遇到了一些坑,下面记录一下。 3.项目中遇到的坑:excel文件在springboot的maven项目下打了jar包后损坏 4.解决办法:试了很多种,主要

    2024年02月13日
    浏览(26)
  • 后端:使用easyExcel实现解析Excel文件读取数据。前端:Excel模板下载、前端上传文件

            本篇是EasyExcel快速入门知识,讲解如何读取Excel文件,对Excel中错误信息如空字符、必填项为空、表格格式校验做到处理 ,并给出了实际项目中示例代码;为什么要使用easyexcel;原因是相比于poi,easyexcel更加轻量级,读取写入API方便,并且在工作中占用内存较小;

    2024年02月05日
    浏览(48)
  • easyExcel模板数据导入数据库

    最近项目中需要用到Excel表格的上传下载功能,于是选择了EasyExcel这款工具,总的来说非常的好用,下面就做一个简单的演示。 官方文档地址   EasyExcel · 语雀 Alibaba Easy Excel - 简单、省内存的Java解析Excel工具 | 首页 pom.xml 中需要添加的依赖 这里用到了  @ExcelProperty  注解,这

    2023年04月08日
    浏览(37)
  • Java 使用 EasyExcel 爬取数据

    分析要爬取数据的来源 1. 查找数据来源: 浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址 2. 查看接口信息: 复制请求地址直接到浏览器地址栏输入看能不能取到数据 3. 推荐安装插件:FeHelper(FeHelper - Awesome) 4. 按 F12 打开控制台,查看网络请求

    2024年01月18日
    浏览(25)
  • EasyExcel导出带下拉选数据的Excel数据导入模板

    #因为项目中需要导入一些信息,但是这些信息比较不常见,且在项目字典数据中维护有这些数据,所以在导出模板的时候,把这些数据一并导出,可以减少用户的编写,避免在导入的时候因为数据错误,发生一些业务问题 直接开始 1、以岗位类型为例,展示数据的实现方式

    2024年02月03日
    浏览(33)
  • 使用EasyExcel导入、根据模板下载(附前后端代码)

    使用以上导包如果报错 NoClassDefFoundError,可能需要引入cglib包 前端代码: : 由于前端type=\\\"file\\\"的样式固定,可以隐藏input,通过其他按钮点击触发上传,用户上传文件后input的值发生变化触发change事件调用ajax  后端代码: controller层接收  实现类: 这里用的是在本地下载文件

    2024年02月15日
    浏览(34)
  • EasyExcel入门使用

    EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。 EasyExcel 的主要特点如下: 1、高性能:EasyExcel 采用了异步导入导出的方式,并且底层使用 NIO 技术实现,使得其在

    2024年01月25日
    浏览(17)
  • 【java学习】EasyExcel的简单使用

    EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,即能让使用者在不用考虑性能、内存的等因素的情况下,快速完成Excel的读(导入)、写(导出)等功能。 版本支持: 2+版本支持Java7Java6

    2024年02月16日
    浏览(30)
  • Java 使用 easyexcel 读取 excel 文件

    easyexcel 官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 1. 引入依赖并给出示例 excel     2. 两种读取的方式         (1)确定表头:建立对象,和表头形成映射。(这里以此为例)         (2)不确定表头:每一行映射为 MapString, Object。 3. 先创建 excel 中表头对应

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包