LibreOffice Writer表格单元格CharHeight来源及重置问题
解决LibreOffice Writer表格单元格字号无法通过宏重置的问题
问题分析
表格单元格中字号与Standard段落样式不同但getPropertyState("CharHeight")返回DEFAULT_VALUE,是因为字号并非直接设置,而是通过**字符自动样式(CharAutoStyleName)**关联了自定义样式,导致常规的直接格式检测逻辑失效。
解决方案
通过两步实现段落和表格单元格的字号重置:
- 处理普通段落:检测
CharHeight的直接设置并重置 - 处理表格单元格:清除关联的字符自动样式,再强制重置字号为样式默认值
宏代码实现
Sub ResetAllFontSizes() Dim oDoc As Object, oText As Object, oCursor As Object Dim oTables As Object, oTable As Object, oCell As Object Dim i As Integer, j As Integer, k As Integer oDoc = ThisComponent oText = oDoc.Text ' --- 处理所有普通段落 --- oCursor = oText.createTextCursor() oCursor.gotoStart(False) Do ' 重置显式设置的字号 If oDoc.getPropertyState("CharHeight") = com.sun.star.beans.PropertyState.DIRECT_VALUE Then oCursor.CharHeight = -1 ' 设为-1表示继承段落样式的默认字号 End If Loop While oCursor.gotoNextParagraph(True) ' --- 处理所有表格单元格 --- oTables = oDoc.TextTables For i = 0 To oTables.getCount() - 1 oTable = oTables.getByIndex(i) ' 遍历表格所有行 For j = 0 To oTable.getRows().getCount() - 1 ' 遍历当前行的所有列 For k = 0 To oTable.getColumns().getCount() - 1 oCell = oTable.getCellByPosition(k, j) oCursor = oCell.Text.createTextCursor() oCursor.gotoStart(False) Do ' 清除关联的字符自动样式 If oCursor.CharAutoStyleName <> "" Then oCursor.CharAutoStyleName = "" End If ' 强制重置字号到样式默认 oCursor.CharHeight = -1 Loop While oCursor.gotoNextParagraph(True) Next k Next j Next i End Sub
关键说明
CharHeight = -1:强制让字号继承当前段落样式的默认值,无论之前是直接设置还是通过自动样式关联- 清除
CharAutoStyleName:这是解决表格单元格问题的核心,自动样式会覆盖段落样式的字号设置,必须先清空该属性才能让重置生效 - 若需完全模拟
Ctrl+M清除所有直接格式的效果,可替换针对性代码为oCursor.clearDirectFormatting(),但此操作会清除所有直接格式(如字体颜色、加粗等)
内容的提问来源于stack exchange,提问作者Janosch
相关产品推荐
相关产品推荐

