乐于分享
好东西不私藏

JQuick-Excel 导出 STYLE 配置项使用手册

JQuick-Excel 导出 STYLE 配置项使用手册

JQuick-Excel 导出 STYLE 配置项使用手册

本手册专门介绍 jquick-excel 导出场景中的 STYLE 配置项,包括语法结构、目标范围、可用样式属性、执行顺序、与主题/公式/流式导出的关系,以及实际使用中的坑点。

文档示例统一采用 XML / DSL 声明式写法,方便直接落到 jquick-excel.xml


目录

    1. STYLE 是什么
    1. 基础语法
    • 3.1 行样式
    • 3.2 列样式
    • 3.3 单元格样式
    • 3.4 区域样式
    1. 四类目标范围
    1. STYLE 的执行时机
    • 5.1 字体类属性
    • 5.2 对齐类属性
    • 5.3 边框类属性
    • 5.4 填充类属性
    • 5.5 其他单元格属性
    • 5.6 行专属属性
    1. 可用样式属性
    1. 最小可运行示例
    • 7.1 表头高亮
    • 7.2 数据列统一样式
    • 7.3 单元格重点标记
    • 7.4 行高与隐藏行
    • 7.5 组合样式
    1. 常见配置示例
    1. STYLE 与 THEME / FORMULAS / TRANSFORM 的关系
    1. STYLE 与 SXSSF 流式导出的限制
    1. 当前实现特性与注意事项
    1. 常见问题与避坑指南
    1. 推荐实践

1. STYLE 是什么

STYLE 用于在Excel 导出阶段对已经写入到工作表中的行、列、单元格应用样式。

它解决的问题不是“字段值怎么转换”,而是“最终 Excel 长什么样”。

典型场景:

  • 表头加粗、变色、居中
  • 某一列统一设置边框、对齐、背景色
  • 对特定单元格做高亮提示
  • 调整行高、隐藏辅助行
  • 给汇总区、备注区设置不同视觉风格

一句话理解:

TRANSFORM 负责“值”STYLE 负责“样子”

2. 基础语法

STYLE 的基本结构如下:

STYLE = {    目标: {        样式属性: 值,        样式属性: 值    },    目标: {        样式属性: 值    }}

在完整导出 DSL 中通常这样写:

<![CDATA[    EXPORT WITH        SHEET=”学生表”,        HEADER=true,        MAPPING={            ”id”:”主键”,            ”name”:”姓名”,            ”gender”:”性别”,            ”age”:”年龄”        },        STYLE={            ROW 1: {                fontName: Arial,                fontHeightInPoints: 12,                italic: true,                color: yellow,                bold: true            }        }    ]]>

说明:

部分
说明
STYLE
固定关键字,表示样式配置块
目标
可以是行、列、单元格、区域
样式属性
具体样式项,如 boldalignmentborderBottom
字符串、数字、布尔值等
多目标
使用英文逗号分隔

3. 四类目标范围

从解析器和导出实现看,STYLE 支持以下四类目标:

  • 行样式 ROW
  • 列样式 COL
  • 单元格样式 A1
  • 区域样式 A1:C5

不过要特别注意:当前导出执行逻辑只真正应用了 行 / 列 / 单元格 三类样式,RANGE虽然能被解析并存入配置,但在applyStyle中没有真正落地执行。

3.1 行样式

语法:

STYLE={    ROW 1: {        boldtrue,        color: red    }}

也支持行范围:

STYLE={    ROW 2..5: {        heightInPoints: 30,        alignment: center    }}

含义:

  • 对第 1 行所有已存在单元格应用样式
  • 对第 2~5 行所有已存在单元格应用相同样式

适合场景:

  • 表头行
  • 汇总行
  • 备注行
  • 整行强调展示

3.2 列样式

语法:

STYLE={    COL D: {        alignment: right,        borderBottom: thin    }}

也支持列范围:

STYLE={    COL B..E: {        wrapTexttrue,        verticalAlignment: center    }}

含义:

  • 对指定列中所有已遍历到的行应用样式
  • 如果某行该列单元格不存在,会自动创建该单元格再设置样式

适合场景:

  • 年龄列、金额列统一右对齐
  • 日期列统一居中
  • 某一组指标列统一边框和背景色

3.3 单元格样式

语法:

STYLE={    A1: {        boldtrue,        color: white,        fillForegroundColor: blue,        fillPattern: solid_foreground    }}

含义:

  • 只对单个目标单元格应用样式
  • 若单元格不存在,会自动创建

适合场景:

  • 特定标题格
  • 汇总结果格
  • 风险提示格
  • 手工标识位

3.4 区域样式

语法:

STYLE={    A1:C3: {        borderBottom: thin,        borderTop: thin,        alignment: center    }}

源码现状说明:

  • 解析器支持 rangeStyle
  • 访问器会把区域样式存入 config.getRangeStyles()
  • 但当前 JExcelExportHandler.applyStyle(...) 只处理了:
    • rowStyles
    • colStyles
    • cellStyles
  • 没有处理 rangeStyles

所以当前版本里:

RANGE 样式语法可写,但不会真正生效

如果你需要区域样式,当前更稳妥的做法是:

  • 拆成多行样式
  • 或拆成多列样式
  • 或逐个单元格样式

4. STYLE 的执行时机

从导出处理流程看,执行顺序如下:

写表头 → 写数据 → 应用公式 → 应用样式 → 应用合并 → 应用图表

这意味着:

  1. 先把数据和表头写到 sheet
  2. 再应用 FORMULAS
  3. 再执行 STYLE

因此 STYLE 是对“已经存在的工作表内容”做修饰。

这也带来两个重要结论:

  • 样式可以覆盖公式单元格
  • 样式在大数据场景下常常意味着“回头修改已写过的行”

后者与流式写出有冲突,后面会专门讲。


5. 可用样式属性

从 JCellStyle、JRowStyle、JFontStyle、JStyleHelper 和字体构建逻辑来看,当前 STYLE 支持的属性主要分为以下几类。

5.1 字体类属性

属性
类型
示例
说明
fontName
string
Arial
字体名称
fontHeightInPoints
number
12
字体大小(pt)
fontHeight
number
240
字体高度(POI 原始单位)
bold
boolean
true
是否加粗
italic
boolean
true
是否斜体
underLine
string
single
下划线类型
color
string
red
字体颜色
strikeout
boolean
true
删除线

示例:

STYLE={    ROW 1: {        fontNameArial,        fontHeightInPoints12,        boldtrue,        italicfalse,        color: white,        underLine: single    }}

underLine 不是布尔值,而是字符串类型的下划线样式名称。

5.2 对齐类属性

属性
类型
可选值
说明
alignment
string
left
 / right / center / general / fill / justify / distributed / center-section
水平对齐
verticalAlignment
string
top
 / bottom / center / justify / distributed
垂直对齐
wrapText
boolean
true
 / false
自动换行
rotation
number
0
90 等
文本旋转
indention
number
1
2 等
缩进
shrinkToFit
boolean
true
 / false
缩小字体填充

示例:

STYLE={    COL B: {        alignment: center,        verticalAlignment: center,        wrapTexttrue    }}

5.3 边框类属性

属性
类型
示例
说明
borderLeft
string
thin
左边框
borderRight
string
thin
右边框
borderTop
string
medium
上边框
borderBottom
string
double
下边框
leftBorderColor
string
red
左边框颜色
rightBorderColor
string
blue
右边框颜色
topBorderColor
string
green
上边框颜色
bottomBorderColor
string
black
下边框颜色

支持的边框样式值:

  • none
  • thin
  • medium
  • dashed
  • dotted
  • thick
  • double
  • hair
  • medium_dashed
  • dash_dot
  • medium_dash_dot
  • dash_dot_dot
  • medium_dash_dot_dot
  • slanted_dash_dot

示例:

STYLE={    A1: {        borderLeft: thin,        borderRight: thin,        borderTop: medium,        borderBottom: medium,        leftBorderColor: red,        rightBorderColor: red    }}

5.4 填充类属性

属性
类型
示例
说明
fillPattern
string
solid_foreground
填充图案
fillForegroundColor
string
blue
前景色
fillBackgroundColor
string
yellow
背景色

支持的 fillPattern 常见值:

  • no_fill
  • solid_foreground
  • fine_dots
  • alt_bars
  • sparse_dots
  • thick_horz_bands
  • thick_vert_bands
  • thick_backward_diag
  • thick_forward_diag
  • big_spots
  • bricks
  • thin_horz_bands
  • thin_vert_bands
  • thin_backward_diag
  • thin_forward_diag
  • squares
  • diamonds
  • less_dots
  • least_dots

示例:

STYLE={    A1: {        fillPattern: solid_foreground,        fillForegroundColor: blue,        color: white,        boldtrue    }}

仅设置颜色通常不够,建议同时设置 fillPattern: solid_foreground,否则填充色可能看不出来。

5.5 其他单元格属性

属性
类型
示例
说明
hidden
boolean
true
隐藏公式等内容
locked
boolean
true
锁定单元格
quotePrefixed
boolean
true
前置单引号语义
dataFormat
number
14
数据格式索引
dataFormatString
string
yyyy-MM-dd
数据格式字符串(当前 helper 未实际应用)

说明:

  • hidden
     / locked 已在 helper 中真正应用
  • dataFormat
     / dataFormatString 在模型中存在,但当前 JStyleHelper.applyCellStyle(...) 没有实际设置逻辑
  • 如果要处理显示格式,当前更推荐优先使用独立的 FORMAT 配置项,而不是依赖 STYLE 中的 dataFormat

