#【環境】
windows8.1
Excel 2013
python2.7
opencv3
#【概要】
佐々木希の写真から色の情報を取得して、Excelのセルに塗りつぶします。
#【フォルダ構成】
|---sasaki_excel
|---sasaki_excel.py
|---sasaki_nozomi.jpg(佐々木希の画像)
|---sasaki_nozomi.xlsx(描画用のエクセル)
#【プログラム】
sasaki_excel.py
# -*- coding:utf-8 -*-
import cv2
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
# 画像読み込み
image = cv2.imread("sasaki_nozomi.jpg")
# エクセルファイル読み込み
wb = load_workbook(filename='sasaki_nozomi.xlsx')
# アクティブなシートを取り出す
ws = wb.active
# アスキーコードを使ってアルファベットのリスト作成
# col_name = ['A','B',...,'Z']
col_name = [chr(i) for i in range(65,65+26)]
# エクセルの列名リスト作成
i = 0
for j in xrange(26, len(image[0])):
# アルファベットの連結
col_name.append(col_name[i] + col_name[j % 26])
if (j + 1) % 26 == 0:
i += 1
if len(col_name) == len(image[0]):
break
for gyo in xrange(len(image)):
for retu in xrange(len(image[gyo])):
for rgb in xrange(len(image[gyo][retu])):
# 赤、緑、青の値を16進数へ変換
# 16進数にすると'0x**'と変換されるため後ろ2文字を取り出す
red = hex(image[gyo][retu][0])[2:4]
# 例えば'0xc'と変換される16進数もあるため、0を連結
if len(red) == 1:
red = '0' + red
green = hex(image[gyo][retu][1])[2:4]
if len(green) == 1:
green = '0' + green
blue = hex(image[gyo][retu][2])[2:4]
if len(blue) == 1:
blue = '0' + blue
# 列と行の幅を変更
ws.column_dimensions[col_name[retu]].width = 0.3
ws.row_dimensions[retu].height = 1.5
# 塗りつぶすセル名を取得
cell_name = col_name[retu] + str(gyo + 1)
# セル名をセット
cell = ws[cell_name]
# 16進数の数字を文字連結
color = str(blue) + str(green) + str(red)
# 塗りつぶし
cell.fill = PatternFill(patternType='solid', fgColor=color)
# エクセルファイル保存
wb.save('sasaki_nozomi.xlsx')
決して画像を貼りつけたわけではありませんよ(笑)
セルの幅は手動で調整しました。
[2016.5.29 追記]
セルの幅の調節を手動ではなくプログラムに組み込みました。
このプログラムの応用としては2枚の画像に対してセルの色を比較して、間違い探しをすることができます。
#【参考サイト】
PythonからExcelファイルをいじるopenpyxl
アスキーコード表
#【他言語版】
Node.js版はこちら
Ruby版はこちら