JavaのPOIをJythonから使ってみる方法もいけます。下記にまとめました(2010/7/25)。
「Pythonでエクセル操作 その2:Jython + POI」
「Pythonでエクセル操作 その2:Jython + POI」
PythonでExcelファイルを読み込むことになったので、pyExceleratorを使ってみました。
■pyExceleratorダウンロード先
■公式ドキュメント
作成中。。といっているが、ソースや例を見るようにとのこと。。。
■雑感
下記参考ページでも書いてありますが、pyExceleratorでは書き込みと読み込みでの作業勝手が違います。
特にExcelファイルの読み込み結果がスパース配列(*)であるため、Excel VBAのようにRangeオブジェクトを利用するようなデータ操作は使えないです。。。(「スパース配列」初めて聞いた。。。)
例えば、アクティブシートのA列から"excel"の文字列を含むセルの位置情報を取得したい場合、vbaだと次のように書けるけれど、これができない。
特にExcelファイルの読み込み結果がスパース配列(*)であるため、Excel VBAのようにRangeオブジェクトを利用するようなデータ操作は使えないです。。。(「スパース配列」初めて聞いた。。。)
例えば、アクティブシートのA列から"excel"の文字列を含むセルの位置情報を取得したい場合、vbaだと次のように書けるけれど、これができない。
Debug.Pring Columns("a").Find(What:="excel").Offset(0, 0)
pyExceleratorのparse_xls()関数の戻り値は、セルの位置情報(行と列)をキーとしたディクショナリ型です。
ディクショナリ型なので、値からキーを引くのが面倒。。。なので、関数を作ってみました。
ディクショナリ型なので、値からキーを引くのが面倒。。。なので、関数を作ってみました。
# coding:utf-8 from pyExcelerator import * def find_key_by_val(search_word, sheet_data): def map_find(_x, _y): if _y == search_word: return _x def except_None(_z): return _z <> None rlist = map(map_find, sheet_data.keys(), sheet_data.values()) return filter(except_None, rlist) if __name__ == '__main__': print 'start' for sheet_name, values in parse_xls(r'C:\Temp\test.xls'): key = find_key_by_val(u'検索したい文字列', values) if len(key) < 1: continue for row_index, col_index in sorted(values.keys()): if col_index == key[0][1]: print values[(row_index, col_index)] print 'end'
pyExceleratorでのExcelファイルの読み込み操作は、スパース配列の操作に慣れることとイコールなのかも。
■参考ページ
あちこちタイプミスしてますよ。
「スパーク配列」なのか
「スパース配列」なのか。
ほんださん
タイプミスの指摘ありがとうございます。
早速修正しました。
アレ、スパークの方に統一しちゃったんですね。
私はSparse配列のことだと思っていたのですが。
ほんださん
再度のご指摘ありがとうございます。
ちゃんと調べろって話ですね。
スパーク配列で検索すると上位に表示されてました。あたた。orz