Python の xlrd ライブラリを用いて Excel ファイルのシート内容を Markdown に落とす
Excel ファイルは非常に読みづらいので、Markdown に変換して「表ではなくテキストファイルを読む感覚で」読み進めたいなと思った。Python の xlrd ライブラリだと簡単に Excel ファイルを辿れそうだったので、今回試しに作ってみた。
- スクリプトは GitHub にアップした
以下 xlrd の使い方やテクニカルな部分をさらっと解説。
xlsx ファイル全般情報
open_workbook() で読み込んで、nsheets でシート数、sheet_names() でシート名のリストが取れる。
import xlrd
bookobj = xlrd.open_workbook(ファイル名)
sheet_count = bookobj.nsheets
sheet_names = bookobj.sheet_names()
各シートへのアクセス
open_workbook() で手に入れたオブジェクトの sheet_by_index() を呼ぶ。引数に「取得したいシートの番号」を入れる。番号は 0 オリジン。つまり一番左のシートが 0 番で、一つ右は 1 番、次が 2 番……という風に対応付いている。
sheet = bookobj.sheet_by_index(取りたいシートの番号)
あとは、得られた sheet オブジェクトに対してあれこれ操作する。今回はシート中の全セルの内容が欲しいので、
- ncols でシートのカラム(列)数、nrows で行数を取得
- ncols と nrows の値でループして、各セルにアクセスする
というやり方を使った。
xsize = sheet.ncols ysize = sheet.nrows for y in range(ysize): for x in range(xsize): cell = sheet.cell(y, x) value = cell.value
ここで value(セルの値) は以下のように変換される。
- 値が文字列 → string 型
- 値が数字 → int or float 型
セルには文字列も数字も入っていることがあるので、「文字列だったらこうする」「数字だったらこうする」と条件分岐をしっかり書いておいた方がいい。
列番号を列名(0,1,2→A,B,C)に変換する
Excel だと列は A, B, C, ... AA, AB, ... という風にアルファベットで列を識別するが、xlrd 上では番号で識別される。
表示する際、番号よりも列名の方が直感的でわかりやすいので、本スクリプトではついでに変換も行っている。といっても xlrd の機能ではないので自分で頑張って書かねばならない。
def column2alphabet(column_number): div = column_number s = '' temp=0 while div>0: module = (div-1)%26 s = chr(65 + module)+s div = int((div-module)/26) return s
なにやら割り算と剰余が登場しているが、この変換はいうなれば 10 進数を 26 進数に変換するようなものである。26 進数は 26 通りの表現パターン(ここではアルファベットa-z)があるので、元の 10 進数を 26 で割った余りを見ることで「26パターンのうちの何パターン目か」を順に取得していっている……とでも言えばいいか。進数変換はそういうものだ。
参考(というかほぼ流用): python - Convert spreadsheet number to column letter - Stack Overflow