ノート

PythonからExcelファイルをいじるopenpyxl

ポイント:

参照ページ

インストール

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の背景が赤くなっている。

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')

複数のセルを読み出す 〜 表全体を読み出す

シートに対して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データにやってみたら、

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 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'

添付ファイル: filecell_fill_properties.png 858件 [詳細] fileopenpyxl_sample1.png 1013件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-25 (水) 16:41:43 (995d)