5.6 行专属属性

这些属性主要用于 ROW 样式:

属性
类型
示例
说明
height
number
800
行高(原始单位)
heightInPoints
number
30
行高(pt)
zeroHeight
boolean
true
是否隐藏整行
rowStyle
object
{...}
行级内部样式对象(更偏底层用法)

示例:

STYLE={    ROW 1: {        heightInPoints30,        boldtrue,        alignment: center    }}

日常 XML 配置里更常用的是 heightInPointsboldcolor 这类直观属性。rowStyle 更偏底层编程式能力。


6. 最小可运行示例

<![CDATA[    EXPORT WITH        SHEET=”学生表”,        HEADER=true,        MAPPING={            ”id”:”主键”,            ”name”:”姓名”,            ”gender”:”性别”,            ”age”:”年龄”        },        STYLE={            ROW 1: {                fontName: Arial,                fontHeightInPoints: 12,                bold: true,                color: white,                fillPattern: solid_foreground,                fillForegroundColor: blue,                alignment: center,                verticalAlignment: center            }        }    ]]>

效果:

  • 第 1 行表头加粗
  • 字体白色
  • 背景蓝色
  • 水平、垂直居中

7. 常见配置示例

7.1 表头高亮

<![CDATA[    EXPORT WITH        SHEET=”学生表”,        HEADER=true,        STYLE={            ROW 1: {                bold: true,                color: white,                fillPattern: solid_foreground,                fillForegroundColor: navy,                alignment: center,                verticalAlignment: center,                heightInPoints: 28            }        }    ]]>

用途:

  • 做标题区、表头区高亮

7.2 数据列统一样式

<![CDATA[    EXPORT WITH        SHEET=”学生表”,        HEADER=true,        STYLE={            COL D: {                alignment: right,                borderBottom: thin,                borderLeft: thin,                borderRight: thin            },            COL E: {                alignment: center,                wrapText: true            }        }    ]]>

用途:

  • 数值列右对齐
  • 日期列或说明列统一样式

7.3 单元格重点标记

<![CDATA[    EXPORT WITH        SHEET=”学生表”,        HEADER=true,        STYLE={            A1: {                bold: true,                fillPattern: solid_foreground,                fillForegroundColor: red,                color: white            },            D5: {                bold: true,                borderTop: double,                borderBottom: double,                alignment: center            }        }    ]]>

用途:

  • 特殊标题格
  • 汇总结果格
  • 警示信息格

7.4 行高与隐藏行

<![CDATA[    EXPORT WITH        SHEET=”学生表”,        HEADER=true,        STYLE={            ROW 1: {                heightInPoints: 32,                bold: true            },            ROW 10: {                zeroHeight: true            }        }    ]]>

用途:

  • 拉高表头
  • 隐藏辅助行

7.5 组合样式

<![CDATA[    EXPORT WITH        SHEET=”学生表”,        HEADER=true,        STYLE={            ROW 1: {                bold: true,                color: white,                fillPattern: solid_foreground,                fillForegroundColor: blue,                alignment: center,                verticalAlignment: center,                borderBottom: medium,                bottomBorderColor: white,                heightInPoints: 30            },            COL D: {                alignment: right,                borderRight: thin            },            D5: {                bold: true,                fillPattern: solid_foreground,                fillForegroundColor: yellow,                color: red,                borderTop: double,                borderBottom: double            }        }    ]]>

用途:

  • 表头、数据列、汇总格同时做差异化视觉设计

8. STYLE 与 THEME / FORMULAS / TRANSFORM 的关系

8.1 与 THEME 的关系

jquick-excel 已经支持主题模板,导出时默认会先给表头和数据区套主题样式。

STYLE 的定位更像“主题之上的精细化覆盖”。

可以这样理解:

THEME 负责整体视觉基调STYLE 负责局部精修

适合做法:

  • 先选一个主题作为基础皮肤
  • 再用 STYLE 对表头、汇总区、关键单元格做定制

8.2 与 FORMULAS 的关系

执行顺序上:

FORMULAS → STYLE

因此:

  • 公式单元格可以再被样式修饰
  • 常见做法是给汇总公式结果格设置加粗、背景色、边框

8.3 与 TRANSFORM 的关系

两者关注点完全不同:

配置项
作用阶段
作用内容
TRANSFORM
写值时
数据转换
STYLE
写值后
视觉样式

一般来说:

  • TRANSFORM
     解决数据值长什么样
  • STYLE
     解决用户看到的表格长什么样

9. STYLE 与 SXSSF 流式导出的限制

这是 STYLE 在大数据导出里最重要的限制之一。

