Python の xlrd ライブラリを用いて Excel ファイルのシート内容を Markdown に落とす

Excel ファイルは非常に読みづらいので、Markdown に変換して「表ではなくテキストファイルを読む感覚で」読み進めたいなと思った。Python の xlrd ライブラリだと簡単に Excel ファイルを辿れそうだったので、今回試しに作ってみた。

以下 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