LibreOffice:XLS/XLSX内のすべてのシートを一度にCSVに変換

XLSなりXLSXなりについて、シートごとにCSVファイルを作成することはできるのだが、多数のシートがある場合にはこれではやってられない。一度にCSV出力する方法は無いものかと思い、探してみると以下を発見した。

この手順をためしてみる。

マクロの登録

メニューの以下を選択。

以下のような表示になってるので、「編集」。

空のマクロが登録されてるので、

次のマクロを上書きする。上書きしたら☓ボタンで閉じてしまってよい。

REM  *****  BASIC  *****

Sub ExportToCsv
    document = ThisComponent

    ' Use the global string tools library to generate a path to save each CSV
    GlobalScope.BasicLibraries.loadLibrary("Tools")
    FileDirectory = Tools.Strings.DirectoryNameoutofPath(document.getURL(), "/")

    ' Work out number of sheets for looping over them later.
    Sheets = document.Sheets
    NumSheets = Sheets.Count - 1

    ' Set up a propval object to store the filter properties
    Dim Propval(1) as New com.sun.star.beans.PropertyValue
    Propval(0).Name = "FilterName"
    Propval(0).Value = "Text - txt - csv (StarCalc)"
    Propval(1).Name = "FilterOptions"
    Propval(1).Value ="59,34,0,1,1"   'ASCII  59 = ;  34 = "

    For I = 0 to NumSheets
        ' For each sheet, assemble a filename and save using the filter
        document.getCurrentController.setActiveSheet(Sheets(I))
        Filename = FileDirectory + "/" + Sheets(I).Name + ".csv"
        FileURL = convertToURL(Filename)
        document.StoreToURL(FileURL, Propval())
    Next I

End Sub

マクロの実行

これは簡単だ。メニューでマクロの実行を選択。

ExportToCsvを探し、「実行」

元のXLS/XLSXと同じフォルダにシート名でCSVが出力される。

ただし、列区切りはカンマではなくセミコロンになっている。別にこれでも構わないが、マクロをいじるとカンマになってくれるのだろうか???