因为 STYLE 的执行发生在数据写完之后,它通常需要:

  • 回头取某一行
  • 回头取某一列的单元格
  • 回头修改已写入的 cellStyle

而 SXSSF 流式写入的特点是:

  • 只保留有限窗口内的行在内存里
  • 更早的行可能已经刷盘
  • 刷盘后不允许再安全回写

因此当前框架已经做了保护:

  • 只要配置中出现 ROW / COLUMN / CELL / RANGE 样式
  • needsRandomRowAccess(config)
     就会返回 true
  • 自动禁用 SXSSF
  • 降级回 XSSFWorkbook

也就是说:

只要用了 STYLE,通常就不再走纯流式导出

这很合理,因为样式本质上就是“回头修饰”。


10. 当前实现特性与注意事项

这一节很重要,属于“站在程序员角度必须知道的实现细节”。

10.1 行样式只会作用于“该行已存在的单元格”

行样式策略内部是遍历:

for (int i = 0; i < row.getLastCellNum(); i++)

因此:

  • 只会处理该行当前已有的单元格
  • 不会主动补齐不存在的后续单元格

10.2 列样式会自动创建缺失单元格

列样式策略内部如果某行该列单元格不存在,会自动 createCell(colNum)。

因此列样式通常比行样式更“主动”。

10.3 单元格样式会自动创建行和单元格

如果目标格对应的行或单元格不存在,单元格样式策略会自动创建。

所以单元格样式是最稳妥的精确控制方式。

10.4 RANGE 样式当前不会真正生效

再次强调一遍:

  • 解析支持
  • 配置模型支持
  • 访问器支持
  • 导出应用逻辑未接入

如果你写:

STYLE={    A1:C3: {        borderBottom: thin    }}

当前版本里大概率不会生效。

10.5 dataFormat / dataFormatString 当前不建议通过 STYLE 使用

虽然模型里有这两个字段,但 helper 当前没有真正落地这两个属性。

建议:

  • 显示格式优先使用 FORMAT 配置项
  • STYLE
     主要用来做字体、对齐、边框、填充、行高这类视觉控制

11. 常见问题与避坑指南

11.1 为什么我设置了背景色但没显示?

大概率是少了:

fillPatternsolid_foreground

推荐这样一起写:

fillPatternsolid_foreground,fillForegroundColorblue

11.2 为什么 RANGE 样式写了没效果?

因为当前版本的 applyStyle 没有处理 rangeStyles。

解决方式:

  • 拆成多行
  • 拆成多列
  • 或多个单元格单独写

11.3 为什么用了 STYLE 后流式导出没生效?

因为框架检测到样式配置需要随机访问已写行,会自动禁用 SXSSF,回退到 XSSF。

11.4 ROW 1 是第 0 行还是第 1 行?

按 Excel 习惯,ROW 1 就是第一行,不是 Java 下标 0。

11.5 列目标应该写数字还是列字母?

当前实现两种都能兼容一部分:

  • 数字列索引
  • 类似 D 这种列标识

但从可读性和 DSL 风格上,推荐统一写COL D、COL B..E这种 Excel 风格表达

11.6 字体颜色、边框颜色、填充颜色支持什么值?

当前是通过颜色枚举映射的,推荐使用常见英文颜色名,例如:

  • red
  • blue
  • yellow
  • green
  • white
  • black
  • navy

如果某个颜色名无效,优先换成常见基础色测试。

11.7 行样式为什么没有作用到空白单元格?

因为行样式只处理该行已经存在的单元格,不会自动把这一整行所有可能列都建出来。

如果你需要确保某个目标单元格一定被设置,建议直接用单元格样式。


12. 推荐实践

站在程序员角度,推荐这样使用 STYLE:

12.1 主题 + 局部样式覆盖,是最实用组合

建议:

  • 先用主题统一整体视觉
  • 再用 STYLE 微调表头、汇总格、重点列

这样能兼顾:

  • 一致性
  • 可读性
  • 开发效率

12.2 表头优先用行样式

表头通常天然就是整行,最适合:

ROW 1: { ... }

比逐格写更简洁。

12.3 重点值优先用单元格样式

例如:

  • 合计
  • 预警
  • 备注
  • 特殊标识位

推荐直接精确到格:

D5: { ... }

12.4 大数据导出尽量少用复杂 STYLE

因为 STYLE 会导致随机访问、禁用流式、增加样式处理成本。

如果你的目标是极致吞吐,建议:

  • 少量关键样式
  • 不做复杂回写
  • 不做大面积逐格装饰

12.5 先保证数据正确,再做视觉精修

真实项目里最容易过度设计 Excel 样式。

建议顺序:

  1. 先保证字段、值、格式、公式都正确
  2. 再加表头和重点区域样式
  3. 最后再考虑边框、填充、字体等美化细节

这样最稳。