![]() |
ノート/PythonからExcelファイルをいじるopenpyxlhttps://pepper.is.sci.toho-u.ac.jp:443/pepper/index.php?%A5%CE%A1%BC%A5%C8%2FPython%A4%AB%A4%E9Excel%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2%A4%A4%A4%B8%A4%EBopenpyxl |
![]() |
ポイント:
参照ページ
pip install openpyxl
または
easy_install openpyxl
イメージを入れたければ、pillowが必要。今は省略。
pip install pillow
注: UTF-8で漢字もOKだった。
上記のブログにもサンプルがあるし、ドキュメントの中にもサンプルがある。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, codecs sys.stdout = codecs.getwriter('utf_8')(sys.stdout) from openpyxl import load_workbook from openpyxl.styles import Font, Color, colors from openpyxl.styles import PatternFill (この辺はいろいろと) wb = load_workbook(filename='mytest.xlsx') Excelのブックファイルを読み出す ws = wb.active アクティブなシートを取り出す。シート名でも取り出せるらしい。 漢字のシート名については要チェックかも。 これで、シートを操作できるようになる。全く新しくシートを作る時は別項で。 A3 = ws['A3'] A2セルを読み出して、変数A2にアサイン。A2は値そのものではない。 print(A3,value) A2セルの値は、.valueで抽出 u'c' 値u'c'が読める E5 = ws['E5'] f5 = Font(color=colors.RED) 後で使うためにf5という名前で「フォント色指定・赤」を作る E5.font = f5 f5をE5の.fontに代入して、font色指定プロパティを赤にする ws['D4'] = u'山田太郎' 漢字も使える ws['D4].font = Font(color=colors.GREEN) 別にD4.font=Font(...)と直接書いてもいい。 wb.save('mytest.xlsx') この状態でファイルにセーブ。
これで、Excelで見てみると、セルD4に山田太郎と書かれていたり、セルE5の文字が赤くなったり、A2の背景が赤くなっている。
セルのプロパティを読書きしてみたい。まず読み出すには
print ws['C4'].fill.patternType, ws['C4'].fill.bgColor, ws['C4'].fill.fgColor
のように、fillのタイプ(solidとかgray0625とか)が読み出せ、色はaRGBの32ビット16進。
セルに色を付けたり網掛けをしたりするには、
A2.fill = PatternFill(patternType='solid', fgColor='FFFF0000')
のように、PatternFillを使う。patternTypeの選択肢としては、'darkDown', 'lightGray', 'darkHorizontal', 'gray0625', 'lightGrid', 'lightVertical', 'solid', 'darkGray', 'gray125', 'darkGrid', 'darkUp', 'mediumGray', 'darkTrellis', None, 'lightDown', 'lightUp', 'lightHorizontal', 'darkVertical', 'lightTrellis' がある。
色はaRGB。fgColorがパターンの色、bgColorが背景色なので、solidの場合はfgColorだが、その他のパターンではパターン自体の色がfgColorで、セル全体の色は背景色ということになってbgColorで指定する。たとえばこんなイメージである。
print ws['C4'].value print ws['C4'].fill.patternType print ws['C4'].fill.bgColor.rgb print ws['C4'].fill.fgColor.rgb A2.fill = PatternFill(patternType='gray0625') A2.fill = PatternFill(patternType='gray0625', fgColor='FF0000FF', bgColor='FFFF0000') A2.fill = PatternFill(patternType='gray0625', fgColor='FFFF0000', bgColor='FFEEEE00')
シートに対してrows(もしくはcols)メソッドを施すと、全体が、リストのリストとして読み出せる。
wb = load_workbook(filename='mytest.xlsx') ws = wb.active x = ws.rows これだけで、ws全体をリストのリストとして読む for u in x: uは1行分のリスト for v in u: vは行内の1つのセル要素 print v.value + '\t', print
として、原理的にはOKなのだが、セルの内容が数値の時はint型などで、文字の時はunicode になる。いい加減に処理するとエラーになるので、vの型を判定することにした。
x = ws.rows for u in x: for v in u: if not isinstance(v.value, unicode): print str(v.value) + '\t', else: print v.value + '\t', print
このisinstanceは、型を判定する(ある変数v.valueの内容が、指定した型unicodeのインスタンスかどうかを判定する)。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, string, codecs sys.stdout = codecs.getwriter('utf_8')(sys.stdout) from openpyxl import load_workbook from openpyxl.styles import Font, Color, colors from openpyxl.styles import PatternFill wb = load_workbook(filename='mytest.xlsx') ws = wb.active x = ws.rows for u in x: for v in u: print v.row, v.column, v.value, v.fill.patternType, v.fill.fgColor.rgb, v.fill.bgColor.rgb
を、図のようなExcelデータにやってみたら、
こんなデータになった。
1 A None None 00000000 00000000 1 B None solid FFFFFF00 Value must be type 'basestring' solidでfgに黄色、bgはundefらしい 1 C None None 00000000 00000000 1 D None None 00000000 00000000 1 E None None 00000000 00000000 2 A None gray0625 FFFF0000 FFEEEE00 gray0625でfgが赤の点々、bgがやや薄い黄 2 B None None 00000000 00000000 2 C None None 00000000 00000000 2 D None lightTrellis FFFF0000 FF00B0F0 lightTrellisでfgが赤、bgが青(空色) 2 E None lightTrellis FFFF0000 Value must be type 'basestring' lightTrellisでfgが赤、bgが灰色(灰色はundefinedらしい) 3 A None None 00000000 00000000 3 B None None 00000000 00000000 3 C None solid FFC6EFCE 00000000 solidでfgは薄緑色、bgは0(undefではない値が入っている) 3 D None None 00000000 00000000 3 E None None 00000000 00000000 4 A None None 00000000 00000000 4 B None solid Value must be type 'basestring' Value must be type 'basestring' solidで黒なのだが、fgもbgもundefinedらしい。 白〜灰色〜黒はいずれもundefになることがある 4 C None None 00000000 00000000 4 D None None 00000000 00000000 4 E None None 00000000 00000000 5 A None None 00000000 00000000 5 B None None 00000000 00000000 5 C None solid Value must be type 'basestring' Value must be type 'basestring' solidで白なのだが、fgもbgもundefinedらしい。 5 D None None 00000000 00000000 5 E None lightTrellis FFFF0000 00000000 lightTrellisでfgが赤、bgは0=無色
となった。
どうもこの世界では、色味がない(白〜灰色〜黒)とValue must be type 'basestring' (おそらくundefined)となっているのと、solidで背景色が指定されないときにValue must be ...なのと、2つが重なっている感じがする。値00000000とは区別されているが、初期値は0らしい。(たとえば1Aは何も書き込んでいないので、None None 00000000 00000000となっている。)
from openpyxl.styles import Alignment, alignment currentCell = ws.cell('A4') currentCell.alignment = Alignment(wrapText='True') currentCell.value = u'abc\ndef'