如何使用docx4j修改docx表格单元格背景色与首行文字颜色
docx4j设置表格单元格背景与文字颜色实现方案
docx4j操作Word样式时,单元格背景属于Tc(单元格)属性,文字颜色属于R(文本块/Run)属性,以下是符合要求的void类型方法实现,入参为Tc对象和十六进制颜色值。
核心方法代码
import org.docx4j.wml.*; import jakarta.xml.bind.JAXBElement; import java.util.List; /** * 设置表格单元格背景色+单元格内所有文字颜色 * @param cell 目标表格单元格Tc对象 * @param hexColor 6位十六进制RGB颜色值,不要带#前缀 */ public void setCellStyle(Tc cell, String hexColor) { // 第一步:设置单元格背景(底纹) TcPr tcPr = cell.getTcPr(); if (tcPr == null) { tcPr = new TcPr(); cell.setTcPr(tcPr); } CTShd shd = tcPr.getShd(); if (shd == null) { shd = new CTShd(); tcPr.setShd(shd); } // 底纹设置为实心填充 shd.setVal(STShd.CLEAR); shd.setColor("auto"); shd.setFill(hexColor); // 第二步:遍历单元格内容,设置所有文本的颜色 List<Object> cellContent = cell.getContent(); for (Object content : cellContent) { // 处理段落内文本 if (content instanceof P) { P paragraph = (P) content; List<Object> pContent = paragraph.getContent(); for (Object pObj : pContent) { if (pObj instanceof R) { R run = (R) pObj; setRunFontColor(run, hexColor); } // 处理被JAXBElement包装的元素(比如超链接内嵌的文本块) if (pObj instanceof JAXBElement<?> jaxbElement) { Object value = jaxbElement.getValue(); if (value instanceof R) { R run = (R) value; setRunFontColor(run, hexColor); } } } } } } /** * 辅助方法:给文本块设置字体颜色 */ private void setRunFontColor(R run, String hexColor) { RPr rPr = run.getRPr(); if (rPr == null) { rPr = new RPr(); run.setRPr(rPr); } Color fontColor = rPr.getColor(); if (fontColor == null) { fontColor = new Color(); rPr.setColor(fontColor); } fontColor.setVal(hexColor); }
表头行调用示例
要修改表格第一行的样式,遍历第一行所有单元格调用上述方法即可:
// 假设tbl为你已经构建完成的Tbl表格对象 Tr headerRow = null; for (Object tblContent : tbl.getContent()) { if (tblContent instanceof Tr) { headerRow = (Tr) tblContent; break; } } if (headerRow != null) { for (Object cellObj : headerRow.getContent()) { if (cellObj instanceof Tc headerCell) { // 例:设置深蓝色背景+白色文字,背景色传1F4E79,文字白色传FFFFFF // 如果需要背景、文字颜色不同,可给方法新增一个文字颜色入参拆分逻辑即可 setCellStyle(headerCell, "1F4E79"); } } }
注意事项
- 入参的颜色值为6位十六进制RGB字符串,不要携带
#前缀,例如深蓝色传1F4E79、白色传FFFFFF,格式错误会导致Word无法识别样式,显示默认黑字白底。 - 上述方法已覆盖普通段落文本、超链接内嵌文本的颜色修改场景,如果单元格内存在嵌套表格、内容控件等复杂元素,可在内容遍历逻辑中补充对应分支处理,常规业务表格场景可直接使用。
- 如果你使用docx4j 6.x及更早版本,将代码中导入的
jakarta.xml.bind.JAXBElement替换为javax.xml.bind.JAXBElement即可,核心API逻辑无变化。 - 不要尝试直接在Tc属性上设置文字颜色,Word规范中文字样式是绑定在文本块R对象上的,直接修改Tc属性不会对文字生效。
内容的提问来源于stack exchange,提问作者NoNToxic
相关产品推荐
相关产品推荐

