2021年1月4日 星期一

LibreOffice 巨集:Writer 內容批次取代(呼叫 Calc 清單)




在 Microsoft Office Word 中,彰化一整天前輩寫了個巨集,可批次對多個 Word 檔案取代文字。但這不符合我的工作流程,而且這個版本只支援.doc檔。因此參考了前輩的語法,另外寫了一個巨集,在以 Word 開啟檔案的狀態下,呼叫 Excel 清單搜尋取代,且支援萬用字元。而本文是 LiberOffice 的版本。(MicroSoft Office版本請按這裡

版本特色:

  1. 支援所有可用 LibreOffice Writer 開啟的文件
  2. 支援 LiberOffice 常規表述式
  3. 以 Calc 管理列表

缺點:本巨集不支援取代文字格式,且無法同時取代多個檔案。如有需要,請參考彰化一整天的巨集


安裝

準備 Calc 取代清單

  1. 開啟Calc,將第一列寫上標題:「替代前」、「替代後」、「萬用字元」。



  2. 在之後的列中填入要搜尋取代的內容,中間請勿空行。如要使用常規表述式(需遵守 LiberOffice 常規表述式規範),請在第三欄寫上「Y」。
  3. 儲存檔案,檔案格式需選擇 Calc 可支援的。(檔名及檔案路徑避免包含與電腦系統語言不符的文字,如中文環境請勿包含日文或韓文,以免出錯)

安裝Writer巨集

  1. 開啟Writer,點開「工具」>「巨集」>「編輯巨集」。
  2. 在「End Sub」下貼上以下語法。

Sub RepWithList()
'
' 列表批次取代巨集 Replace with ODS List
'
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
REM ====Replace List File====
Dim FileName As String
Dim FileNameURL As string
Dim RepFile As Object
REM ====Replace parameters====
Dim Rep As String
Dim Org As String
Dim Sheet0 as Object
Dim i as Integer

FileName = "D:\Programs\RepList_LO.ods" REM  取代列表檔案路徑
FileNameURL = convertToURL(FileName)

Dim opts(0) As New com.sun.star.beans.PropertyValue
opts(0).Name = "Hidden"
opts(0).Value = True

RepFile = StarDesktop.loadComponentFromURL(FileNameURL, "_blank", 0, opts() )
Sheet0 = RepFile.Sheets.getByIndex(0)

i = 1
Org = Sheet0.getCellByPosition(0,i).String
Rep = Sheet0.getCellByPosition(1,i).String

dim RepPair(21) as new com.sun.star.beans.PropertyValue

REM ====取代迴圈====
While Org <> ""
    If Sheet0.getCellByPosition(2,i).String = "Y" Then
       RepPair(0).Name = "SearchItem.StyleFamily"
       RepPair(0).Value = 2
       RepPair(1).Name = "SearchItem.CellType"
       RepPair(1).Value = 0
       RepPair(2).Name = "SearchItem.RowDirection"
       RepPair(2).Value = true
       RepPair(3).Name = "SearchItem.AllTables"
       RepPair(3).Value = false
       RepPair(4).Name = "SearchItem.SearchFiltered"
       RepPair(4).Value = false
       RepPair(5).Name = "SearchItem.Backward"
       RepPair(5).Value = True
       RepPair(6).Name = "SearchItem.Pattern"
       RepPair(6).Value = false
       RepPair(7).Name = "SearchItem.Content"
       RepPair(7).Value = false
       RepPair(8).Name = "SearchItem.AsianOptions"
       RepPair(8).Value = false
       RepPair(9).Name = "SearchItem.AlgorithmType"
       RepPair(9).Value = 1
       RepPair(10).Name = "SearchItem.SearchFlags"
       RepPair(10).Value = 65536
       RepPair(11).Name = "SearchItem.SearchString"
       RepPair(11).Value = Org
       RepPair(12).Name = "SearchItem.ReplaceString"
       RepPair(12).Value = Rep
       RepPair(13).Name = "SearchItem.Locale"
       RepPair(13).Value = 255
       RepPair(14).Name = "SearchItem.ChangedChars"
       RepPair(14).Value = 2
       RepPair(15).Name = "SearchItem.DeletedChars"
       RepPair(15).Value = 2
       RepPair(16).Name = "SearchItem.InsertedChars"
       RepPair(16).Value = 2
       RepPair(17).Name = "SearchItem.TransliterateFlags"
       RepPair(17).Value = 1280
       RepPair(18).Name = "SearchItem.Command"
       RepPair(18).Value = 3
       RepPair(19).Name = "SearchItem.SearchFormatted"
       RepPair(19).Value = false
       RepPair(20).Name = "SearchItem.AlgorithmType2"
       RepPair(20).Value = 2
       RepPair(21).Name = "Quiet"
       RepPair(21).Value = true
      
       dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, RepPair())
    Else
       RepPair(0).Name = "SearchItem.StyleFamily"
       RepPair(0).Value = 2
       RepPair(1).Name = "SearchItem.CellType"
       RepPair(1).Value = 0
       RepPair(2).Name = "SearchItem.RowDirection"
       RepPair(2).Value = true
       RepPair(3).Name = "SearchItem.AllTables"
       RepPair(3).Value = false
       RepPair(4).Name = "SearchItem.SearchFiltered"
       RepPair(4).Value = false
       RepPair(5).Name = "SearchItem.Backward"
       RepPair(5).Value = True 
       RepPair(6).Name = "SearchItem.Pattern"
       RepPair(6).Value = false
       RepPair(7).Name = "SearchItem.Content"
       RepPair(7).Value = false
       RepPair(8).Name = "SearchItem.AsianOptions"
       RepPair(8).Value = false
       RepPair(9).Name = "SearchItem.AlgorithmType"
       RepPair(9).Value = 0
       RepPair(10).Name = "SearchItem.SearchFlags"
       RepPair(10).Value = 65536
       RepPair(11).Name = "SearchItem.SearchString"
       RepPair(11).Value = Org
       RepPair(12).Name = "SearchItem.ReplaceString"
       RepPair(12).Value = Rep
       RepPair(13).Name = "SearchItem.Locale"
       RepPair(13).Value = 255
       RepPair(14).Name = "SearchItem.ChangedChars"
       RepPair(14).Value = 2
       RepPair(15).Name = "SearchItem.DeletedChars"
       RepPair(15).Value = 2
       RepPair(16).Name = "SearchItem.InsertedChars"
       RepPair(16).Value = 2
       RepPair(17).Name = "SearchItem.TransliterateFlags"
       RepPair(17).Value = 1073743104
       RepPair(18).Name = "SearchItem.Command"
       RepPair(18).Value = 3
       RepPair(19).Name = "SearchItem.SearchFormatted"
       RepPair(19).Value = false
       RepPair(20).Name = "SearchItem.AlgorithmType2"
       RepPair(20).Value = 1
       RepPair(21).Name = "Quiet"
       RepPair(21).Value = true
      
       dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, RepPair())
      
    End If
    i = i + 1
    Org = Sheet0.getCellByPosition(0,i).String
    Rep = Sheet0.getCellByPosition(1,i).String
Wend

MsgBox "取代完成" &  Chr(13)  & "技術支援:憑虛御風 https://qingxianz.blogspot.com"

End Sub




說明:
  1. FileName = "D:\Programs\RepList_LO.ods"
  2. 請將紅字部分換成剛才製作的 Calc 檔案路徑。
     
  3. RepPair(3).Name = "SearchItem.AllTables"
    RepPair(3).Value = false
  4. 如果需要取代所有表格內容,請改為True 
     
  5. RepPair(5).Name = "SearchItem.Backward"
  6. RepPair(5).Value = True
    如果要往前取代,請保留True,否則請改為False 

安裝捷徑

  1. 開啟「工具」>「自訂」>「工具列」>「類別」>「巨集」,在「我的巨集」中找到剛才的「RepWithList」,點下去反白。
  2. 在右欄選擇要加入的工具列,按中間的「➡️」加入,調整到想要的位置。
  3. 點「RepWithList」,按下欄「修改」,改成想要的名稱和圖示(請勿和其他工具混淆)。按「確定」。



這樣工具列就會出現設定的圖示,按一下就會自動取代了。

 

常見問題

  • 取代清單變成唯讀,無法編輯:因為 RepWithList 執行時會以唯讀在背景開啟清單檔。關閉 Writer,重新開啟取代清單檔就會正常了。如需同時編輯,請先開啟清單檔再執行取代(但LO有可能會閃退)。


如果覺得我的程式很有幫助,歡迎贊助斗內我喔(*´∀`)~♥

PS:如要提問,請使用Facebook留言框下的內建留言板,這樣我才收得到通知。 


沒有留言:

張貼留言

下一篇:
較新的文章
首頁 上一篇:
較舊的文章