Linuxでシェルコマンドからエクセルファイル(XSLX)を新規作成する方法〜「libreoffice」と「ssconvert」


※ 当ページには【広告/PR】を含む場合があります。
2023/06/30
【xlsx2csvコマンド活用編】Linux環境でExcelファイル(xls/xlsx)をCSVデータに変換する
Alpineコンテナでpip経由でxlsx2csvをインストールしたら「error: externally-managed-environment」出たときの対処法

普段はほぼLinuxパソコンしか使わない著者ですが、ふとあるとき、Windowsしか使わないクライアントに「エクセルデータをOneDriveで共有して」と言われることがありました。

仕方ないので、空のエクセルファイルだけOneDriveに付属の「Microsoft 365のExcelアプリ」で生成したやつをダウンロードしてから、お馴染みの
「xlsx2csv」コマンドでcsvデータを移植していく...

合同会社タコスキングダム|蛸壺の技術ブログ
【xlsx2csvコマンド活用編】Linux環境でExcelファイル(xls/xlsx)をCSVデータに変換する

LinuxコマンドからExcelのCsv形式のデータをエクスポートしたい場合に利用できるxlsx2csvコマンドの使い方を簡単に解説します。

ブラウザとシェルターミナルを行ったり来たりするのが、これが
なんとも地味に面倒です。

せめてシェルコマンドだけでエクセルファイルの編集を完結させたい...そんなときに便利な「LinuxでもXLSXファイルが生成できる」テクニックを簡単に紹介します。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

Linuxに「LibreOffice」がインストールされている人向け〜「libreoffice」コマンドを使う

Linux版の無償のオフィス業務ソフトスイートの代名詞的な「LibreOffice」は、大抵のLinuxデスクトップ向けのディストーションOSにプリインストールされている場合が多いです。

あまり知られていないかもしれませんが、LibreOfficeにはヘッドレスコマンドとしても利用できます。

            
            $ libreoffice --version
LibreOffice 7.0.4.2 00(Build:2)
        
この「libreoffice」コマンドが入っていればとても簡単にcsvからxlsxへと変換をしてくれます。

            
            $ cat <<EOF > example.csv
名前,性別,年齢,住所
ピヨ田 モブ雄,男,35,地球
ベモ山 デン実,女,43,火星
EOF

$ libreoffice --headless --convert-to xlsx --infilter=xlsx:44,34,76 example.csv

$ xlsx2csv example.xlsx
#👇出力
名前,性別,年齢,住所
ピヨ田 モブ雄,男,35,地球
ベモ山 デン実,女,43,火星
        
使用上の注意点として、シェルコマンドから文字エンコードはデフォルトでUTF-8ですが、libreofficeコマンドを使う場合、きちんと入力ファイルの文字エンコードを自動で認識してくれないようです。

そこで、
--infilterオプションから、入力テキスト情報を注入し、libreofficeコマンドに入力ファイルの文字エンコーディングが何かを教えてあげないと、XLSXファイルに変換がうまくいきません。

ちなみに
--infilterは番号で設定をフォーマットするようなオプションです。

ここでは順に、「44」で
カンマ区切りを「,」、「34」でテキスト区切りを「"」、「76」で入力の文字エンコーディングを「UTF-8」と指定しています。

python/pipが使えるオフィスツール開発者向け〜「unoconvert」コマンドを使う

もしお手元の環境でpython(3系)が既につかえるのであれば、LibreOfficeの内部実装である「Unoserver」に同梱されている
「unoconvert」コマンドをコンパクトに導入することで、先程と同じことができるようになります。

参考|unoserver

インストールは簡単で、pipから導入できます。

            
            $ pip install unoserver
#もしくは
$ python -m pip install unoserver
        
で導入することができます。

ただし、実際にこのコマンド使うとなると、場合によっては少し困ったことがおきます。

            
            $ unoconvert -h
Traceback (most recent call last):
  File "/*****/versions/3.8.6/lib/python3.8/site-packages/unoserver/converter.py", line 2, in <module>
    import uno
ModuleNotFoundError: No module named 'uno'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/*****/versions/3.8.6/bin/unoconvert", line 5, in <module>
    from unoserver.converter import main
  File "/*****/versions/3.8.6/lib/python3.8/site-packages/unoserver/converter.py", line 4, in <module>
    raise ImportError(
ImportError: Could not find the 'uno' library. This package must be installed with a Python installation that has a 'uno' library. This typically means you should install it with the same Python executable as your Libreoffice installation uses.
        
つまり早い話が、「Libreofficeがインストールされていないpythonでは動かない」ということだそうで...。

ちなみに、pythonに
uno.pyがインストールされているかチェックするスクリプトも提供されています。

            
            $ wget -O find_uno.py https://gist.githubusercontent.com/regebro/036da022dc7d5241a0ee97efdf1458eb/raw/find_uno.py
$ python find_uno.py
Trying python found at /usr/bin/python3... Success!
Found 1 Pythons with Libreoffice libraries:
/usr/bin/python3
        
著者のLinuxだとシステムの/usr/bin/python3にインストールはされているようです。

ただし著者的には通常、システムのpython(
/usr/bin/python3)は使わずに、バージョン管理の利く「pyenv」等の開発環境マネージャーを使っているので、unoconvertコマンドを使うためにすべてのpythonでLibreOfficeをインストールする...というのはあまり現実的ではありません。

なので、通常のLinuxユーザーであれば
unoconvertコマンドよりは、libreofficeのヘッドレスコマンドを使ったほうが賢明です。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

「LibreOffice」をわざわざインストールしたくない人向け〜Gnumericの「ssconvert」を使う

どちらかというと、先程のlibreofficeよりはわかり易い使い方のため、生CSVからXLSXへの変換は「ssconvert」コマンドをおすすめします。

DenianOS系のインストールは簡単で、

            
            $ sudo apt install gnumeric
$ ssconvert --version
ssconvert バージョン '1.12.48'
データ格納パス    := '/usr/share/gnumeric/1.12.48'
ライブラリ格納パス := '/usr/lib/gnumeric/1.12.48'
        
Linuxコマンドなので、先程と違い、文字エンコーディングを気にすることもなく、

            
            $ ssconvert example.csv example.xlsx

$ xlsx2csv example.xlsx
名前,性別,年齢,住所
ピヨ田 モブ雄,男,35,地球
ベモ山 デン実,女,43,火星
        
とスッキリ使えます。

実用性はないですが少し遊んでみますと、Linux向けのシェルコマンドなので、例えば空のXLSXファイルを速攻で生成できます。

            
            $ ssconvert <(echo "") example2.xlsx

$ xlsx2csv example2.xlsx
#👇出力(何もない)
        
また中間のCSVファイルをわざわざ作らないでも、標準出力をコマンド引数へリダイレクトさせて、直接コンマ切り文字列からxlsxも作れたりします。

            
            $ ssconvert <(cat <<EOF
名前,性別,年齢,住所
ピヨ田 モブ雄,男,35,地球
ベモ山 デン実,女,43,火星
EOF
) example3.xlsx

$ xlsx2csv example3.xlsx
#👇出力
名前,性別,年齢,住所
ピヨ田 モブ雄,男,35,地球
ベモ山 デン実,女,43,火星
        
個人的には、自由度も高く、Linuxらしさのある「ssconvert」コマンドの利用を推します。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

まとめ

以上、今回のポイントしては、

            
            + LibreOfficeがインストールされていればそのまま「libreoffice」コマンドが使える
+ LibreOfficeがなくても「ssconvert」でXLSXへ変換できる
        
という紹介でした。
記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。

合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集