You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:36:22