UbuntuでGnumericを用いてCSVをXLSXに変換する方法

あるプロジェクトで、csvファイルをxlsxに変換する必要がありました。
いろいろな方法がありますが、比較的やりやすかった方法がありましたので、備忘録として記載します。

方法は、gnumeric (とnkf)を使う方法です。インストールは簡単です。

sudo apt install gnumeric nkf

ここでは、例として、sample.csv を sample.xlsx に変換したいと考えます。

  1. 文字コードをUTF-8に変換
  2. 日本語が入っている場合、Shift-JISなどだとうまくいかない場合があるので、文字コードをUTF-8に変換します。

    nkf -wLu --overwrite sample.csv
    
  3. Gnumericで変換
  4. Gnumericについているssconvertというプログラムが簡単に変換してくれます。

    ssconvert sample.csv sample.xlsx
    
  5. XLSXシートのタブ名から.csvを取り除く
  6. 簡単なのですが、この場合、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