普段自らこういうことはやらないんだけど,やむにやまれず大量(500個ほど)のエクセルファイルをCSVファイルに変換する必要があった。RubyではSpeadsheetというのがあるみたい。PerlではSpreadsheet::WriteExcelとかSpreadsheet::ReadExcelとか使うのかな。
まあ僕はPythonな人ということもあり,Pythonでできないかと思って調べてみたらpyExceleratorというモジュールを発見した。Pure Pythonで書かれたモジュールなのでインストールが簡単。生のエクセルファイルを直接読み書きできるので,プラットフォームを問わず動かすことができる。
やりたいことはエクセル -> CSVファイルへの変換なので,ここで発見したスクリプトをちょっと改造して使った。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, csv
import pyExcelerator
def xls_to_csv( xls_file, csv_file ):
xls_sheets = pyExcelerator.parse_xls( xls_file )
#for sheet_id in xls_sheets:
cell_dict = xls_sheets[0][1]
# set limitter row_max and column_max
for which in (0, 1):
exec ("""%s = max([cell_dict.keys()[key_index][which]"""
""" for key_index in xrange(len(cell_dict.keys()))] )""") % \
["row_max", "column_max"][which]
# creating csv file.
create_csv = csv.DictWriter(file(csv_file, "ab"),
fieldnames=range(column_max+1) )
for row in xrange(row_max+1):
create_csv.writerow(dict(
enumerate([cell_dict.copy().get((row, column), '')
for column in xrange(column_max+1)])))
if __name__ == "__main__":
xls_to_csv( sys.argv[1], sys.argv[2] )
# -*- coding: utf-8 -*-
import sys, csv
import pyExcelerator
def xls_to_csv( xls_file, csv_file ):
xls_sheets = pyExcelerator.parse_xls( xls_file )
#for sheet_id in xls_sheets:
cell_dict = xls_sheets[0][1]
# set limitter row_max and column_max
for which in (0, 1):
exec ("""%s = max([cell_dict.keys()[key_index][which]"""
""" for key_index in xrange(len(cell_dict.keys()))] )""") % \
["row_max", "column_max"][which]
# creating csv file.
create_csv = csv.DictWriter(file(csv_file, "ab"),
fieldnames=range(column_max+1) )
for row in xrange(row_max+1):
create_csv.writerow(dict(
enumerate([cell_dict.copy().get((row, column), '')
for column in xrange(column_max+1)])))
if __name__ == "__main__":
xls_to_csv( sys.argv[1], sys.argv[2] )
超Pythonicだ。exec文は使う必要ない,というかなにこれこわい。
こことか見ると,他にもフォント変えたり画像はりつけたりセルの幅変えたり,いろいろできるみたい。