Skip to content
guanquan.wang edited this page Jan 7, 2025 · 5 revisions

如何设置样式

样式设置放在表头Column对象上,使用以下setFont,setFill,setBorder,setNumFmt,setVertical,setHorizontal,setWrapText7个方法设置字体,填充,边框,格式化,垂直对齐,水平对齐和自动折行 7个样式, 由于EEC包含边框、字体和水平对齐3个打底样式,要去除这些打底样式则需要设置新的样式来替换,边框可以使用new Border()空边框来清除

new Workbook()
    .setAutoSize(true) // <- 自适应列宽
    .addSheet(new ListSheet<>(randomTestData()
        , new Column("整型", "nv").setNumFmt("#,##0_);[Red]-#,##0_);0_)").setFont(new Font("Bauhaus 93", 16))
        , new Column("字符串(EN)", "sen").setFont(new Font("Trebuchet MS", 20))
        , new Column("字符串(中文)", "scn").setFont(new Font("微软雅黑", 8))
        , new Column("日期", "iv").setNumFmt("yyyy-mm-dd hh:mm:ss").setFont(new Font("华文行楷", 14))
        )).writeTo(Paths.get("F:/excel/1.xlsx"));

自动列宽2

如何忽略表头

Sheet#ignoreHeader可忽略表头

new Workbook()
    .addSheet(new EmptySheet().ignoreHeader()) // <- 忽略表头
    .writeTo(Paths.get("F:/excel/1.xlsx"));

如何进行数据转换

简单转换可以使用ConversionProcessor,它仅有一个入参和出参作用于Column列

如下代码展示将成绩小于60分的转换为"不合格"

new Workbook()
    .addSheet(new ListSheet<>(
         new Column("学号", "id"),
         new Column("姓名", "name"),
         new Column("成绩", "score", n -> (int) n < 60 ? "不合格" : n)
    )).writeTo(Paths.get("F:/excel/1.xlsx"));

ConversionProcessor只支持输出转换,如果需要输入转换的话则需要使用Converter接口,它具有两个方法:一个为conversion输出转换,一个为reversion输入转换

下面代码展示将“status”转为状态文本,导入时将状态文本转换'status'值

public class Item {
    // 设置转换器
    @ExcelColumn(converter = StatusConvert.class)
    private int status;
}

public class StatusConvert implements Converter<Integer> {
    final String[] statusDesc = { "未开始", "进行中", "完结", "中止" };

    @Override
    public Integer reversion(Row row, Cell cell, Class<?> fieldClazz) {
        for (int i = 0; i < statusDesc.length; i++) {
            if (statusDesc[i].equals(row.getString(cell))) {
                return i;
            }
        }
        return null;
    }

    @Override
    public Object conversion(Object v) {
        return v != null ? statusDesc[(int) v] : null;
    }
}

如何设置斑马线

斑马线有利于阅读,EEC使用XMLZebraLineCellValueAndStyle添加斑马线,除表头外每隔一行设置一个填充色做为斑马线样式

如下示例展示设置橙色斑马线

new Workbook()
    .addSheet(new ListSheet<>(Item.randomTestData())
        .setCellValueAndStyle(new XMLZebraLineCellValueAndStyle(new Fill(PatternType.solid, Color.orange))))
    .writeTo(Paths.get("F:/excel/斑马线.xlsx"));

如何设置自适应列宽

EEC支持工作簿、工作表和指定列三个维度设置自适应列宽,它们的关键词都是AutoSize

new Workbook()
    .setAutoSize(true)   // <- 作用于工作薄,所有工作表都自适应列宽
    .addSheet(new EmptySheet())
    .addSheet(new EmptySheet())
    .writeTo(Paths.get("F:/excel/1.xlsx"));

new Workbook()
    .addSheet(new EmptySheet().autoSize()) // <- 作用于工作表
    .writeTo(Paths.get("F:/excel/1.xlsx"));

new Workbook()
    .addSheet(new ListSheet<>(
        new Column("学号", "id"),
        new Column("姓名", "name").autoSize(), // <- 作用某一列
        new Column("成绩", "score"))
    ).writeTo(Paths.get("F:/excel/1.xlsx"));

如何设置缩放

缩放是通过扩展参数设置,对应Key为Const.ExtendPropertyKey.ZOOM_SCALE,范围10-400对应缩放比例10%到400%

new Workbook()
    .addSheet(new EmptySheet().putExtProp(Const.ExtendPropertyKey.ZOOM_SCALE, 70)) // <- 设置70%缩放
    .writeTo(Paths.get("F:/excel/1.xlsx"));

缩放

扩展参数说明

由于程序越写越复杂,工作表Worksheet新添加功能都需要定义新的属性,为了限制无限增加的属性所以将这些属性放到扩展参数中,扩展参数由一个Map组成,使用putExtProp设置属性getExtPropValue获取扩展属性

当前已支持扩展属性有

属性 用途 类型
FREEZE 冻结窗格 Dimension
STYLE_DESIGN 运态样式 StyleProcessor
MERGE_CELLS 合并单元格 List<Dimension>
AUTO_FILTER 筛选 Dimension
DATA_VALIDATION 数据验证 List<Validation>
ZOOM_SCALE 缩放 Integer

可能出现的几种异常

  • java.lang.NoSuchMethodError: org.dom4j.io.SAXReader.createDefault()Lorg/dom4j/io/SAXReader; 这个异常是因为dom4j版本不一致,EEC使用的是org.dom4j:dom4j:2.1.3,如果项目中已引入dom4j则需要排除已有的低版本dom4j,低版本dom4j存在XXE安全漏洞不建议使用