C#使用NPOI生成Word时自定义编号样式与段落XWPFRun样式不一致如何解决
解决方案
你遇到的编号样式和段落Run不一致的根本原因是:Word 中列表编号的格式是独立在编号定义的层级配置中维护的,默认不会自动继承段落内Run的样式,需要你在定义CT_Lvl时主动指定编号的字符样式。
你只需要在现有每个CT_Lvl配置中,新增rPr(Run属性)节点,配置和你段落Run完全一致的样式参数即可,修改后的编号定义代码参考如下:
XWPFNumbering numbering = document.CreateNumbering(); var ct_abn = new CT_AbstractNum(); var mlt = new CT_MultiLevelType(); mlt.val = ST_MultiLevelType.multilevel; ct_abn.multiLevelType = mlt; ct_abn.lvl = new System.Collections.Generic.List<CT_Lvl> { new CT_Lvl { ilvl = "0", start = new CT_DecimalNumber() {val = "1"}, numFmt = new CT_NumFmt() {val = ST_NumberFormat.@decimal}, lvlText = new CT_LevelText() {val = "%1."}, lvlJc = new CT_Jc() {val = ST_Jc.left}, pPr = new CT_PPr {ind = new CT_Ind {left = "360", hanging = 360}, }, // 新增编号的Run样式配置,和你段落Run的参数保持一致 rPr = new CT_RPr { // 对应Run.IsBold = true b = new CT_OnOff { val = true }, // 对应Run.FontFamily = "Times New Roman",覆盖多语言字体配置避免差异 rFonts = new CT_Fonts { ascii = "Times New Roman", eastAsia = "Times New Roman", hAnsi = "Times New Roman", cs = "Times New Roman" }, // 对应Run.FontSize = 12,注意单位是半磅,12号字对应值为24 sz = new CT_HpsMeasure { val = "24" }, szCs = new CT_HpsMeasure { val = "24" } } }, new CT_Lvl { ilvl = "1", start = new CT_DecimalNumber() {val = "1"}, numFmt = new CT_NumFmt() {val = ST_NumberFormat.@decimal}, lvlText = new CT_LevelText() {val = "%1.%2."}, lvlJc = new CT_Jc() {val = ST_Jc.left}, pPr = new CT_PPr {ind = new CT_Ind {left = "792", hanging = 792, firstLineSpecified = true}, }, rPr = new CT_RPr { b = new CT_OnOff { val = true }, rFonts = new CT_Fonts { ascii = "Times New Roman", eastAsia = "Times New Roman", hAnsi = "Times New Roman" }, sz = new CT_HpsMeasure { val = "24" } } }, new CT_Lvl { ilvl = "2", start = new CT_DecimalNumber() {val = "1"}, numFmt = new CT_NumFmt() {val = ST_NumberFormat.@decimal}, lvlText = new CT_LevelText() {val = "%1.%2.%3."}, lvlJc = new CT_Jc() {val = ST_Jc.left}, pPr = new CT_PPr {ind = new CT_Ind {left = "792", hanging = 792}}, rPr = new CT_RPr { b = new CT_OnOff { val = true }, rFonts = new CT_Fonts { ascii = "Times New Roman", eastAsia = "Times New Roman", hAnsi = "Times New Roman" }, sz = new CT_HpsMeasure { val = "24" } } }, }
注意事项
- 如果不同层级的列表段落样式不一样,只需要给对应
CT_Lvl的rPr配置对应样式即可 - 字号配置的单位是半磅,所以12号字对应的val值是24,不要直接填12,否则编号字号会比段落小一半
- 字体配置建议覆盖多语言字段,避免小语种字符字体显示异常
内容的提问来源于stack exchange,提问作者Skyglar
相关产品推荐
相关产品推荐

