カテゴリー
【xlsx2csvコマンド活用編】Linux環境でExcelファイル(xls/xlsx)をCSVデータに変換する
※ 当ページには【広告/PR】を含む場合があります。
2021/04/02
今回はExcelでCsv形式のデータをエクスポートしたいけど、WindowsOSのパソコンは無し、Linuxしか使いたくない方のための
はじめに
当サイトではオフィス業務のComputer-Aidedなハイブリッドな方法を模索し、より効率的なExcel業務を実現したい多忙なオフィスワーカー向けの主にAwkとSedを使うシェル講座です。
シェルスクリプトはどこでもどんなOSでも基本的に使えて、しかも一度使い方を覚えると、Excelと組み合わせて最高に効率の良いオフィスワークツールが作れることでしょう。

xlsx2csvコマンドのインストール方法
まずは
Debian系OSなどのディストーションでは既にパッケージインストール版が用意されておりすぐに使えるような状況にあります。
$ sudo apt-get install xlsx2csv
$ xlsx2csv --version
0.7.4
まだパッケージインストールに未対応のLinuxでもPythonからPipインストールによりこちらもとても簡単にxlsx2csvを導入可能です。
$ pip install xlsx2csv
$ xlsx2csv --version
0.7.7
なおPip版の方が最新バージョンに対応しているので機能の面がちょっぴり新しいようです。
xlsx2csvの利用法
xlsx2csvコマンドはxlsかxlsxファイルからcsvファイルを抽出するコマンドです。
まずはブラウザ版の

内容としてはシートを二つ(sheet1とsheet2)作って、これをローカルに.xlsx形式でダウンロードします。
デフォルトでは
ブック 1.xlsx
book1.xlsx
まずは徐ろにこの保存したxlsxファイルにxlsx2csvコマンドを使うとどうなるかというと、
$ xlsx2csv book1.xlsx
1,2,3
4,5,6
というように、デフォルトではsheet1(最初のシート)の内容が標準出力として返ってくるようです。
xlsx2csvを使えば、シートごとにcsvファイルをエクスポートしてローカルに保存してからそれぞれのcsvデータを処理することも可能ですが、個別に特定のシートにアクセスして、その標準出力をそのままAwkやJqで処理させることも可能です。
個別のシートを表示させる①
まずはもっとも基礎的なオプションの
-s/--sheet シート番号
$ xlsx2csv -s 1 book1.xlsx | awk -F"," '
{ print $1, $2, $3; }
'
#👇出力
1 2 3
4 5 6
$ xlsx2csv -s 2 book1.xlsx | awk -F"," '
{ print $1, $2, $3; }
'
#👇出力
7 8 9
a b c
見ての通りで、-sオプションに指定するシート番号(1から始まる)を指定することで、個別のシートをcsvデータとして直接出力させることが可能です。
個別のシートを表示させる②
シートの数が多く、シート番号で識別するのが厳しくなってくると、
-n/--sheetname シート名
xlsx2csv -n "Sheet1" book1.xlsx | awk -F"," '
{ print $1, $2, $3; }
'
#👇出力
1 2 3
4 5 6
xlsx2csv -n "Sheet2" book1.xlsx | awk -F"," '
{ print $1, $2, $3; }
'
#👇出力
7 8 9
a b c
クォーション(文字列の括弧付け)
先程のbook1.xlsxにSheet3として以下の内容を挿入します。

場合によっては、csv化するセルごとにダブルクオーテーション文字で括った出力が欲しい場合もあるかもしれません。
クォーションを制御するには
-q/--quoting オプション名
$ xlsx2csv -n 'Sheet3' book1.xlsx | awk -F"," '
{ print $1, $2, $3; }
'
#👇デフォルト'minimal'相当
山田 モガ史 佐藤 マウ児 鈴木 ラヲ美
営業 経理 人事
8年目 17年目 3年目
33 48 24
xlsx2csv -n 'Sheet3' -q 'nonnumeric' book1.xlsx | awk -F"," '
{ print $1, $2, $3; }
'
#👇'nonnumeric'(非数値的) > ダブルクオーテーションで囲ってくれる
"山田 モガ史" "佐藤 マウ児" "鈴木 ラヲ美"
"営業" "経理" "人事"
"8年目" "17年目" "3年目"
"33" "48" "24"
という風に、パイプライン処理をするなら、おおよそ上の2つのオプションで事足りると思います。 他にも問答無用でクォーションしてくれないnoneと、問答無用で全てにクォーションしてくれるallがオプションとして利用できます。
CSVファイルを抽出する
最後にcsvファイルを保存する場合に触れます。
csvファイルを抽出するためのコマンド用法は以下です。
xlsx2csv [オプション] [XLSXファイル] [ファイル名/保存先]
シートを個別に名前を付けてエクスポートする際には、以下のようにします。
$ xlsx2csv -n 'Sheet1' book1.xlsx 1.csv
$ tree
.
├── 1.csv
└── book1.xlsx
また、全てのシートを一括保存した場合には、
-a, --all
$ xlsx2csv -a book1.xlsx ./
$ tree
.
├── Sheet1.csv
├── Sheet2.csv
├── Sheet3.csv
└── book1.xlsx
また、特定のシートだけはエクスポートしたくないときには
-E/--exclude_sheet_pattern [パターン]
$ xlsx2csv -a book1.xlsx ./ -E 'Sheet1' 'Sheet2'
$ tree
.
├── Sheet3.csv
└── book1.xlsx
基本的には-Eオプションは先程の-aオプションの拡張ですので、予め-aオプションを付けていないと正しく動作しません。 -E以降にしていた文字列パターンを引数に持つ配列で除外するファイルを指定しますので、-Eオプション自体はコマンドの最後で与える必要があります。
その逆の操作で、
-I/--include_sheet_pattern
$ xlsx2csv -a book1.xlsx ./ -I 'Sheet2' 'Sheet3'
$ tree
.
├── Sheet2.csv
├── Sheet3.csv
└── book1.xlsx
XSLXファイルの内容を確認する(リストコマンド風に)
先程、
-a
$ xlsx2csv -a book1.xlsx
-------- 1 - Sheet1
1,2,3
4,5,6
-------- 2 - Sheet2
7,8,9
a,b,c
-------- 3 - Sheet3
山田 モガ史,佐藤 マウ児,鈴木 ラヲ美
営業,経理,人事
8年目,17年目,3年目
33,48,24
また選択的にシートを絞って表示させたいときにも
-E
-I
$ xlsx2csv -a book1.xlsx -I 'Sheet2' 'Sheet3'
-------- 2 - Sheet2
7,8,9
a,b,c
-------- 3 - Sheet3
山田 モガ史,佐藤 マウ児,鈴木 ラヲ美
営業,経理,人事
8年目,17年目,3年目
33,48,24
$ xlsx2csv -a book1.xlsx -E 'Sheet3'
-------- 1 - Sheet1
1,2,3
4,5,6
-------- 2 - Sheet2
7,8,9
a,b,c
まとめ
今回はLinux環境からでも生のエクセルファイルをcsvデータとして扱えることを可能にする
xlsx2csv
このxlsx2csvはpythonによって作られていますので、pythonがインストールされている環境であれば、windowsなどのLinux以外のOSでも動作します。
ターミナルからxlsxファイルを操作したいのであればかなり強力なユーティリティとして使うことができるツールです。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー