カテゴリー
Linuxでシェルコマンドからエクセルファイル(XSLX)を新規作成する方法〜「libreoffice」と「ssconvert」
※ 当ページには【広告/PR】を含む場合があります。
2023/06/30
普段はほぼLinuxパソコンしか使わない著者ですが、ふとあるとき、Windowsしか使わないクライアントに「エクセルデータをOneDriveで共有して」と言われることがありました。
仕方ないので、空のエクセルファイルだけOneDriveに付属の「Microsoft 365のExcelアプリ」で生成したやつをダウンロードしてから、お馴染みの
ブラウザとシェルターミナルを行ったり来たりするのが、これが
せめてシェルコマンドだけでエクセルファイルの編集を完結させたい...そんなときに便利な「LinuxでもXLSXファイルが生成できる」テクニックを簡単に紹介します。
Linuxに「LibreOffice」がインストールされている人向け〜「libreoffice」コマンドを使う
Linux版の無償のオフィス業務ソフトスイートの代名詞的な
あまり知られていないかもしれませんが、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
ちなみに
--infilter
ここでは順に、「44」で
カンマ区切りを「,」
テキスト区切りを「"」
入力の文字エンコーディングを「UTF-8」
python/pipが使えるオフィスツール開発者向け〜「unoconvert」コマンドを使う
もしお手元の環境でpython(3系)が既につかえるのであれば、LibreOfficeの内部実装である「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
なので、通常のLinuxユーザーであれば
unoconvert
libreoffice
「LibreOffice」をわざわざインストールしたくない人向け〜Gnumericの「ssconvert」を使う
どちらかというと、先程の
libreoffice
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へ変換できる
という紹介でした。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー