Excel4J
:sparkles: Excel operation component based on poi & CSV :sparkles:
Install / Use
/learn @Crab2died/Excel4JREADME
___________ .__ _____ ____.
\_ _____/__ ___ ____ ____ | | / | | | |
| __)_\ \/ // ___\/ __ \| | / | |_ | |
| \> <\ \__\ ___/| |__/ ^ /\__| |
/_______ /__/\_ \\___ >___ >____/\____ |\________|
\/ \/ \/ \/ |__|
(version: 3.1.0)
一. 更新记录
1. v3.x
- 新增CSV(包含基于ExcelField注解)的导出支持
- 新增CSV(包含基于ExcelField注解)的导入支持
- POI升级至v5.2.3版本
- Commons CSV升级至v1.10.0
2. v2.x
- Excel读取支持部分类型转换了(如转为Integer,Long,Date(部分)等) v2.0.0之前只能全部内容转为String
- Excel支持非注解读取Excel内容了,内容存于
List<List<String>>对象内 - 现在支持
List<List<String>>导出Excel了(可以不基于模板) - Excel新增了Map数据样式映射功能(模板可为每个key设置一个样式,定义为:&key, 导出Map数据的样式将与key值映射)
- 新增读取Excel数据转换器接口
com.github.converter.ReadConvertible - 新增写入Excel数据转换器接口
com.github.converter.WriteConvertible - 支持多sheet一键导出,多sheet导出封装Wrapper详见
com.github.sheet.wrapper包内包装类 - 修复以绝对路径指定模板来导出会导致模板被修改的BUG,以及读取Excel数据会修改原Excel文件,建议升级至2.1.4-Final2版本
- 修复已知bug及代码与注释优化
二. 基于注解(/src/test/java/modules/Student2.java)
@ExcelField(title = "学号", order = 1)
private Long id;
@ExcelField(title = "姓名", order = 2)
private String name;
// 写入数据转换器 Student2DateConverter
@ExcelField(title = "入学日期", order = 3, writeConverter = Student2DateConverter.class)
private Date date;
@ExcelField(title = "班级", order = 4)
private Integer classes;
// 读取数据转换器 Student2ExpelConverter
@ExcelField(title = "是否开除", order = 5, readConverter = Student2ExpelConverter.class)
private boolean expel;
三. 读取Excel快速实现
1.待读取Excel(截图)

2. 读取转换器(/src/test/java/converter/Student2ExpelConverter.java)
/**
* excel是否开除 列数据转换器
*/
public class Student2ExpelConverter implements ReadConvertible{
@Override
public Object execRead(String object) {
return object.equals("是");
}
}
3. 读取函数(/src/test/java/base/Excel2Module.java#excel2Object2)
@Test
public void excel2Object2() {
String path = "D:\\JProject\\Excel4J\\src\\test\\resources\\students_02.xlsx";
try {
// 1)
// 不基于注解,将Excel内容读至List<List<String>>对象内
List<List<String>> lists = ExcelUtils.getInstance().readExcel2List(path, 1, 2, 0);
System.out.println("读取Excel至String数组:");
for (List<String> list : lists) {
System.out.println(list);
}
// 2)
// 基于注解,将Excel内容读至List<Student2>对象内
// 验证读取转换函数Student2ExpelConverter
// 注解 `@ExcelField(title = "是否开除", order = 5, readConverter = Student2ExpelConverter.class)`
List<Student2> students = ExcelUtils.getInstance().readExcel2Objects(path, Student2.class, 0, 0);
System.out.println("读取Excel至对象数组(支持类型转换):");
for (Student2 st : students) {
System.out.println(st);
}
} catch (Exception e) {
e.printStackTrace();
}
}
4. 读取结果
读取Excel至String数组:
[10000000000001, 张三, 2016/01/19, 101, 是]
[10000000000002, 李四, 2017-11-17 10:19:10, 201, 否]
读取Excel至对象数组(支持类型转换):
Student2{id=10000000000001, name='张三', date=Tue Jan 19 00:00:00 CST 2016, classes=101, expel='true'}
Student2{id=10000000000002, name='李四', date=Fri Nov 17 10:19:10 CST 2017, classes=201, expel='false'}
Student2{id=10000000000004, name='王二', date=Fri Nov 17 00:00:00 CST 2017, classes=301, expel='false'}
四. 导出Excel
1. 不基于模板快速导出
1) 导出函数(/src/test/java/base/Module2Excel.java#testList2Excel)
@Test
public void testList2Excel() throws Exception {
List<List<String>> list2 = new ArrayList<>();
List<String> header = new ArrayList<>();
for (int i = 0; i < 10; i++) {
List<String> _list = new ArrayList<>();
for (int j = 0; j < 10; j++) {
_list.add(i + " -- " + j);
}
list2.add(_list);
header.add(i + "---");
}
ExcelUtils.getInstance().exportObjects2Excel(list2, header, "D:/D.xlsx");
}
2) 导出效果(截图)

