/excel-spring-boot-starter

alibaba easyexcel spring boot starter

Primary LanguageJava

EasyExcel

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 64M内存1分钟内读取75M(46W行25列)的Excel,当然还有急速模式能更快,但是内存占用会在100M多一点

spring boot stater依赖

  • 方便在 web 环境下使用 easyexcel ,已上传至 maven 仓库
<dependency>
    <groupId>com.pig4cloud.excel</groupId>
    <artifactId>excel-spring-boot-starter</artifactId>
    <version>0.4.1</version>
</dependency>

读取 Excel

  • 接口类定义List 接受表格对应的数据 使用 @RequestExcel 标记
@PostMapping
public String req(@RequestExcel List<Demo> demoList, BindingResult bindingResult) {
  // demoList 自动注入校验通过的数据
  // bindingResult 获取到不合法的数据 其中 key 对应行号
  Map<Long, Set<ConstraintViolation<DemoData>>> errorMap = (Map<Long, Set<ConstraintViolation<DemoData>>>) bindingResult.getTarget();
  return "success";
}
  • 实体声明
@Data
public class Demo {
  @ExcelProperty(index = 0)
  private String username;

  @ExcelProperty(index = 1)
  private String password;
}
  • 测试表格

Excel 读取(解析)

只需要在 Controller 层方法便增加 @RequestExcel 注解即可,该注解上可自定义 readListener

@PostMapping("/upload")
public void upload(@RequestExcel List<DemoData> dataList) {

}

Excel 生成

只需要在 Controller 层返回 List 并增加 @ResponseExcel注解即可

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ResponseExcel {
	String name() default "";
	ExcelTypeEnum suffix() default ExcelTypeEnum.XLSX;
	String password() default "";
	String[] sheet() default {};
	boolean inMemory() default false;
	String template() default "";
	String[] include() default {};
	String[] exclude() default {};
	Class<? extends WriteHandler>[] writeHandler() default {};
	Class<? extends Converter>[] converter() default {};
	Class<? extends HeadGenerator> headGenerator() default HeadGenerator.class;
}

基础用法

  • 返回单 sheet, 全部字段导出
@ResponseExcel(name = "lengleng", sheet = "demoList")
@GetMapping("/e1")
public List<DemoData> e1() {
    List<DemoData> dataList = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        DemoData data = new DemoData();
        data.setUsername("tr1" + i);
        data.setPassword("tr2" + i);
        dataList.add(data);
    }
    return dataList;
}
// 实体对象

@Data
public class DemoData {
	private String username;
	private String password;
}

  • 自定义字段属性
@Data
public class DemoData {
    @ColumnWidth(50)  // 定义宽度
	@ExcelProperty("用户名") // 定义列名称
    @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)
	private String username;
	@ExcelProperty("密码")
	private String password;
}

  • 忽略部分字段
@Data
public class DemoData {
    @ColumnWidth(50)  // 定义宽度
	@ExcelProperty("用户名") // 定义列名称
    @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)
	private String username;
	@ExcelProperty("密码")
	private String password;
}

导出多sheet

@ResponseExcel(name = "lengleng", sheet = {"第一个sheet","第二个sheet"})
@GetMapping("/e1")
public List<List<DemoData>> e1() {
    List<List<DemoData>> lists = new ArrayList<>();
    lists.add(list());
    lists.add(list());
    return lists;
}

设置导出加密码

@ResponseExcel(name = "lengleng", sheet = "sheetName",password = "lengleng")
@GetMapping("/e1")
public List<List<DemoData>> e1() {
    List<List<DemoData>> lists = new ArrayList<>();
    lists.add(list());
    lists.add(list());
    return lists;
}

添加全局自定义转换器(Converter)

0.0.7 版本开始添加了全局自定义转换器注入的功能,你只需要将自定义的 Converter 注册成 Spring bean 即可。

示例代码如下(对 set 类型转换):

@Data
public class TestModel {
	@ExcelProperty("名称集合")
	private Set<String> nameSet;
}

/**
 * 集合转换器
 *
 * @author L.cm
 */
@Component
public class SetConverter implements Converter<Set<?>> {
	private final ConversionService conversionService;

	SetConverter() {
		this.conversionService = DefaultConversionService.getSharedInstance();
	}

	@Override
	public Class<?> supportJavaTypeKey() {
		return Set.class;
	}

	@Override
	public CellDataTypeEnum supportExcelTypeKey() {
		return CellDataTypeEnum.STRING;
	}

	@Override
	public Set<?> convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
		String[] value = StringUtils.delimitedListToStringArray(cellData.getStringValue(), ",");
		return (Set<?>) conversionService.convert(value, TypeDescriptor.valueOf(String[].class), new TypeDescriptor(contentProperty.getField()));
	}

	@Override
	public CellData<String> convertToExcelData(Set<?> value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
		return new CellData<>(StringUtils.collectionToCommaDelimitedString(value));
	}

}

高级用法模板导出

@ResponseExcel(name = "模板测试excel", sheet = "sheetName",template = "example.xlsx")
@GetMapping("/e1")
public List<DemoData> e1() {
    return list();
}

其他用法