【xlsx2csvコマンド活用編】Linux環境でExcelファイル(xls/xlsx)をCSVデータに変換する


2021/04/02

今回はExcelでCsv形式のデータをエクスポートしたいけど、WindowsOSのパソコンは無し、Linuxしか使いたくない方のための
xlsx2csvコマンドの紹介記事です。


はじめに

当サイトではオフィス業務のComputer-Aidedなハイブリッドな方法を模索し、より効率的なExcel業務を実現したい多忙なオフィスワーカー向けの主にAwkとSedを使うシェル講座です。

シェルスクリプトはどこでもどんなOSでも基本的に使えて、しかも一度使い方を覚えると、Excelと組み合わせて最高に効率の良いオフィスワークツールが作れることでしょう。

合同会社タコスキングダム|蛸壺の技術ブログ


インストール方法

まずはxlsx2csvのLinuxへの導入方法を確認します。

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ファイルを抽出するコマンドです。

まずはブラウザ版の
Excel Onlineから適当なxlsxファイルを作成してみます。

合同会社タコスキングダム|蛸壺の技術ブログ

内容としてはシートを二つ(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コマンドを使って全てのシートをcsvエクスポートで利用しましたが、保存先を指定しなければ、コマンドラインから直接xslxの内容を確認できるという使い方も可能です。

            
            $ 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ファイルを操作したいのであればかなり強力なユーティリティとして使うことができるツールです。
記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

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