在 Libreoffice Calc Basic 中将部分单元格文本标记为粗体?
Marking parts of a cell's text as bold in Libreoffice Calc Basic?
我知道可以在 localc 电子表格中手动编辑单元格文本并将其中的某些文本标记为粗体、斜体或其他。
我想用宏做同样的事情。我正在构建一个插入特定单元格的摘要字符串。摘要字符串包含多行,例如:
类别 1:项目 1、项目 2、项目 3
类别 2:项目 1、项目 2、...
类别 N: item1, item2, ...
单元格中可能有 ~4 到 ~12 个类别行,具体取决于给定类别是否为空。
我必须执行的功能正在运行,目前完全符合我的要求。但现在我想像这样将单元格的 "category" 部分加粗:
类别 1: 项目 1、项目 2、项目 3
类别 2: 项目 1,项目 2,...
类别 N: item1, item2, ...
是否可以在 LO Basic 中执行此操作?我知道在单元格中手动编辑是可能的,但这会破坏编写此脚本的全部目的。
这是我目前所拥有的,在构建摘要字符串并将其插入单元格对象(名为 "cell",够奇怪)的函数底部:
newline = chr(10)
cell = ThisComponent.Sheets.getByName("Summary").getCellRangeByName("Skills")
Dim next_nl as Integer
Dim next_colon as Integer
Dim TC as Object ' TextCursor object pointing into the cells text
TC = cell.createTextCursor
next_nl=1 ' start at first char of cell
While (next_nl > 0)
TC.collapseToStart
TC.gotoStart(false) ' move to start of cell
if (next_nl > 1) Then TC.goRight(next_nl, false) ' move to next_nl
TC.goRight(0,true) ' begin selection
next_colon = InStr(next_nl, cell.String, ":")
If next_colon Then
TC.goRight(next_colon, true) ' extend selection to next colon
TC.CharWeight = com.sun.star.awt.FontWeight.BOLD ' bold the selection
next_nl = InStr(next_colon, cell.String, newline) ' jump to the next LF
Else
next_nl = 0 ' no more colons to be found, finish up.'
Endif
Wend
部分有效。第一行是 Category 粗体和 items 普通文本。完美,到目前为止。
不幸的是,从第二行开始到倒数第二行中间的所有内容(嗯?什么?这很奇怪)都是粗体。我怀疑 Instr()
对混合格式文本的处理可能不太正确,导致字符计数错误。
我尝试过的其他事情/想法:
我试过搜索 CR chr(13)
而不是 LF chr(10)
但这根本不起作用。我期待它使用 MS-DOS CR 行尾,但它使用正确的 unix LF 行尾(即使你在行之间添加 CR,它会将它们转换为 LF)。这可能是因为我在 Linux 上 运行,所以当我开始工作时,我应该检测 运行 环境并为 linux 使用适当的行结束样式, windows, 或其他。
我试过将 Tc=cell.createTextCursor
移到 while 循环中,以防每次都需要重新初始化它。没有区别,两种方法都一样。
AFAICT,光标似乎没有 'reset selection' 类型的函数。
也许有一些奇怪的变量作用域问题,但我对 LO 中的变量作用域知之甚少,所以不能说 - 我对 LO 宏很陌生,我主要使用 sh 编程, awk, perl 或 python,我最后一次用 Basic 写任何东西还是在 1980 年代。
我什至不确定以上是否是解决问题的好方法,这只是谷歌搜索文档时似乎相关的第一件事。如有必要,我非常愿意以更好的想法重新开始。
我开始认为 "Skills" 命名范围应该是每个类别一个单元格,而不是一个嵌入 LF 的大长字符串,然后我可以单独循环遍历它们。这样做需要我对电子表格的其他部分进行相当大的更改,所以我不想这样做,除非我必须这样做。
PS:我知道...我是个完美主义者。大写类别名称会起作用(事实上,确实如此)但有点难看。将它们加粗会更好...并且此摘要页面的目的是为了漂亮地展示。
InStr()
工作正常,即使在 Windows 上也是如此。 goRight()
.
附近只有一个简单的错误
Sub BoldPartOfCell
Dim next_nl As Integer ' position of the next newline
Dim next_colon As Integer
Dim cursor As Object ' TextCursor object pointing into the cell's text
NEWLINE = Chr(10) ' the LibreOffice line break character
cell = ThisComponent.Sheets.getByName("Summary").getCellRangeByName("Skills")
cursor = cell.createTextCursor
next_nl = 1 ' start at first char of cell
Do While True
cursor.collapseToStart
cursor.gotoStart(False) ' move to start of cell
if (next_nl > 1) Then cursor.goRight(next_nl, False) ' move to next_nl
next_colon = InStr(next_nl, cell.String, ":")
If next_colon > 0 Then
' extend selection to next colon
cursor.goRight(next_colon - next_nl + 1, True)
cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD ' bold the selection
next_nl = InStr(next_colon, cell.String, NEWLINE) ' jump to the next LF
Else
Exit Do
End If
Loop
End Sub
我知道可以在 localc 电子表格中手动编辑单元格文本并将其中的某些文本标记为粗体、斜体或其他。
我想用宏做同样的事情。我正在构建一个插入特定单元格的摘要字符串。摘要字符串包含多行,例如:
类别 1:项目 1、项目 2、项目 3
类别 2:项目 1、项目 2、...
类别 N: item1, item2, ...
单元格中可能有 ~4 到 ~12 个类别行,具体取决于给定类别是否为空。
我必须执行的功能正在运行,目前完全符合我的要求。但现在我想像这样将单元格的 "category" 部分加粗:
类别 1: 项目 1、项目 2、项目 3
类别 2: 项目 1,项目 2,...
类别 N: item1, item2, ...
是否可以在 LO Basic 中执行此操作?我知道在单元格中手动编辑是可能的,但这会破坏编写此脚本的全部目的。
这是我目前所拥有的,在构建摘要字符串并将其插入单元格对象(名为 "cell",够奇怪)的函数底部:
newline = chr(10)
cell = ThisComponent.Sheets.getByName("Summary").getCellRangeByName("Skills")
Dim next_nl as Integer
Dim next_colon as Integer
Dim TC as Object ' TextCursor object pointing into the cells text
TC = cell.createTextCursor
next_nl=1 ' start at first char of cell
While (next_nl > 0)
TC.collapseToStart
TC.gotoStart(false) ' move to start of cell
if (next_nl > 1) Then TC.goRight(next_nl, false) ' move to next_nl
TC.goRight(0,true) ' begin selection
next_colon = InStr(next_nl, cell.String, ":")
If next_colon Then
TC.goRight(next_colon, true) ' extend selection to next colon
TC.CharWeight = com.sun.star.awt.FontWeight.BOLD ' bold the selection
next_nl = InStr(next_colon, cell.String, newline) ' jump to the next LF
Else
next_nl = 0 ' no more colons to be found, finish up.'
Endif
Wend
部分有效。第一行是 Category 粗体和 items 普通文本。完美,到目前为止。
不幸的是,从第二行开始到倒数第二行中间的所有内容(嗯?什么?这很奇怪)都是粗体。我怀疑 Instr()
对混合格式文本的处理可能不太正确,导致字符计数错误。
我尝试过的其他事情/想法:
我试过搜索 CR
chr(13)
而不是 LFchr(10)
但这根本不起作用。我期待它使用 MS-DOS CR 行尾,但它使用正确的 unix LF 行尾(即使你在行之间添加 CR,它会将它们转换为 LF)。这可能是因为我在 Linux 上 运行,所以当我开始工作时,我应该检测 运行 环境并为 linux 使用适当的行结束样式, windows, 或其他。我试过将
Tc=cell.createTextCursor
移到 while 循环中,以防每次都需要重新初始化它。没有区别,两种方法都一样。AFAICT,光标似乎没有 'reset selection' 类型的函数。
也许有一些奇怪的变量作用域问题,但我对 LO 中的变量作用域知之甚少,所以不能说 - 我对 LO 宏很陌生,我主要使用 sh 编程, awk, perl 或 python,我最后一次用 Basic 写任何东西还是在 1980 年代。
我什至不确定以上是否是解决问题的好方法,这只是谷歌搜索文档时似乎相关的第一件事。如有必要,我非常愿意以更好的想法重新开始。
我开始认为 "Skills" 命名范围应该是每个类别一个单元格,而不是一个嵌入 LF 的大长字符串,然后我可以单独循环遍历它们。这样做需要我对电子表格的其他部分进行相当大的更改,所以我不想这样做,除非我必须这样做。
PS:我知道...我是个完美主义者。大写类别名称会起作用(事实上,确实如此)但有点难看。将它们加粗会更好...并且此摘要页面的目的是为了漂亮地展示。
InStr()
工作正常,即使在 Windows 上也是如此。 goRight()
.
Sub BoldPartOfCell
Dim next_nl As Integer ' position of the next newline
Dim next_colon As Integer
Dim cursor As Object ' TextCursor object pointing into the cell's text
NEWLINE = Chr(10) ' the LibreOffice line break character
cell = ThisComponent.Sheets.getByName("Summary").getCellRangeByName("Skills")
cursor = cell.createTextCursor
next_nl = 1 ' start at first char of cell
Do While True
cursor.collapseToStart
cursor.gotoStart(False) ' move to start of cell
if (next_nl > 1) Then cursor.goRight(next_nl, False) ' move to next_nl
next_colon = InStr(next_nl, cell.String, ":")
If next_colon > 0 Then
' extend selection to next colon
cursor.goRight(next_colon - next_nl + 1, True)
cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD ' bold the selection
next_nl = InStr(next_colon, cell.String, NEWLINE) ' jump to the next LF
Else
Exit Do
End If
Loop
End Sub