LibreOffice Calc宏:同一单元格内设置两种不同字体
问题原因
直接修改单元格对象的CharFontName属性、直接拼接Cell.String的操作默认作用于单元格全部内容,最后一次设置的字体属性会覆盖之前所有设置,这是原有代码无法实现分段字体效果的核心原因。
要给同一个单元格内的不同文本片段设置不同格式,必须调用单元格的Text接口创建文本游标(TextCursor),通过游标选中指定范围的文本片段后,再单独给选中范围设置字符属性,格式才不会互相覆盖。
修改后可直接运行的代码
Public Sub FormattaCarattere() Dim Doc As Object Dim Sheet As Object Dim Cell As Object Dim oText As Object Dim oCursor As Object Doc = ThisComponent Sheet = Doc.Sheets.getByName("Test") Doc.CurrentController.setActiveSheet(Sheet) ' 定位目标单元格 Cell = Sheet.getCellRangeByName("D7") ' 清空单元格原有内容 Cell.String = "" ' 获取单元格文本对象、创建文本游标 oText = Cell.getText() oCursor = oText.createTextCursor() ' 插入第一部分普通文本+换行 oCursor.gotoStart(False) oText.insertString(oCursor, "TEST-01" & Chr(10), False) ' 选中刚插入的第一部分内容设置字体 oCursor.gotoStartOfParagraph(False) oCursor.gotoEndOfParagraph(True) oCursor.CharFontName = "Gill Sans MT" ' 移动游标到文本末尾,插入条码内容 oCursor.gotoEnd(False) oText.insertString(oCursor, "TEST-02", False) ' 选中刚插入的条码内容设置条码字体 oCursor.gotoStartOfParagraph(False) oCursor.gotoEndOfParagraph(True) oCursor.CharFontName = "Libre Barcode 128 Text" ' 设置单元格对齐 Cell.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER Cell.VertJustify = com.sun.star.table.CellVertJustify.CENTER End Sub
关键说明
- 代码用
Chr(10)替代vbCrLf作为单元格内换行符,兼容性更好,不会出现多余空行 - 所有字符格式设置必须在游标选中对应片段后执行,此时格式只会作用于选中的文本范围,不会覆盖其他部分的格式
- 示例代码用段落选择方法自动选中对应片段,不需要硬编码字符长度,可直接适配任意长度的普通文本、条码内容
- 运行前请确认系统已经安装了
Libre Barcode 128 Text字体,否则条码部分会显示为默认字体的普通文本 - 同方法可扩展设置片段的字号、颜色、粗斜体等其他字符格式,只需要给选中状态下的游标设置对应属性即可
内容的提问来源于stack exchange,提问作者Tonky75
相关产品推荐
相关产品推荐