2. 带有写入转换器函数的导出
1) 转换器(/src/test/java/converter/Student2DateConverter.java)
/**
* 导出excel日期数据转换器
*/
public class Student2DateConverter implements WriteConvertible {
@Override
public Object execWrite(Object object) {
Date date = (Date) object;
return DateUtils.date2Str(date, DateUtils.DATE_FORMAT_MSEC_T_Z);
}
}
2)导出函数(/src/test/java/base/Module2Excel.java#testWriteConverter)
// 验证日期转换函数 Student2DateConverter
// 注解 `@ExcelField(title = "入学日期", order = 3, writeConverter = Student2DateConverter.class)`
@Test
public void testWriteConverter() throws Exception {
List<Student2> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(new Student2(10000L + i, "学生" + i, new Date(), 201, false));
}
ExcelUtils.getInstance().exportObjects2Excel(list, Student2.class, true, "sheet0", true, "D:/D.xlsx");
}
3) 导出效果(截图)

3. 基于模板List<Oject>导出
1) 导出函数(/src/test/java/base/Module2Excel.java#testObject2Excel)
@Test
public void testObject2Excel() throws Exception {
String tempPath = "/normal_template.xlsx";
List<Student1> list = new ArrayList<>();
list.add(new Student1("1010001", "盖伦", "六年级三班"));
list.add(new Student1("1010002", "古尔丹", "一年级三班"));
list.add(new Student1("1010003", "蒙多(被开除了)", "六年级一班"));
list.add(new Student1("1010004", "萝卜特", "三年级二班"));
list.add(new Student1("1010005", "奥拉基", "三年级二班"));
list.add(new Student1("1010006", "得嘞", "四年级二班"));
list.add(new Student1("1010007", "瓜娃子", "五年级一班"));
list.add(new Student1("1010008", "战三", "二年级一班"));
list.add(new Student1("1010009", "李四", "一年级一班"));
Map<String, String> data = new HashMap<>();
data.put("title", "战争学院花名册");
data.put("info", "学校统一花名册");
// 基于模板导出Excel
ExcelUtils.getInstance().exportObjects2Excel(tempPath, 0, list, data, Student1.class, false, "D:/A.xlsx");
// 不基于模板导出Excel
ExcelUtils.getInstance().exportObjects2Excel(list, Student1.class, true, null, true, "D:/B.xlsx");
}
2) 导出模板(截图)

3) 基于模板导出结果(截图)

4) 不基于模板导出结果(截图)

4. 基于模板Map<String, Collection<Object.toString>>导出
1) 导出函数(/src/test/java/base/Module2Excel.java#testMap2Excel)
@Test
public void testMap2Excel() throws Exception {
Map<String, List> classes = new HashMap<>();
Map<String, String> data = new HashMap<>();
data.put("title", "战争学院花名册");
data.put("info", "学校统一花名册");
classes.put("class_one", new ArrayList<Student1>() {{
add(new Student1("1010009", "李四", "一年级一班"));
add(new Student1("1010002", "古尔丹", "一年级三班"));
}});
classes.put("class_two", new ArrayList<Student1>() {{
add(new Student1("1010008", "战三", "二年级一班"));
}});
classes.put("class_three", new ArrayList<Student1>() {{
add(new Student1("1010004", "萝卜特", "三年级二班"));
add(new Student1("1010005", "奥拉基", "三年级二班"));
}});
classes.put("class_four", new ArrayList<Student1>() {{
add(new Student1("1010006", "得嘞", "四年级二班"));
}});
classes.put("class_six", new ArrayList<Student1>() {{
add(new Student1("1010001", "盖伦", "六年级三班"));
add(new Student1("1010003", "蒙多", "六年级一班"));
}});
ExcelUtils.getInstance().exportObject2Excel("/map_template.xlsx",
0, classes, data, Student1.class, false, "D:/C.xlsx");
}
2) 导出模板(截图)

3) 导出结果(截图)

五. Excel模板自定义属性,不区分大小写
1) 具体代码定义详见(/src/main/java/com/github/crab2died/handler/HandlerConstant)
2) Excel模板自定义属性,不区分大小写
| 定义符 | 描述 |优先级(大到小)| |:-------------------|:---------------|:----------:| |$appoint_line_style |当前行样式 | 3 | |$single_line_st
Related Skills
node-connect
347.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
347.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
347.0kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
