Excelへの出力  
   -解をExcelに直接書く

PythonのExcel操作ライブラリを使用して、解をExcelに直接書いてみましょう。Excelの操作ライブラリとしては、いくつかありますが、ここでは、Office2007以降のxlsxファイルのみ操作可能な、openpyxlを使います。古いxlsファイルは、操作できませんので、xlsファイルは、Excelでxlsx形式で保存してから呼び出してください。

1. openpyxlのインストール

ソルバが吐くpythonソースは、python3ですので、openpyxlもpython3対応のものをインストールする必要があります。

手順

  1. cygin64上のSETUPで、python3-setuptoolsパッケージをインストールします。 easy_install-x.x は、cyginwin のbinを見てインストールされているVersionにします。
  2. $easy_install-3.6 pip
  3. $pip install openpyxl

確認として、次のコマンドで、"Pythonで作成したExcelシート.xlsx"ファイルが生成されれば、動作OKです。

$python3 gen_excel.py

2.Excelファイルを新規作成する

gen_excel.pyは、次のソースです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from openpyxl import Workbook
wb = Workbook()
ws = wb.active


ws.title = "タイトル"
ws['A1']="Pythonで書いたExcelです"
wb.save('Pythonで作成したExcelシート.xlsx')

生成したExcelは次です。


次に、ソルバが吐いたpythonファイルをインポートしてスタッフ名を書いてみます。
importするpyソースは、交代3X9.py です。
ソルバが生成した交代3X9.pyには、スタッフ名のリストがstaffdefとして載っています。リストの長さをlen()で読み取り、forの範囲を0から、スタッフ数分読み取り、ワークシートに書きこみます。(セルA2〜の書き込み)
それをExcelのワークシートwsに書き出すソースです。

生成したシートは、Pythonで作成したExcelシート1.xlsxとして保存しています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from 交代3X9 import *
from openpyxl import Workbook
wb = Workbook()
ws = wb.active


ws.title = "タイトル"
for i in range(0,len(staffdef)):
        s='A'+str(i+2)
        ws[s]=staffdef[i]



wb.save('Pythonで作成したExcelシート1.xlsx')


Cygin64上でコマンドを打ち込みます。

$python3 gen_excel1.py


すると、次のようなExcelファイルが生成されました。



3.解をExceに書き込む


次は、解をExcelに書き込んでみましょう。
次がソースです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from 交代3X9 import *
from openpyxl import Workbook
from openpyxl.cell import get_column_letter
from openpyxl.styles import PatternFill
wb = Workbook()
ws = wb.active

def シフト名(p,d):
        if X[p][d][N]:
                return "日勤"
        elif X[p][d][J]:
                return "準夜勤"
        elif X[p][d][S]:
                return "深夜"
        elif X[p][d][Y]:
                return "休み"
        elif X[p][d][H] :
                return "祝日"
        else:
                print("Program Error");
                sys.exit()
def シフトカラー(p,d):
        if X[p][d][N]:
                return PatternFill(patternType='solid', fgColor='FFFF0000')
        elif X[p][d][J]:
                return PatternFill(patternType='darkDown', fgColor='FF000000')
        elif X[p][d][S]:
                return PatternFill(patternType='lightGray', fgColor='0000FF00',bgColor='FFEEEE00')
        elif X[p][d][Y]:
                return PatternFill(patternType='darkDown', fgColor='FFFF0000',bgColor='FFEEEE00')
        elif X[p][d][H] :
                return PatternFill(patternType='darkDown', fgColor='FFFF0000')
        else:
                print("Program Error");
                sys.exit()


        
def 行項目生成(roffset):
        for i in range(0,len(staffdef)):
                s='A'+str(i+roffset)
                ws[s]=staffdef[i]

def 列項目生成(coffset):
        for i in range(0,len(daydef)):
                col = get_column_letter(i+coffset)
                ws.cell('%s%s'%(col, 1)).value=daydef[i] 
                
