2017-05-08 144 views
0

我知道可以在本地電子表格中手動編輯單元格文本並將其中的某些文本標記爲粗體,斜體或其他內容。在Libreoffice Calc Basic中將單元格文本的部分標記爲粗體?

我想用宏做同樣的事情。我構建了一個插入到特定單元格的摘要字符串。摘要字符串包含多個線,如:

       組別:項目1,項目2,項目3
       類別2:項目1,項目2,...
        CategoryN:項目1,項目2, ...

根據給定類別是否爲空,單元格中可能存在從〜4到〜12的任何類別行。

我必須這樣做的功能正在工作,到目前爲止我確實需要做的。但現在我要加粗這樣的單元格的 「類別」 部分:

        組別:項目1,項目2,項目3
        類別2:項目1,項目2,.. 。
        CategoryN:項目1,項目2,...

在LO Basic中可以這樣做嗎?我知道在一個單元格中手動編輯是可能的,但這會挫敗編寫腳本的全部目的。

這是我到目前爲止,在那建立了總結字符串,並將其插入到細胞對象的函數的底部(命名爲「細胞」,奇怪的是):

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 

這部分作品。第一行有分類加粗和項目正常文本。完美,迄今爲止。

不幸的是,從第二行開始到第二行中間的所有內容(呃?什麼?真奇怪)都是大膽的。我懷疑Instr()對於混合格式的文本不能正常工作,因此會導致字符數錯誤。

其他的事情我已經試過/想法:

  • 我試圖尋找CR chr(13)而不是LF chr(10),但沒有在所有的工作。我期待它使用MS-DOS CR行結束符,但它使用適當的unix LF行結束符(即使您在行之間添加了CR,它將它們轉換爲LF)。這可能是因爲我在Linux上運行,所以當我得到這個工作時,我應該檢測運行環境,並使用適合Linux,Windows或其他類型的結束風格。

  • 我試過在while循環中移動Tc=cell.createTextCursor以防萬一它需要在每次傳遞時重新初始化。兩種方式沒有區別,結果相同。

    AFAICT,似乎沒有針對遊標的「重置選擇」類型函數。

  • 也許有一些奇怪的變量範圍問題,但我對LO中的變量範圍幾乎沒有任何知識,所以不能說 - 我對LO宏非常陌生,我主要用sh,awk,perl編程或python,以及我上次在Basic中寫入任何東西的時間早在20世紀80年代。

  • 我甚至不確定上述問題是否是一個很好的解決方法,它只是在搜索文檔時看起來相關的第一件事。如果有必要,我更願意從一個更好的主意開始。

  • 我開始認爲名爲範圍的「技能」應該是每個類別一個單元,而不是一個嵌入了LF的大長字符串,然後我可以單獨循環。這樣做會要求我對電子表格的其他部分進行相當大的改動,所以除非必須,否則我不想這樣做。

PS:我知道......我是一個完美主義者。將類別名稱大寫會起作用(事實上,它的確如此),但有點難看。將它們加粗會更好......這個Summary頁面的目的是爲了漂亮的演示。

+0

尊敬的匿名downvoter - 我知道這個Q是關於恰好嵌入到電子表格中的編程語言。但它仍然是一個編程問題,而不是應用程序使用問題,它不是單元格公式或更適合超級用戶或幫助臺的其他應用程序問題。它是編程,即使它是基本的。在電子表格中。在SO上有更多關於「玩具」式語言的其他許多問題。 – cas

+0

也許它是downvoted,因爲這是一個很長的問題?儘管我看起來很好。細節很有幫助。 –

+0

是的,我更傾向於回答問題,如果提問者表明他們試圖自己弄清楚並提供有用的細節,比如他們想要做的事情(如果是XY問題,或者更糟糕的是,「WTF ?「)。 – cas

回答

1

InStr()工作得很好,即使在Windows上。 goRight()附近只有一個簡單的bug。

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 
+0

完美!非常感謝你。和...咄!我知道goRight()與當前pos是相對的,但我認爲它是絕對的。順便說一下,單元格和換行符的定義被隔離在我的代碼示例的頂部,以顯示上下文 - 它們來自之前的原始子代。現在我可以看到這個bug了,我將它變成一個sub,並將其推廣到像'Sub BoldPartOfCell(cell as Object,ByVal BoldStart as String,ByVal BoldStop as String)' – cas

相關問題