由于公司内部之前对于excel封装操作并不是很方便,而且对于特殊的需求不是很容易满足,这个月的任务是迁移部分业务小报表顺便重构下,因此这里造个轮子,便于导入和导出对应的excel报表。
https://github.com/mrdear/easy-excel
ExcelWriter
一样的操作。实体类
实体类使用注解标识字段,不使用的话则属性名会作为对应的columnName
。
public class UserWithAnnotation {
@ExcelField(columnName = "用户名")
private String username;
@ExcelField(columnName = "用户密码")
private String passwd;
@ExcelField(columnName = "登录日期",
writerConvert = DateToStringConvert.class,
readerConvert = StringToDateConvert.class)
private Date date;
}
export
@Test
public void testSimpleWithAnnotationExport() {
List<UserWithAnnotation> users = mockUserWithAnnotation(5);
EasyExcel.export("/tmp/test.xlsx")
.export(ExcelWriteContext.builder()
.datasource(users)
.sheetName("user")
.build())
.write();
}
import
@Test
public void testRead2() {
InputStream inputStream = SimpleExcelReaderTest.class
.getClassLoader().getResourceAsStream("user2.xlsx");
ExcelReader reader = EasyExcel.read(inputStream);
List<UserWithAnnotation> result = reader.resolve(ExcelReadContext.<UserWithAnnotation>builder()
.clazz(UserWithAnnotation.class)
.build());
Assert.assertEquals(result.size(), 5);
Assert.assertEquals(result.get(0).getPasswd(), "0b6df627-5975-417b-abc9-1f2bad5ca1e2");
Assert.assertEquals(result.get(1).getUsername(), "张三1");
reader.close();
}
sheet1最顶部有自定义的title
sheet2为普通表格
export 由于自定义的title往往非常复杂且多变,很难做到通用,因此这里是直接抛出一个钩子,可以自己实现自己想要的任何操作。
@Test
public void testCustom() {
List<UserWithAnnotation> users = mockUserWithAnnotation(5);
EasyExcel.export("/tmp/test.xlsx")
.export(ExcelWriteContext.builder()
.datasource(users)
.sheetName("user1")
.createSheetHook((sheet, context) -> {
Row row = sheet.createRow(0);
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
Cell cell = row.createCell(0);
cell.setCellValue("custom header");
})
.startRow(1)
.build())
.export(ExcelWriteContext.builder()
.datasource(users)
.sheetName("user2")
.build())
.write();
}
import
@Test
public void testCustom() {
InputStream inputStream = SimpleExcelReaderTest.class
.getClassLoader().getResourceAsStream("user3.xlsx");
ExcelReader reader = EasyExcel.read(inputStream);
List<UserWithAnnotation> sheet1Result = reader.resolve(ExcelReadContext.<UserWithAnnotation>builder()
.clazz(UserWithAnnotation.class)
.headerStart(1)
.sheetIndex(0)
.readSheetHook((sheet, context) -> {
Row row = sheet.getRow(0);
Assert.assertEquals(row.getCell(0).getStringCellValue(), "custom header");
})
.build());
Assert.assertEquals(sheet1Result.size(), 5);
Assert.assertEquals(sheet1Result.get(1).getUsername(), "张三1");
List<UserWithAnnotation> sheet2Result = reader.resolve(ExcelReadContext.<UserWithAnnotation>builder()
.clazz(UserWithAnnotation.class)
.sheetIndex(1)
.build());
Assert.assertEquals(sheet2Result.size(), 5);
Assert.assertEquals(sheet2Result.get(1).getUsername(), "张三1");
}
提供ResponseHelper
从HttpServletResponse
获取对应的输出流,然后放入
OutputStream outputStream = ResponseHelper.wrapper(response, "order.xlsx");
EasyExcel.export(outputStream)....