你要的不固定列excel导入导出,它来啦!(二)

2.2.3、复杂表头的生成

很多时候我们需要导出的文件,表头比较复杂,例如,我们想导出如下图这样一个复杂表头,应该如何实现呢?

你要的不固定列excel导入导出,它来啦!(二)

如果你是使用在实体类上添加注解方式生成文件,那么可以通过如下方式来实现:

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、自定义样式

在实际使用过程中,我们可能还需要针对文件做一下样式自定义,例如你想把表头设置为红色,内容设置为绿色,列宽、行宽都加大,应该如何实现呢?

你要的不固定列excel导入导出,它来啦!(二)

操作也很简单,编写一个自定义样式类,然后在写入的时候注入进去。

/**
 * 自定义样式
 * @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 文件为例!

你要的不固定列excel导入导出,它来啦!(二)

上一篇:TD缺陷通过excel导入QC11.0缺陷库


下一篇:sql导出导入excel表