このサイトについて

11月28日(木),プログラミングの勉強会を開催します。エクセルの操作やスクレイピングをきっかけに学ぶ自動化のひみつ。

Pythonで生エクセルファイルを読み書きするpyExceleratorを使ってみた

Pythonで生エクセルファイルを読み書きするpyExceleratorを使ってみた

普段自らこういうことはやらないんだけど,やむにやまれず大量(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] )

 超Pythonicだ。exec文は使う必要ない,というかなにこれこわい。

こことか見ると,他にもフォント変えたり画像はりつけたりセルの幅変えたり,いろいろできるみたい。

2010-08-27 04:52