-
Notifications
You must be signed in to change notification settings - Fork 66
4 静态设置样式
Excel样式包含格式化NumFmt、字体Font、填充Fill、边框Border、 垂直对齐Verticals和水平对齐Horizontals以及自动折行组成, EEC简化了样式设计,单元格样式由一个int值保存,它可以极大减少内存开销和提升查找速度,但短板是可用的样式减少,当前最多只能包含256个格式化,64个字体、64个填充和64个边框, 对于日常的导出需求应该是够用的但复杂场景就需要考虑将int扩大到long。
相对于动态样式而言,设置静态样式是一次性的在初始化的时候计算所以并不会影响导出速度,默认的样式大多数情况下并不能满足每个人的审美, 好在EEC有多种方式修改默认的表头或者数据行的样式。
v0.5.28支持使用setHeaderFont、setHeaderFill、setHeaderBorder、setHeaderHorizontal、setHeaderVertical、setHeaderWrapText和setHeaderNumFmt方法来修改表头样式,注意设置任意表头样式会忽略默认表头样式(不是覆盖部分样式)
示例代码:
new Workbook().addSheet(new ListSheet<>(randomTestData()
, new Column("NAME", "name").setHeaderFill(NONE_FILL).setHeaderHorizontal(Horizontals.CENTER)
, new Column("SCORE", "score").setHeaderFont(new Font("微软雅黑", 20)).setHeaderFill(new Fill(Styles.toColor("#E9EAEC"))).setHeaderHorizontal(Horizontals.CENTER)
)).writeTo(Paths.get("F:/excel"));-
Sheet#setHeaderXxx:设置整个工作表的默认表头样式 -
Column#setHeaderXxx:覆盖某一列或某一级表头的局部样式
优先级如下:
Column#setHeaderXxx(...) > Sheet#setHeaderXxx(...) > 默认表头样式
通常建议先在Sheet上定义一套默认表头,再在个别列上做局部覆盖。
ListSheet<Student> sheet = new ListSheet<>(Student.randomTestData()
, new Column("姓名", "name").setHeaderFill(Fill.NONE_FILL) // 仅覆盖填充
, new Column("分数", "score").setHeaderFont(new Font("微软雅黑", 20)) // 仅覆盖字体
);
// 设置工作表整体表头样式
sheet.setHeaderFont(new Font("微软雅黑", 18, Font.Style.BOLD))
.setHeaderFill(new Fill(Styles.toColor("#D9EAF7")))
.setHeaderHorizontal(Horizontals.RIGHT)
.setHeaderVertical(Verticals.BOTTOM)
.setHeaderWrapText(true);
new Workbook().addSheet(sheet).writeTo(Paths.get("F:/excel"));最终效果是:
- “姓名”列继承
Sheet上的字体、对齐和折行,但填充使用自己的Fill.NONE_FILL - “分数”列继承
Sheet上的填充、对齐和折行,但字体使用自己的Font - 若某列直接调用
setHeaderStyle(int),则整列表头完全使用这个自定义样式,不再继续叠加Sheet上的表头默认值
v0.5.28以下版本可以使用下面的方式修改
Worksheet暴露了几个修改表头样式的方法setHeadStyle或setHeadStyleIndex可以通过这些方法设置表头样式,每个Worksheet都可以设置不同的表头。
修改样式前必须先实例化Workbook然后才能修改样式。下面的示例展示如何修改表头字体、背景和边框
ListSheet<Item> sheet = new ListSheet<>(Item.randomTestData());
// 必须先执行这一步,将Worksheet添加到Workbook
Workbook workbook = new Workbook("Custom header style").addSheet(sheet);
// 然后才能修改样式
sheet.setHeadStyle(new Font("微软雅黑", 18, Font.Style.BOLD, Color.black)
, new Fill(PatternType.gray0625, Color.lightGray)
, new Border(BorderStyle.DOUBLE, Color.red));
workbook.writeTo(Paths.get("F:/excel"));效果如下:

其中BorderStyle效果如下

PatternType效果如下

如果仅需要修改表头的部分样式时则可以先获取原有样式然后再修改部分属性即可。 下面的示例展示修改部分表头的部分属性,比如修改字体、修改填充色等
ListSheet<Item> sheet = new ListSheet<>(Collections.singletonList(new Item()));
Workbook workbook = new Workbook().addSheet(sheet);
Styles styles = workbook.getStyles();
int style = sheet.defaultHeadStyle();
// 仅修改字体颜色
Font font = styles.getFont(style).clone() // 先获取原有样式并复制(不然会影响原样式)
.setColor(new Color(191, 191, 191)); // 设置新的样式
int newStyle = styles.modifyFont(style, font); // 将新字体添加进样式表
// 修改填充色
int borderStyle = styles.modifyFill(style, new Fill(PatternType.solid, new Color(247, 150, 70)));
sheet.setColumns(new Column[] {
new Column("商品名称", "productName").setWidth(20.0D).setWrapText(true)
, new Column("商品编码", "goodsNo").setHeaderStyle(borderStyle)
, new Column("规格型号", "model")
, new Column("品牌", "brandNameCn").setWidth(12.63D)
, new Column("单位", "measure").setWidth(9.63D)
, new Column("在库库存(勿改)", "quantity").setWidth(16.25D).setNumFmt("###0").setHeaderStyle(newStyle)
, new Column("盘点库存", "editQuantity").setWidth(12.63D).setHeaderStyle(borderStyle)
});效果如下:

可以看到"在库库存"列观感上就给用户不能修改的视觉,这样可以避免用户将库存填写在此列,而应该填写在”盘点库存“列,并且将两列必填项的背景改为橙色可以着重显示。
清除表头样式就比较简单了,可以直接给StyleIndex赋值为0即可。
ListSheet<Item> sheet = new ListSheet<>(Item.randomTestData());
Workbook workbook = new Workbook("Custom header style").addSheet(sheet);
// Style Index设置为【0】
sheet.setHeadStyleIndex(0);
workbook.writeTo(Paths.get("F:/excel"));效果如下:

与表头类似Column也提供了类似的方法,用户可以通过setCellStyle方法修改样式,这里就不赘述了,也支持动态修改样式,请参照动态设置样式
v0.5.12提供所有样式修改,你可以在创建Column时调用setFont,setBorder,setNumFmt,setFill,setHorizontal和setVertical等方法直接设置初始样式
new Workbook()
.setAutoSize(true) // <- 自适应列宽
.addSheet(new ListSheet<>(randomTestData()
, new Column("编码", "code").setFont(new Font("Trebuchet MS", 20))
, new Column("姓名", "name").setFont(new Font("Trebuchet MS", 20)).setHorizontal(Horizontals.CENTER) // <-- 设置水平居中
, new Column("日期", "date").setFont(new Font("华文行楷", 11)).setNumFmt("yyyy-mm-dd hh:mm:ss")
, new Column("数字", "num").setFont(new Font("Bauhaus 93", 14)).setNumFmt("#,##0_);[Red]-#,##0_);0_)") // <- 指定字体和格式化
)).writeTo(Paths.get("F:/excel"));
让JAVA操作excel更简单