あるプロジェクトで、csvファイルをxlsxに変換する必要がありました。
いろいろな方法がありますが、比較的やりやすかった方法がありましたので、備忘録として記載します。
方法は、gnumeric (とnkf)を使う方法です。インストールは簡単です。
sudo apt install gnumeric nkf
ここでは、例として、sample.csv を sample.xlsx に変換したいと考えます。
- 文字コードをUTF-8に変換
- Gnumericで変換
- XLSXシートのタブ名から.csvを取り除く
日本語が入っている場合、Shift-JISなどだとうまくいかない場合があるので、文字コードをUTF-8に変換します。
nkf -wLu --overwrite sample.csv
Gnumericについているssconvertというプログラムが簡単に変換してくれます。
ssconvert sample.csv sample.xlsx
簡単なのですが、この場合、sample.xlsxのシート名が sample.csv となってしまいます。これは気持ち悪いなと思いました。
なので、これを取り除く工夫が以下です。xlsxをxmlに変換し、xmlの中の.csvをsedで取り除き、そして、再度xmlをxlsxに変換します。
ssconvert --export-type=Gnumeric_XmlIO:sax:0 $sample.xlsx sample.xml sed -i 's/.csv//' sample.xml ssconvert --export-type=Gnumeric_Excel:xlsx sample.xml sample.xlsx rm sample.xml
これで望みどおりの変換ができました。
以上、まとめると、以下のようなスクリプトになります。
#!/bin/bash #prerequisites: nkf and gnumeric for f in *.csv do nkf -wLu --overwrite $f base=${f%.csv} ssconvert $f ${base}.xlsx ssconvert --export-type=Gnumeric_XmlIO:sax:0 ${base}.xlsx ${base}.xml sed -i 's/.csv//' ${base}.xml ssconvert --export-type=Gnumeric_Excel:xlsx ${base}.xml ${base}.xlsx rm ${base}.xml mv $f csv done