Python でExcel を読み込む xlrd の解説はネットでたくさん見つかるのだが、やはり書いてみないと習得できない。
Excel ファイルのサンプル、 sample.xlsx が以下の様になっているとする。
Name | value | 開始日 |
あいう | 242 | 2018/11/06 |
ABCD | 108 | 2018/11/07 |
XYZ | 47 | 2018/11/08 |
まずは、これを読み込むスタンダードな簡単なスクリプト
# -*- coding: utf-8 -*- import xlrd book = xlrd.open_workbook('sample.xlsx') sheet = book.sheet_by_index(0) for row in range(1, sheet.nrows): print("%s %d %s" % (sheet.cell_value(row, 0), sheet.cell_value(row, 1), sheet.cell_value(row, 2) ) )
1行目はヘッダだから読み飛ばしてる。
cell_value(row, col) は、cell(row, col).value でも同じ。
上の結果は、
あいう 242 43410.0 ABCD 108 43411.0 XYZ 47 43412.0
と、日付が小数点になってしまう。
セルのタイプをチェックする。
sheet.cell_type(row, col) もしくは、sheet.cell(row, col).ctype で取得できる値は、
API Reference — xlrd 1.1.0 documentation を参照すると、
0 | 空セル |
1 | テキスト文字列(Unicode string) |
2 | 数値(float) |
3 | 日付(float) |
これに従いセルをチェックすると日付のセルは、 3=日付(float) である。
日付をなんとか、yyyy/MM/dd の書式にしたいので、
https://qiita.com/nezumi/items/23c301c661f5e9653f19
を参考にさせてもらい、、
# -*- coding: utf-8 -*- import xlrd def excel_date(num): from datetime import datetime, timedelta return(datetime(1899, 12, 30) + timedelta(days=num)).strftime("%Y/%m/%d") book = xlrd.open_workbook('sample.xlsx') sheet = book.sheet_by_index(0) for row in range(1, sheet.nrows): str = "'%s', %d, TO_DATE('%s','YYYY/MM/DD')" % ( sheet.cell(row, 0).value, sheet.cell(row, 1).value, excel_date(sheet.cell(row, 2).value) ) print(str)
結果、
'あいう', 242, TO_DATE('2018/11/06','YYYY/MM/DD') 'ABCD', 108, TO_DATE('2018/11/07','YYYY/MM/DD') 'XYZ', 47, TO_DATE('2018/11/08','YYYY/MM/DD')
と、まあ、とりあえず、めでたし、めでたし。