[[ノート>ノート/ノート]]

*PythonからExcelファイルをいじるopenpyxl [#e50a3c01]

ポイント:
-Pythonのパッケージopenpyxlで、Excelのファイル ***.xlsx を操作できる
-対象は、Office2007以降で使われているxlsxファイルのみ。古いxlsファイルは不可。
-ドキュメントはまだ完備まで行かない感じ、参考ページも少なくて、場合によってはソースを見る必要ありそう

参照ページ


-[[ドキュメント:http://openpyxl.readthedocs.org/en/latest/]]
-PDF ドキュメント  [[openpyxl Documenttation Release 2.0.2:https://media.readthedocs.org/pdf/openpyxl/2.0.2/openpyxl.pdf]]
-[[ソース:https://bitbucket.org/openpyxl/openpyxl/src/2.2/doc/source/index.rst]]
-tunanosuke blog [[openpyxl モジュールで excel 操作:http://tunanosuke.hatenablog.jp/entry/2014/02/20/201623]]
-[[openpyxlの使い方(背景色と罫線をつける):https://gist.github.com/oyakata/824dad8fa3eb4d729790]]
**インストール [#r29db558]
 pip install openpyxl
または
 easy_install openpyxl

イメージを入れたければ、pillowが必要。今は省略。
 pip install pillow

**使い方のサンプル [#f9c7c85d]
注: UTF-8で漢字もOKだった。

上記のブログにもサンプルがあるし、ドキュメントの中にもサンプルがある。

***例 ファイルを読んで、セルを取り出したり、書き込んだり、加工したりする [#v36d38a8]
 #!/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の背景が赤くなっている。

&ref(openpyxl_sample1.png);

セルのプロパティを読書きしてみたい。まず読み出すには
 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')



**複数のセルを読み出す 〜 表全体を読み出す [#f098a601]
シートに対して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のインスタンスかどうかを判定する)。

**セルプロパティ(塗りつぶし)の情報 [#h9683518]
 #!/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データにやってみたら、

&ref(cell_fill_properties.png);

こんなデータになった。
 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 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となっている。)

**セルの中で改行するには [#z8ec1e2c]
 from openpyxl.styles import Alignment, alignment
 currentCell = ws.cell('A4')
 currentCell.alignment = Alignment(wrapText='True')
 currentCell.value = u'abc\ndef'

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS