# myexcel

返回开源分支:java-实用工具 | 返回:java导出 | github | wiki

# MyExcel概述

返回顶部

MyExcel,是一个集导入、导出、加密Excel等多项功能的工具包

  • 导入:提供简便的API,读取Excel内容,并转化为List< Bean >。
  • 导出:可快速导出海量数据的简单列表,可生成高复杂度布局的Excel,复杂布局指的是包含多种不规则合并单元格、背景色、字体大小、斜体、下拉列表等,可自动划分Excel生成zip压缩包

# MyExcel优势

返回顶部

  • 可生成任意复杂表格:本工具使用迭代单元格方式进行Excel绘制,可生成任意复杂度Excel,提供多种宽度策略;
  • 零学习成本:使用Html作为模板,学习成本几乎为零;
  • 支持常用背景色、边框、字体等样式设置:具体参见菜单样式支持部分;
  • 支持.xls、.xlsx、.csv:支持生成.xls、.xlsx后缀的Excel以及.csv文件;
  • 支持公式导出:支持Excel模板中设置公式,降低服务端的计算量;
  • 支持低内存SXSSF模式:支持低内存的SXSSF模式,可利用极低的内存生成.xlsx;
  • 支持生产者消费者模式导出:支持生产者消费者模式导出,无需一次性获取所有数据,分批获取数据配合SXSSF模式实现真正意义上海量数据导出;
  • 支持多种模板引擎:已内置Freemarker、Groovy、Beetl、Thymeleaf等常用模板引擎Excel构建器(详情参见文档Getting started),推荐使用Beetl模板引擎(Beetl文档);
  • 提供默认Excel构建器,直接输出简单Excel:无需编写任何Html,已内置默认模板,可直接根据POJO数据列表输出;
  • 支持一次生成多sheet:以table作为sheet单元,支持一份Excel文档中多sheet导出;
  • 支持Excel容量设定:支持设定Excel容量,到达容量后自动新建Excel,可构建成zip压缩包导出;

# 更新日志

  • MyExcel 3.6.0
    • 重构模板构建器ExcelBuilder,使用TemplateHandler处理模板解析;
    • DefaultStreamExcelBuilder支持模板追加;
    • 新增MyExcelConfiguration,支持对MyExcel进行全局设置,如自定义临时文件目录;
    • 优化ExcelBuilder资源处理,提升模板构建效率;
    • 重命名@ExcelModel等注解对应配置类名称,易于理解;
    • 优化单元测试文件存放目录,避免clone后无法直接执行单元测试问题;

# 导入示例

返回顶部

导入分为一般导入、sax导入,二者的区别在于sax导入更关注内存,内存使用更少,其他二者接口是一致的,建议使用sax方式导入(可读取公式值)。

URL htmlToExcelEampleURL = this.getClass().getResource("/templates/read_example.xlsx");
Path path = Paths.get(htmlToExcelEampleURL.toURI());
// 方式一:全部读取后处理,SAX模式,避免OOM,建议大量数据使用
List<ArtCrowd> result = SaxExcelReader.of(ArtCrowd.class)
 .sheet(0)
 .rowFilter(row -> row.getRowNum() > 0)
 .charset("GBK") // 目前仅.csv文件有效,设置当前文件的编码
 .beanFilter(ArtCrowd::isDance)
 .read(path.toFile());
 // 方式二:读取一行处理一行,可自行决定终止条件,SAX模式,避免OOM
 // readThen有两种重写接口,返回Boolean型接口允许在返回False情况下直接终止读取
 SaxExcelReader.of(ArtCrowd.class)
 .sheet(0)
 .rowFilter(row -> row.getRowNum() > 0)
 .charset("GBK") // 目前仅.csv文件有效,设置当前文件的编码
 .beanFilter(ArtCrowd::isDance)
 .readThen(path.toFile() ,artCrowd -> {System.out.println(artCrowd.getName);});


 public class ArtCrowd {
 // index代表列索引,从0开始
 @ExcelColumn(index = 0)
 private String name;
 @ExcelColumn(index = 1)
 private String age;
 @ExcelColumn(index = 2,dateFormatPattern="yyyy-MM-dd")
 private Date birthday;
}
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

# Excel导出

返回顶部

默认导出采用普通方式导出List< Bean >,适合小数据量场景,如数据量很大-10万+,建议使用DefaultStreamExcelBuilder,避免内存占用过多。

文件导出示例:

List<ArtCrowd> dataList = this.getDataList();
Workbook workbook = DefaultExcelBuilder.of(ArtCrowd.class)
 .build(dataList);
FileExportUtil.export(workbook, new File("/User/demo.xlsx"));
1
2
3
4

数据获取:

private List<ArtCrowd> getDataList() {
 List<ArtCrowd> dataList = new ArrayList<>(1000);
 for (int i = 0; i < 1000; i++) {
 ArtCrowd artCrowd = new ArtCrowd();
 artCrowd.setName("Tom");
 artCrowd.setAge(18);
 artCrowd.setGender("Woman");
 artCrowd.setPaintingLevel("一级证书");
 artCrowd.setDance(true);
 artCrowd.setAssessmentTime(LocalDateTime.now());
 artCrowd.setHobby("钓鱼");
 dataList.add(artCrowd);
 }
 return dataList;
}


@ExcelTable(sheetName = "艺术生")
public class ArtCrowd {
 @ExcelColumn(order = 0, title = "姓名")
 private String name;
 @ExcelColumn(order = 1, title = "年龄")
 private Integer age;
 @ExcelColumn(order = 2, title = "性别")
 private String gender;
 @ExcelColumn(order = 3,title = "绘画等级")
 private String paintingLevel;
 @ExcelColumn(order = 4, title = "是否会跳舞")
 private boolean dance;
 @ExcelColumn(order = 5, title = "考核时间", dateFormatPattern = "yyyy-MM-dd HH:mm:ss")
 private LocalDateTime assessmentTime;
 @ExcludeColumn
 private String hobby;
}
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