EasyExcel保姆级教程(2)

上文详细介绍了easyExcel的优点以及相关的读操作,通过这些案例你会发现,阿里巴巴的easyExcel真的对POI做了大量的封装和优化,同时让我们开发者使用也变得那么的so easy,那么今天博猪就紧着介绍一下easyExcel相关的写操作,看完这些案例就会发现Excel的处理也不是那么头疼了。

Excel操作-写

准备工作

创建导出数据,我们默认用一个私有方法代替。

生成文件为了方便查看,博猪统一放在C:\Users\${userName}目录下;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 生成模拟数据
* @param createNum 创建数量
* @return
*/
private List<SimpleWriteEntity> createData(int createNum) {
List<SimpleWriteEntity> list = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < createNum; i++) {
SimpleWriteEntity entity = new SimpleWriteEntity();
entity.setTitle("标题" + i);
entity.setDateTitle(new Date());
entity.setNumberTitle(random.nextDouble());
list.add(entity);
}
return list;
}

简单写

对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Getter
@Setter
@ToString
public class SimpleWriteEntity {
@ExcelProperty("字符串标题")
private String title;
@ExcelProperty("日期标题")
private Date dateTitle;
@ExcelProperty("数字标题")
private Double numberTitle;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignoreFiled;
}

测试代码

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
/**
* 最简单的写
* <p>1. 创建excel对应的实体对象 参照{@link SimpleWriteEntity}
* <p>2. 直接写即可
*/
@Test
public void testSimpleWrite() {
List<SimpleWriteEntity> data = createData(10);
File file = FileUtil.readUserHomeFile("simpleWrite" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
// 写法1:
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(file, SimpleWriteEntity.class).sheet("模板").doWrite(data);

//写法2
ExcelWriter excelWriter = null;
try {
excelWriter = EasyExcel.write(file, SimpleWriteEntity.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data, writeSheet);
} finally {
// 千万别忘记finish 会帮忙关闭流
if (excelWriter != null) {
excelWriter.finish();
}
}

}

根据参数只导出指定列

测试代码

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
/**
* 根据参数只导出指定列
* <p>
* 1. 创建excel对应的实体对象 参照{@link SimpleWriteEntity}
* <p>
* 2. 根据自己或者排除自己需要的列
* <p>
* 3. 直接写即可
*
* @since 2.1.1
*/
@Test
public void testWriteByParams() {
List<SimpleWriteEntity> data = createData(10);
File file = FileUtil.readUserHomeFile("writeByParams" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);

// 根据用户传入字段 假设我们要忽略 date
Set<String> excludeColumnFiledNames = new HashSet<String>();
excludeColumnFiledNames.add("dateTitle");
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(file, SimpleWriteEntity.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板")
.doWrite(data);

// 根据用户传入字段 假设我们只要导出 date
Set<String> includeColumnFiledNames = new HashSet<String>();
includeColumnFiledNames.add("dateTitle");
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(file, SimpleWriteEntity.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板")
.doWrite(data);
}

指定写入的列

对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Getter
@Setter
@ToString
public class WriteByAnnotationEntity {
@ExcelProperty(value = "字符串标题", index = 0)
private String title;
@ExcelProperty(value = "日期标题", index = 1)
private Date dateTitle;
/**
* 这里设置3 会导致第二列空的
*/
@ExcelProperty(value = "数字标题", index = 3)
private Double numberTitle;
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 指定写入的列
* <p>1. 创建excel对应的实体对象 参照{@link WriteByAnnotationEntity}
* <p>2. 使用{@link ExcelProperty}注解指定写入的列
* <p>3. 直接写即可
*/
@Test
public void testWriteByAnnotation() {
File file = FileUtil.readUserHomeFile("WriteByAnnotation" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(file, WriteByAnnotationEntity.class).sheet("模板").doWrite(createData(10));
}

复杂头写入

对象

1
2
3
4
5
6
7
8
9
@Data
public class ComplexHeadEntity {
@ExcelProperty({"主标题", "字符串标题"})
private String title;
@ExcelProperty({"主标题", "日期标题"})
private Date dateTitle;
@ExcelProperty({"主标题", "数字标题"})
private Double numberTitle;
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
/**
* 复杂头写入
* <p>1. 创建excel对应的实体对象 参照{@link ComplexHeadEntity}
* <p>2. 使用{@link ExcelProperty}注解指定复杂的头
* <p>3. 直接写即可
*/
@Test
public void testWriteComplexHead() {
File file = FileUtil.readUserHomeFile("WriteComplexHead" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
EasyExcel.write(file, ComplexHeadEntity.class).sheet("模板").doWrite(createData(10));
}

同一个对象数据写到同一个Sheet

测试代码

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
/**
* 重复多次写入-写到同一个sheet
* <p>
* 1. 创建excel对应的实体对象 参照{@link SimpleWriteEntity}
* <p>
* 2. 使用{@link ExcelProperty}注解指定复杂的头
* <p>
* 3. 直接调用二次写入即可
*/
@Test
public void testWriteManyDataToOneSheet() {
File file = FileUtil.readUserHomeFile("WriteManyDataToOneSheet" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
ExcelWriter excelWriter = null;
try {
// 这里 需要指定写用哪个class去写
excelWriter = EasyExcel.write(file, SimpleWriteEntity.class).build();
// 这里注意 如果同一个sheet只要创建一次
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
for (int i = 0; i < 5; i++) {
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<SimpleWriteEntity> data = createData(10);
excelWriter.write(data, writeSheet);
}
} finally {
// 千万别忘记finish 会帮忙关闭流
if (excelWriter != null) {
excelWriter.finish();
}
}
}

同一个对象数据写到不同sheet

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
/**
* 重复多次写入-写到不同的sheet 同一个对象
* <p>
* 1. 创建excel对应的实体对象 参照{@link SimpleWriteEntity}
* <p>
* 2. 使用{@link ExcelProperty}注解指定复杂的头
* <p>
* 3. 直接调用二次写入即可
*/
@Test
public void testWriteManyDataToManySheet() {
File file = FileUtil.readUserHomeFile("WriteManyDataToManySheet" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
ExcelWriter excelWriter = null;
try {
// 这里 指定文件
excelWriter = EasyExcel.write(file, SimpleWriteEntity.class).build();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 5; i++) {
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<SimpleWriteEntity> data = createData(10);
excelWriter.write(data, writeSheet);
}
} finally {
// 千万别忘记finish 会帮忙关闭流
if (excelWriter != null) {
excelWriter.finish();
}
}
}

不同对象写到不同sheet中

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
/**
* 重复多次写入-写到不同的sheet 不同的对象
* <p>
* 1. 创建excel对应的实体对象 参照{@link SimpleWriteEntity}
* <p>
* 2. 使用{@link ExcelProperty}注解指定复杂的头
* <p>
* 3. 直接调用二次写入即可
*/
@Test
public void testWriteManyDataAndManySheet() {
File file = FileUtil.readUserHomeFile("WriteManyDataAndManySheet" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
ExcelWriter excelWriter = null;
try {
// 这里 指定文件
excelWriter = EasyExcel.write(file).build();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 5; i++) {
/**每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。
* 这里注意{@link SimpleWriteEntity}.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
*/
WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(SimpleWriteEntity.class).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<SimpleWriteEntity> data = createData(5);
excelWriter.write(data, writeSheet);
}
} finally {
// 千万别忘记finish 会帮忙关闭流
if (excelWriter != null) {
excelWriter.finish();
}
}
}

日期、数字或者自定义格式转换

对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Getter
@Setter
@ToString
public class CoverDataWriteEntity {
/**
* 我想所有的 字符串起前面加上"自定义:"三个字
*/
@ExcelProperty(value = "字符串标题", converter = CustomStringConverter.class)
private String title;
/**
* 我想写到excel 用年月日的格式
*/
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
private Date dateTitle;
/**
* 我想写到excel 用百分比表示
*/
@NumberFormat("#.##%")
@ExcelProperty("数字标题")
private Double numberTitle;
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 日期、数字或者自定义格式转换
* <p>1. 创建excel对应的实体对象 参照{@link CoverDataWriteEntity}
* <p>2. 使用{@link ExcelProperty}配合使用注解{@link DateTimeFormat}、{@link NumberFormat}或者自定义注解
* <p>3. 直接写即可
*/
@Test
public void testWriteWithCovertData() {
File file = FileUtil.readUserHomeFile("WriteWithCovertData" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(file, CoverDataWriteEntity.class).sheet("模板").doWrite(createData(10));

}

图片导出

对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@ContentRowHeight(100)
@ColumnWidth(100 / 8)
@Data
public class ImageWriteEntity {
private File file;
private InputStream inputStream;
/**
* 如果string类型 必须指定转换器,string默认转换成string
*/
@ExcelProperty(converter = StringImageConverter.class)
private String string;

private byte[] byteArray;
/**
* 根据url导出
*
* @since 2.1.1
*/
private URL url;
}

测试代码

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
/**
* 图片导出
* <p>
* 1. 创建excel对应的实体对象 参照{@link ImageWriteEntity}
* <p>
* 2. 直接写即可
*/
@Test
public void testWriteImage() {
File file = FileUtil.readUserHomeFile("WriteImage" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
// 如果使用流 记得关闭
InputStream inputStream = null;
try {
List<ImageWriteEntity> list = new ArrayList<ImageWriteEntity>();
ImageWriteEntity imageData = new ImageWriteEntity();
list.add(imageData);
String imagePath = FileUtil.getPath() + "image" + File.separator + "img.jpg";
// 放入五种类型的图片 实际使用只要选一种即可
imageData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath)));
imageData.setFile(new File(imagePath));
imageData.setString(imagePath);
inputStream = FileUtils.openInputStream(new File(imagePath));
imageData.setInputStream(inputStream);
imageData.setUrl(new URL(
"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F201610%2F05%2F20161005195151_rzGhS.thumb.400_0.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1625563170&t=8d28f9633784ab21a52583629fcbac53"));
EasyExcel.write(file, ImageWriteEntity.class).sheet().doWrite(list);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

注解自定义样式

对象

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
@Getter
@Setter
@ToString
// 头背景设置成红色 IndexedColors.RED.getIndex()
@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 10)
// 头字体设置成20
@HeadFontStyle(fontHeightInPoints = 20)
// 内容的背景设置成绿色 IndexedColors.GREEN.getIndex()
@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 17)
// 内容字体设置成20
@ContentFontStyle(fontHeightInPoints = 20)
/**
* @ClassName SimpleWriteEntity
* @Description Excel简单写实体类,通过注解写入样式
* @Author will
* @Date 2021/5/29 21:58
*/
public class SimpleWriteWithStyleByAnnotationEntity {

// 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 14)
// 字符串的头字体设置成20
@HeadFontStyle(fontHeightInPoints = 30)
// 字符串的内容的背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)
// 字符串的内容字体设置成20
@ContentFontStyle(fontHeightInPoints = 30)

@ExcelProperty("字符串标题")
private String title;
@ExcelProperty("日期标题")
private Date dateTitle;
@ExcelProperty("数字标题")
private Double numberTitle;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignoreFiled;
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 注解形式自定义样式
* <p>
* 1. 创建excel对应的实体对象 参照{@link SimpleWriteWithStyleByAnnotationEntity}
* <p>
* 3. 直接写即可
*
* @since 2.2.0-beta1
*/
@Test
public void testWriteWithStyleByAnnotation() {
File file = FileUtil.readUserHomeFile("WriteWithStyleByAnnotation" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(file, SimpleWriteWithStyleByAnnotationEntity.class).sheet("模板").doWrite(createData(10));
}

自定义样式

测试代码

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
/**
* 自定义样式
* <p>1. 创建excel对应的实体对象 参照{@link SimpleWriteEntity}
* <p>2. 创建一个style策略 并注册
* <p>3. 直接写即可
*/
@Test
public void testWriteWithStyleByCustom() {
File file = FileUtil.readUserHomeFile("WriteWithStyleByCustom" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 背景设置为红色
headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short)20);
headWriteCellStyle.setWriteFont(headWriteFont);
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
// 背景绿色
contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
WriteFont contentWriteFont = new WriteFont();
// 字体大小
contentWriteFont.setFontHeightInPoints((short)20);
contentWriteCellStyle.setWriteFont(contentWriteFont);
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);

// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(file, SimpleWriteEntity.class).registerWriteHandler(horizontalCellStyleStrategy).sheet("模板")
.doWrite(createData(10));
}

动态头,实时生成头写入

创建头数据

1
2
3
4
5
6
7
8
9
10
11
12
13
private List<List<String>> head() {
List<List<String>> list = new ArrayList<List<String>>();
List<String> head0 = new ArrayList<String>();
head0.add("字符串" + System.currentTimeMillis());
List<String> head1 = new ArrayList<String>();
head1.add("数字" + System.currentTimeMillis());
List<String> head2 = new ArrayList<String>();
head2.add("日期" + System.currentTimeMillis());
list.add(head0);
list.add(head1);
list.add(head2);
return list;
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 动态头,实时生成头写入
* <p>
* 思路是这样子的,先创建List<String>头格式的sheet仅仅写入头,然后通过table 不写入头的方式 去写入数据
*
* <p>
* 1. 创建excel对应的实体对象 参照{@link SimpleWriteEntity}
* <p>
* 2. 然后写入table即可
*/
@Test
public void testWriteByDynamicHead() {
File file = FileUtil.readUserHomeFile("WriteByDynamicHead" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
EasyExcel.write(file)
// 这里放入动态头
.head(head()).sheet("模板")
// 当然这里数据也可以用 List<List<String>> 去传入
.doWrite(createData(10));
}

自定义拦截器

创建Excel表拦截器

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
/**
* @ClassName CustomCellWriteHandler
* @Description 自定义拦截器。对第一行第一列的头超链接到:https://github.com/alibaba/easyexcel
* @Author will
* @Date 2021/6/6 17:40
*/
public class CustomCellWriteHandler implements CellWriteHandler{

private static final Logger LOGGER = LoggerFactory.getLogger(CustomCellWriteHandler.class);

@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head
, Integer integer, Integer integer1, Boolean aBoolean) {

}

@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell
, Head head, Integer integer, Boolean aBoolean) {

}

@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData
, Cell cell, Head head, Integer integer, Boolean aBoolean) {

}

@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list
, Cell cell, Head head, Integer integer, Boolean isHead) {
// 这里可以对cell进行任何操作
LOGGER.info("第{}行,第{}列写入完成。", cell.getRowIndex(), cell.getColumnIndex());
if (isHead && cell.getColumnIndex() == 0) {
CreationHelper createHelper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper();
Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.URL);
hyperlink.setAddress("https://github.com/alibaba/easyexcel");
cell.setHyperlink(hyperlink);
}
}
}

创建ExcelSheet拦截器

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
/**
* @ClassName CustomSheetWriteHandler
* @Description 自定义拦截器.对第一列第一行和第二行的数据新增下拉框,显示 测试1 测试2
* @Author will
* @Date 2021/6/6 17:44
*/
public class CustomSheetWriteHandler implements SheetWriteHandler{

private static final Logger LOGGER = LoggerFactory.getLogger(CustomSheetWriteHandler.class);

@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

}

@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
LOGGER.info("第{}个Sheet写入成功。", writeSheetHolder.getSheetNo());
// 区间设置 第一列第一行和第二行的数据。由于第一行是头,所以第一、二行的数据实际上是第二三行
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 2, 0, 0);
DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();
DataValidationConstraint constraint = helper.createExplicitListConstraint(new String[] {"测试1", "测试2"});
DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
writeSheetHolder.getSheet().addValidationData(dataValidation);
}
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 下拉,超链接等自定义拦截器(上面几点都不符合但是要对单元格进行操作的参照这个)
* <p>
* demo这里实现2点。
* 1. 对第一行第一列的头超链接到:https://github.com/alibaba/easyexcel
* 2. 对第一列第一行和第二行的数据新增下拉框,显示 测试1 测试2
* <p>
* 1. 创建excel对应的实体对象 参照{@link SimpleWriteEntity}
* <p>
* 2. 注册拦截器 {@link CustomCellWriteHandler} {@link CustomSheetWriteHandler}
* <p>
* 2. 直接写即可
*/
@Test
public void testWriteByCustomHandler() {
File file = FileUtil.readUserHomeFile("WriteByCustomHandler" + System.currentTimeMillis() + SUFFIX_EXCEL_FILE_TYPE);
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(file, SimpleWriteEntity.class).registerWriteHandler(new CustomSheetWriteHandler())
.registerWriteHandler(new CustomCellWriteHandler()).sheet("模板").doWrite(createData(10));
}

EasyExcel保姆级教程(2)
https://github.com/yangxiangnanwill/yangxiangnanwill.github.io/2024/01/03/好好码代码吖/JAVA/POI/EasyExcel保姆级教程(2)/
作者
will
发布于
2024年1月3日
许可协议