2.2.3、复杂表头的生成
很多时候我们需要导出的文件,表头比较复杂,例如,我们想导出如下图这样一个复杂表头,应该如何实现呢?
如果你是使用在实体类上添加注解方式生成文件,那么可以通过如下方式来实现:
public class UserEntity { @ExcelProperty(value = "班级") private String className; @ExcelProperty({"学生信息", "姓名"}) private String name; @ExcelProperty({"学生信息", "年龄"}) private int age; @DateTimeFormat("yyyy-MM-dd HH:mm:ss") @ExcelProperty({"学生信息", "入学时间"}) private Date time; //set、get... }
其中{"学生信息", "姓名"}
这种表达式,表示在当前列,插入多行数据,第一行插入的是学生信息
名称,第二行,插入的是姓名
名称,因此形成多级表头!
如果你是使用的动态参数化生成文件,操作也同样类似,示例代码如下:
public static void main(String[] args) throws FileNotFoundException { //定义多级表头 List<List<String>> headList = new ArrayList<>(); headList.add(Lists.newArrayList("班级")); headList.add(Lists.newArrayList("学生信息", "姓名")); headList.add(Lists.newArrayList("学生信息","年龄")); headList.add(Lists.newArrayList("学生信息","入学时间")); //定义数据体 List<List<Object>> dataList = new ArrayList<>(); for (int i = 0; i < 10; i++) { List<Object> data = new ArrayList<>(); data.add("一年级~1班"); data.add("张三" + i); data.add(20 + i); data.add(new Date(System.currentTimeMillis() + i)); dataList.add(data); } //定义文件输出位置 FileOutputStream outputStream = new FileOutputStream(new File("/Users/panzhi/Documents/easyexcel-export-user3.xlsx")); EasyExcel.write(outputStream).head(headList).sheet("用户信息").doWrite(dataList); }
其中Lists.newArrayList("学生信息", "姓名")
表达的意思跟上面一样,在当前列下插入多行,类似于:
List<String> list = new ArrayList<>(); list.add("学生信息"); list.add("姓名");
Lists.newArrayList
编程来自于guava
工具包!
2.2.4、自定义样式
在实际使用过程中,我们可能还需要针对文件做一下样式自定义,例如你想把表头设置为红色,内容设置为绿色,列宽、行宽都加大,应该如何实现呢?
操作也很简单,编写一个自定义样式类,然后在写入的时候注入进去。
/** * 自定义样式 * @return */ private static HorizontalCellStyleStrategy customerStyle(){ // 头的策略 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); return horizontalCellStyleStrategy; }
在写入的时候,将其注入,例如下面的动态导出:
//通过registerWriteHandler方法,将自定义的样式类注入进去 EasyExcel.write(outputStream).registerWriteHandler(customerStyle()).head(headList).sheet("用户信息").doWrite(dataList);
2.3、导入 excel
easyexcel 的导入同样也支持两种方式,和上面一样,一种是通过实体类注解方式来读取文件,另一种是通过动态监听器读取文件。
2.3.1、实体类注解方式来读取文件
实体类注解方式来读取文件时,要读取的 excel 表头需要与实体类一一对应,以下面的 excel 文件为例!