Linuxコマンドラインを介してxlsxファイルの特定のワークシートをcsvに変換するには?

Linuxコマンドラインを介してxlsxファイルの特定のワークシートをcsvに変換するには?

私のディレクトリには約16,000個の.xlsxファイルがあります。各ファイルは同じ構造に従います。最初のテーブルは空で、「テーブル1」と呼ばれます。 2つ目は興味深いデータがあるところで「パートナー」と呼ばれます。 text/csvに変換する必要があります。

ssconvert、xlsx2csvなど、オンラインで見つけたさまざまなソリューションを試しましたが、どちらもランタイムエラーが発生しました。また、私のファイルが破損していること(そしてファイルが正しく開かれているかどうか)を確認するために、Libre Office Calcによって作成されたダミーファイルを使用してこれらの作業を試みました。

どうすればいいですか?

答え1

LibreOfficeにはcsvに変換する機能が組み込まれています。

localc --headless --convert-to csv input.xlsx

ただし、これにより最初のシートのみがエクスポートされます。 2枚目のシートを入手するには、マクロの助けが必要です。 LibreOffice Calcを開き、に移動しますTools -> Macros -> Edit Macros

その後、エディタが開き、エディタの内容を次のコードに置き換えます。

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

Sub Main
    sheets = ThisComponent.Sheets
    sheets.removeByName("Sheet1")
    ThisComponent.storeSelf(Array())
    ThisComponent.close(true)
End Sub

次にマクロ(ctrl+s)を保存します。Standard.Module1.Main(左下に表示)に保存する必要があります。

その後、LibreOfficeをもう一度閉じて、次のコマンドを実行できます。

localc --headless input.xlsx macro:///Standard.Module1.Main

これにより、最初のシートが削除されます(Sheet1コードを変更する必要がある場合は名前が付けられたすべてのシート)。

したがって、Bashスクリプトは次のように見えます。

mkdir csvs
for i in *.xlsx ; do
    localc --headless $i macro:///Standard.Module1.Main
    localc --convert-to csv $i
done
mv *.csv csvs/

答え2

csvkit(https://csvkit.readthedocs.io/en/latest/)と実行

in2csv -I --sheet "sheetName" ./input.xlsx >./output.csv

bash for ループを書くことはあなた次第です。

関連情報