def シフト生成(roffset, coffset):
        for p in range(0,len(staffdef)):
                for d in range(0,len(daydef)):
                        col = get_column_letter(d+coffset)
                        ws.cell('%s%s'%(col,p+roffset)).value=シフト名(p,d)
                        ws.cell('%s%s'%(col,p+roffset)).fill =シフトカラー(p,d) 
        
X=Sol0

ws.title = "タイトル"
roffset=2
coffset=3
行項目生成(roffset)
列項目生成(coffset)
シフト生成(roffset,coffset)


wb.save('Pythonで作成したExcelシート2.xlsx')


Cygin64上でコマンドを打ち込みます。

$python3 gen_excel2.py


すると、次のようなExcelファイルが生成されました。


なお、Excelが当該ファイルを開いた状態で、上記プログラムを実行するとエラーが発生します。(書き込めません)


4.Excelファイルを読み込む


3.で生成したExcelファイルを読み込んでいます。
読み込んだシートのセルの値は、valueで取得しています。
読み込んだシートを'Pythonで作成したExcelシート3.xlsx'という名前で保存しています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from 交代3X9 import *
from openpyxl import Workbook
from openpyxl.cell import get_column_letter
from openpyxl.styles import PatternFill
from openpyxl import load_workbook

def シフトPrint(roffset, coffset):

        for p in range(0,len(staffdef)):
                日勤数=0
                深夜数=0
                公休数=0
                for d in range(0,len(daydef)):
                        if d < スケジュール開始日:
                                continue
                        col = get_column_letter(d+coffset)
                        print(p,d,ws.cell('%s%d'%(col,p+roffset)).value)
                

wb = load_workbook(filename='Pythonで作成したExcelシート2.xlsx')
ws = wb.active
シフトPrint(2,3)
wb.save('Pythonで作成したExcelシート3.xlsx')



Cygin64上でコマンドを打ち込みます。

$python3 gen_excel3.py


すると、次のようなExcelファイルが生成されました。Excelシート2と同じになります。

5.読み込んだExcelファイルに追加する


3.で生成したExcelファイルを読み込んでいます。
読み込んだシートのセルの値は、valueで取得しています。
Excel上の日勤数、深夜数、公休数を数え、Excel上に追加しています。
'Pythonで作成したExcelシート4.xlsx'という名前で保存しています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from 交代3X9 import *
from openpyxl import Workbook
from openpyxl.cell import get_column_letter
from openpyxl.styles import PatternFill
from openpyxl import load_workbook


def シフト回数書き込み(roffset, coffset):
        col1=get_column_letter(len(daydef)+0+coffset)
        col2=get_column_letter(len(daydef)+1+coffset)
        col3=get_column_letter(len(daydef)+2+coffset)
        ws.cell('%s%d'%(col1,1)).value='日勤数'
        ws.cell('%s%d'%(col2,1)).value='深夜数'
        ws.cell('%s%d'%(col3,1)).value='公休数'

        for p in range(0,len(staffdef)):
                日勤数=0
                深夜数=0
                公休数=0
                for d in range(0,len(daydef)):
                        if d < スケジュール開始日:
                                continue
                        col = get_column_letter(d+coffset)
                        if ws.cell('%s%d'%(col,p+roffset)).value=='日勤':
                                日勤数+=1
                        if ws.cell('%s%d'%(col,p+roffset)).value=='深夜':
                                深夜数+=1
                        if ws.cell('%s%d'%(col,p+roffset)).value=='休み':
                                公休数+=1
                ws.cell('%s%d'%(col1,p+roffset)).value=日勤数
                ws.cell('%s%d'%(col2,p+roffset)).value=深夜数
                ws.cell('%s%d'%(col3,p+roffset)).value=公休数
                

wb = load_workbook(filename='Pythonで作成したExcelシート2.xlsx')        
ws = wb.active
シフト回数書き込み(2,3)
wb.save('Pythonで作成したExcelシート4.xlsx')


Cygin64上でコマンドを打ち込みます。

$python3 gen_excel4.py


すると、次のようなExcelファイルが生成されました。日勤数、深夜数、公休数が追加されています。


このように、ソルバが吐くpythonをインポートすることで、Excelの処理も簡単に書くことができます。


[Prev] [Next] [Index] [Home]