コマンドラインを使用してLinuxでxlsxをcsvに変換する


266

Linuxでxlsxファイルをcsvファイルに変換する方法を探しています。

私は数百万行を処理することを検討しているので、PHP / Perlやそのようなものを使用したくないので、簡単なものが必要です。xls2csvと呼ばれるプログラムをUbuntuリポジトリで見つけましたが、それはxls(Office 2003)ファイル(現在使用中)のみを変換しますが、新しいExcelファイルのサポートが必要です。

何か案は?


10
スクリプト言語が自然に遅くなるだろうと実施しているものを考えることはそうです...少し見当違い、これらの言語で興味深いのライブラリはC言語で書かれたバックエンド有する傾向にあり、特に以来
チャールズ・ダフィー

2
Excelは以前は65536行に制限されていました。現在は1,048,576(support.microsoft.com/kb/120596)です。「数百万行」を収めるのは難しいでしょう。ただ言う...
Pavel Veller、

1
@Pavelは複数のファイルに存在する可能性があります。
Charles Duffy

2
...個人的には、Pythonのxlsvライブラリを使用してこれを行いますが、スクリプトベースのアプローチは問題外と記述されているため... shrugです。(プログラムツールが回答から除外されている場合、それはプログラミングの質問ですか?)
Charles Duffy

1
@CharlesDuffy現在、PHPライブラリを使用してこれを行っています。xls2csvに1秒かかり、phpに10分かかります。文字通り。
user1390150

回答:


239

Gnumericにはスプレッドシートアプリケーションと呼ばれるコマンドラインユーティリティが付属していますssconvertスプレッドシート形式の様々な間で変換することができます:

$ ssconvert Book1.xlsx newfile.csv
Using exporter Gnumeric_stf:stf_csv

$ cat newfile.csv 
Foo,Bar,Baz
1,2,3
123.6,7.89,
2012/05/14,,
The,last,Line

Ubuntuにインストールするには:

apt-get install gnumeric

Macにインストールするには:

brew install gnumeric

19
本当にスプレッドシートを変換する最も手間のかからない方法。bashスクリプトと組み合わせると、複数のファイルをバッチ処理できます。for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneLibreOfficeメソッドはおそらく他のフォーマットを処理できますが、私はそれを機能させることができませんでした(--headless引数があっても毎回空のファイルを開くだけでした)。
sleblanc 2013

6
@sebleblancまったく面倒ではありません。依存関係の数を考えると、インストールは面倒です(ヘッドレスサーバーでこれを実行している場合)。これまでのところ、gcc、intltool、zlib-devel、GTK ... GTKにはglib、atk、pango、cairo、cairo-object、gdk-pixbuf-2.0 ...が必要です
andrewtweber

11
私は何とかヘッドレスのdebianサーバーにインストールできましたapt-get install gnumeric --no-install-recommends。唯一の欠点は、GConf-WARNING **:クライアントが実行中にD-BUSデーモンへの接続に失敗したことで、多くの警告が発生することです。単純な方法でssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1うまくいきます。
Benjamin Delichere 2014年

7
csvに書き込むには、-Sフラグで複数のシートを書き込む必要があります。それぞれが独自のファイルに移動します。
Ed Avis

5
@hhhセパレータオプションは、txtエクスポートタイプでのみ機能します。これを使用してstdout:に出力できますssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1
exic

135

LibreOfficeでこれを行うことができます:

libreoffice --headless --convert-to csv $filename --outdir $outdir

はっきりしない理由で、これをsudoで実行する必要があるかもしれません。次の行をsudoersファイルに追加することで、パスワードを要求せずにLibreOfficeをsudoで動作させることができます。

users ALL=(ALL) NOPASSWD: libreoffice

35
libreofficeに2枚目のシートが必要であることをどのように伝えますか?
dmeu 2013年

30
パスワードなしでsudoがすべての人にlibreofficeを使用できるようにすると、ワームの缶が開かれます。マルチユーザープラットフォームでroot権限を取得する可能性を含め、その結果に注意してください
Interarticle

5
これでうまくいきました(sudoは不要です)。私のバージョン:libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein

5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filename私のためにOS Xで働いた。
Nobu

12
ASCII以外の文字を保持してutf-8に変換するには、代わりにを使用します--convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1"。詳細については、Open Office Wikiを参照してください。
Aryeh Leib Taurog、2015

132

デスクトップ環境がすでにある場合は、Gnumeric / LibreOfficeが適切に機能すると確信していますが、ヘッドレスサーバー(Amazon Web Servicesなど)では、インストールする必要のある多数の依存関係が必要です。

私はこのPythonの代替案を見つけました:

https://github.com/dilshod/xlsx2csv

$ easy_install xlsx2csv
$ xlsx2csv file.xlsx > newfile.csv

インストールに2秒かかり、魅力のように動作しました。

複数のシートがある場合は、一度にすべてエクスポートすることも、一度に1つずつエクスポートすることもできます。

$ xlsx2csv file.xlsx --all > all.csv
$ xlsx2csv file.xlsx --all -p '' > all-no-delimiter.csv
$ xlsx2csv file.xlsx -s 1 > sheet1.csv

彼はまた、Bash、Python、Ruby、Javaで構築されたいくつかの代替案にリンクしています。


うまく動作しますが、私はsudo(IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/prettytable-0.7.2-py2.7.egg/EGG-INFO/top_level.txt')としてのみ実行できます。考えてみたところ、で同じエラーが発生しましたcsvkit
user2105469

2
....私にとってはうまく機能し、-sオプションを使用して各シートを個々のファイルに抽出できるようになりました-libreofficeがシートのサイズを処理できなかった場合、xlsx2csvには問題がありませんでした
Soren

ありがとう!Ubuntuでとても便利です。
zhuguowei 2015年

5
DebianとUbuntuにはxlsx2csvパッケージがあるため、手動でインストールする必要はありませんがeasy_install、パッケージマネージャーを使用できます。
josch

MacOSでは、次のものが必要ですsudo easy_install xlsx2csv
フランクヒンチ

32

bashでは、このlibreofficeコマンドを使用して、現在のディレクトリにあるすべてのxlsxファイルを変換しました。

for i   in *.xlsx; do  libreoffice --headless --convert-to csv "$i" ; done

ファイル名のスペースを処理します。

数年後にもう一度試してみましたが、うまくいきませんでした。このスレッドはいくつかのヒントを提供しますが、最も迅速な解決策はrootとして実行する(またはを実行するsudo libreoffice)ことでした。エレガントではないが速い。

Windowsでコマンドscalc.exeを使用する


13
これを試行する前に、すべてのopenofficeウィンドウを必ず閉じてください。そうしないと、暗黙的に失敗します。
tacone 2014

また、Windowsでは、コマンドはscalc.exeではなくですlibreoffice。今日の安定したLOバージョンで私のために働いた。
AronVanAmmers 2017


8

別のオプションは、便宜上、小さなbashラッパーを介してRを使用することです。

xlsx2txt(){
echo '
require(xlsx)
write.table(read.xlsx2(commandArgs(TRUE)[1], 1), stdout(), quote=F, row.names=FALSE, col.names=T, sep="\t")
' | Rscript --vanilla - $1 2>/dev/null
}

xlsx2txt file.xlsx > file.txt

8

.xlsxファイルに多数のシートがある場合、-sフラグを使用して必要なシートを取得できます。例えば:

xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv

second_sheet.csvの2枚目のデータが含まれますmy_file.xlsx


5

ssconvertと呼ばれるコマンドラインユーティリティが付属するGnumericスプレッドシートアプリケーションを使用すると、非常に簡単です。

find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;

これで完了です!


Pascal-Louis Perez氏、非常に役に立ち、ありがとう
Karthickkumar Nagaraj

1
上記のコマンド 'ssconvert'は65536行のみを変換しますが、複数の行が不足しています。助けてくれますか?
Karthickkumar Nagaraj

4

Javaコマンドラインを実行してもよい場合は、Apache POI HSSFのExcel Extractorを使用して実行できます。それは持っているコマンドライン抽出すると言う方法を。これはただすべてを捨てるようです。彼らは、CSVに変換するこの例を指摘しています。実行する前にコンパイルする必要がありますが、これにもmainmainメソッドがあるためせるためにそれ自体多くのコーディングを行う必要はありません。

飛ぶかもしれないがもう一方の作業が必要になるもう1つのオプションは、最近ExcelがExcelのXMLデータまたはXMLスプレッドシートとして、MSがこのフォーマットで呼び出すものとして提供することです。それはあなたがあなたが望む方法でそれをスライスしてダイスする機会の全く新しい世界を開きます。


1
これが.xlsxもサポートするかどうか知っていますか?
dimroc 14

1

他の人が言ったように、libreofficexlsファイルをcsvに変換できます。私にとっての問題は、シートの選択でした。

このlibreoffice Pythonスクリプトは、単一のシートをCSVに変換するのに優れています。

使い方は:

./libreconverter.py File.xls:"Sheet Name" output.csv

(私の側で)唯一の欠点は、--headless動作しないようです。しばらく表示されてから終了するLOウィンドウがあります。
それは私には大丈夫です、それは仕事を迅速に行う唯一のツールです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.