[python][D&D]初心者がGUIでExcelファイルを処理するプログラムを作ってみた

スポンサーリンク

ど素人2人でpythonでプログラムを作ってみた。(ながしー HIRATA)

会社の仕事をプログラムで組んで楽できないかなーと試行錯誤中!!

プログラムをコピペすれば何となく、エクセル処理ができるようになる! 

三か月くらいかかったよ!!
中身はよくわからんです

機能
・GUI
・ドラッグアンドドロップ
・PDF アウトプット
・エクセル処理(エクセル関数だけど。。。)
・グラフ作成
・意味不明なコードは仕様

スポンサーリンク

参考にしたHP

 https://python-minutes.blogspot.com/2017/01/pythongui_89.html

python入門ブログ


機能紹介

画像に alt 属性が指定されていません。ファイル名: python.jpg

これがプログラム実行時の画面です。

①ここで入力した数字などはエクセルファイルに入力されます。

②青い部分にエクセルファイルをドラッグアンドドロップ

.xlsx 以外を入れると怒られちゃうよ

③実行

 

④出力されるもの

output エクセル

output PDF

グラフ.jpg

こんな感じでプログラムと同じところに出力されます。

 

これがoutput PDFの中身。

GUIの入力と表記がちょっと違うけど修正ミス。

コード

絶対書き方めちゃくちゃです。

いらないモジュールとかもimportしていると思います。

こいつ、動くぞ!

#グラフ化に必要なものの準備。
import matplotlib.pyplot as plt
#データの扱いに必要なライブラリ
import pandas as pd
import numpy as np
import datetime
import seaborn as sns
import win32com.client
import os
import xlwt
import xlrd
from xlutils.copy import copy
import openpyxl as xl
from openpyxl.workbook import Workbook
from openpyxl.styles.fonts import Font
from openpyxl.styles.borders import Border, Side
from openpyxl.styles.colors import Color
from openpyxl.styles import PatternFill
from openpyxl.styles import Alignment
from openpyxl.styles import Border, Side
import wx
from openpyxl.drawing.image import Image #よくわからないけどここで定義してる
import time#時間計測のためimportします。
import pythoncom #Excel起動、終了時のエラーを解消するため
#ファイルをドラッグアンドドロップするとファイルのパスを取得します。
#必要事項を入力後にレポート作成を押すとレポートを作成します。
#ファイルをドラッグアンドドロップした時の挙動について
class FileDropTarget(wx.FileDropTarget):
    """ Drag & Drop Class """

    def __init__(self, window):
        wx.FileDropTarget.__init__(self)
        self.window = window
   

#ファイルがドラッグアンドドロップされるとこのプログラム始動
    def OnDropFiles(self, x, y, files): 
        filepath = files[0]
        if filepath[-5:]==".xlsx":
            self.window.text_entry.SetLabel(filepath)
            return 0
        else:
            wx.MessageBox("試験の測定データ(.xlsx)をドラッグアンドドロップしてくれ。")
            return 0


#GUIとその画面に含まれる機能について
class App(wx.Frame):
    """ GUI """
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(500, 600), style=wx.DEFAULT_FRAME_STYLE)
        

        # パネル
        p = wx.Panel(self,id,pos = (0,0), size = (500,400))


    # テキスト入力ウィジット
        font = wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
        font2 = wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
        self.men= wx.TextCtrl(p,id,'123456',pos = (100,80))
        self.men.SetFont(font)
        self.labelmen = wx.StaticText(p, id,"測定機番号",pos = (100,55))
        self.labelmen.SetFont(font)
        

        
        self.mic= wx.TextCtrl(p,id,'ながしー',pos = (100,160))
        self.mic.SetFont(font)
        self.labelmic = wx.StaticText(p, id,"測定者の名前",pos = (100,135))
        self.labelmic.SetFont(font)
        
        self.pl= wx.TextCtrl(p,id,'20',pos = (300,160))
        self.pl.SetFont(font)
        self.labelpl = wx.StaticText(p, id,"温度",pos = (300,135))
        self.labelpl.SetFont(font)

        self.slot= wx.TextCtrl(p,id,'20',pos = (100,240))
        self.slot.SetFont(font)
        self.labelslot = wx.StaticText(p, id,"湿度",pos = (100,215))
        self.labelslot.SetFont(font)
        self.text_entry = wx.TextCtrl(p, id,pos =(0,300),size = (500,20))
        
        self.men= wx.TextCtrl(p,id,pos = (100,80))
        self.labelmen = wx.StaticText(p, id,"↓↓測定データ(.xlsx)をどらっぐあんどどろっぷ↓↓",pos = (50,370))
        self.labelmen.SetFont(font2)

        #実行ボタン
        self.btn = wx.Button(p, id, 'レポート作成', pos=(300,220) ,size = (120,60))
        self.btn.Bind(wx.EVT_BUTTON, self.make_report)
        self.btn.SetFont(font)

        #ファイルドロップエリア
        self.p_drop=wx.Panel(self,id,pos = (0,400),size = (500,200))
        self.p_drop.SetDropTarget(FileDropTarget(self))
        self.p_drop.SetBackgroundColour("blue")



        self.Show()


  

#実行関係の関数
    def make_report(self,event):
        if self.text_entry.GetValue()=="":
            return wx.MessageBox("測定データ(.xlsx)をドラッグアンドドロップしてきてね。")
        else:
            self.btn.SetLabel("実行中なう")
            men = self.men.GetValue()#ここで変数menに入れてる
            #md = self.md.GetValue()
            mic = self.mic.GetValue()
            pl = self.pl.GetValue()
            slot = self.slot.GetValue()
            
            return self.Exceltemplate(men,mic,pl,slot)
        


    def Graph(self,path):
        df_sample = pd.read_excel(path, parse_dates=True)#inputファイルを開く
        # dfの準備
        df2 = df_sample.iloc[2:,1:3]#inputファイルから行3から最後まで 列Bから列Cを抜き出す
        column1 = 'load[N]'
        column2 = 'Moving distance[mm]'
        df2.columns = [column1, column2]#列の最初に挿入する
        df2=df2.astype(float)#小数点の数字として入れる
        l = df2[column1]#Nの列
        m = df2[column2]#距離の列

        sns.set()#グラフ作るときのおまじないだったか。。。
        sns.set_style("whitegrid", {'grid.linestyle': '--'})

        # 1.普通のプロットdf[0:5]は行
        df2.plot(x=column2, y=column1,title='measurement', grid=True, legend=True, alpha=0.5,c='r')#横軸縦軸タイトルを指定
        plt.xlim([0,7]) #ここでx軸の範囲を指定
        plt.ylim([-2,2]) #ここでy軸の範囲を指定lt.xlabel(column2,size=12)#x軸指定
        plt.ylabel(column1,size=12)#Y軸指定
        plt.grid(c='gainsboro', zorder=18)#グリッド線 zoder は優先順位
        plt.yticks( np.arange(-2.0, 2.5, 0.5) )#縦軸 -2.5 2.5 を0.5きざみで表示
        plt.xticks( np.arange(0, 7, 1) )#横軸 0 60 を10きざみで表示
        graph = path  +'.jpg'
        plt.savefig(graph)#グラフ出力 あとで張り付ける行を指定する
        plt.close('all')#閉じる

        return graph
       

    def Exceltemplate(self,men,mic,pl,slot):
        base = os.getcwd()
        now = datetime.datetime.now()
        output_file = os.path.join(base, "output "+ now.strftime('%Y%m%d_%H%M%S')+'.xlsx')#アウトプットファイルの名前つけとパス表示
        inputfile = self.text_entry.GetValue()
        

        # Excelを起動する
        pythoncom.CoInitialize()
        app = win32com.client.Dispatch("Excel.Application")
        app.Visible = False
        app.DisplayAlerts = False
        wb1 = xl.load_workbook(inputfile)#読み込んだインプットファイルを開く
        ws = wb1.worksheets[0]#wbからシートを読み込む
        wb2 = xl.Workbook()#wb2を作成?
        ws2 = wb2.worksheets[0]#ws2を作成?
        ws2.title ='measurement data' #ws2の名前を'measurement data'にする
            
        wb2.create_sheet(index=0,title='result')#wb2にシート追加一番最初に 名前を'result'にする
        ws2 = wb2['measurement data']#wsに'measurement data'を入れる
        ws1 = wb2['result']#wsに'result'を入れる

        
        #アウトプットのテンプレつくり入力とフォント指定
        ws1['A1'] = "Sliding measurement"
        ws1['A1'].font = Font(size=22, name="Meiryo UI")
        ws1['A3'] = "measuring equipment No."
        ws1['A3'].font = Font(size=11, name="Meiryo UI")
        ws1['A4'] = "measurement data"
        ws1['A4'].font = Font(size=11, name="Meiryo UI")
        ws1['A5'] = 'Person in charge'
        ws1['A5'].font = Font(size=11, name="Meiryo UI")
        ws1['A6'] = 'PRODUCT LOT:'
        ws1['A6'].font = Font(size=11, name="Meiryo UI")
        ws1['A7'] = 'Sheet LOT:'
        ws1['A7'].font = Font(size=11, name="Meiryo UI")
            
        for i in range(3,8):
            ws1['B{}'.format(i)].font = Font(size=11, name="Meiryo UI")
            
        
        ws1['A9'] = 'Number of slides'
        ws1['A9'].font = Font(size=11, name="Meiryo UI")
        ws1['B9'] = '6-10'
        ws1['B9'].font = Font(size=11, name="Meiryo UI")
        ws1['C9'] = '46-50'
        ws1['C9'].font = Font(size=11, name="Meiryo UI")



        #測定の計算範囲指定 エクセル関数になっていまった。
        b="'measurement data'!B20:B25,"  #6回目push
        c="'measurement data'!B40:B45,"  #7回目push
        d="'measurement data'!B60:B65,"  #8回目push
        e="'measurement data'!B80:B85,"  #9回目push
        f="'measurement data'!B100:B105"  #10回目push

        g="'measurement data'!B30:B35,"  #6回目pull
        h="'measurement data'!B50:B65,"  #7回目pull
        i="'measurement data'!B70:B85,"  #8回目pull
        j="'measurement data'!B90:B105,"  #9回目pull
        k="'measurement data'!B110:B125"  #10回目pull

        l="'measurement data'!B20:B25,"  #46回目push
        m="'measurement data'!B40:B45,"  #47回目push
        n="'measurement data'!B60:B65,"  #48回目push
        o="'measurement data'!B80:B85,"  #49回目push
        p="'measurement data'!B100:B105"  #50回目push

        q="'measurement data'!B30:B35,"  #46回目pull
        r="'measurement data'!B50:B65,"  #47回目pull
        s="'measurement data'!B70:B85,"  #48回目pull
        t="'measurement data'!B90:B105,"  #49回目pull
        u="'measurement data'!B110:B125"  #50回目pull

        #アウトプットのテンプレつくり入力とフォント指定
        ws1['A10'] = 'AVE[N]Push'
        ws1['A10'].font = Font(size=11, name="Meiryo UI")
        ws1['B10'] ="=ROUND(VALUE(AVERAGE(" + b + c + d + e + f + ')),2)'

        ws1['B10'].font = Font(size=11, name="Meiryo UI")
        ws1['C10'] ="=ROUND(VALUE(AVERAGE(" + l + m + n + o + p + ')),2)'
        ws1['C10'].font = Font(size=11, name="Meiryo UI")

        ws1['A11'] = 'AVE[N]Pull'
        ws1['A11'].font = Font(size=11, name="Meiryo UI")
        ws1['B11'] ="=ROUND(VALUE(AVERAGE(" + g + h + i + j + k + ')),2)'
        ws1['B11'].font = Font(size=11, name="Meiryo UI")
        ws1['C11'] ="=ROUND(VALUE(AVERAGE(" + q + r + s + t + u + ')),2)'
        ws1['C11'].font = Font(size=11, name="Meiryo UI")

        ws1['A12'] = 'AVE range'
        ws1['A12'].font = Font(size=11, name="Meiryo UI")
        ws1['B12'] = '=ROUND(VALUE((ABS(B10)+ABS(B11))),2)'
        ws1['B12'].font = Font(size=11, name="Meiryo UI")
        ws1['C12'] = '=ROUND(VALUE((ABS(C10)+ABS(C11))),2)'
        ws1['C12'].font = Font(size=11, name="Meiryo UI")

        ws1['A13'] = 'Judgement'
        ws1['A13'].font = Font(size=11, name="Meiryo UI")
        ws1['B13'] = '=IF(B12="","",IF(B12<$B$14,"Pass","Fail"))'
        ws1['B13'].font = Font(size=11, name="Meiryo UI")
        ws1['C13'] = '=IF(C12="","",IF(C12<$B$14,"Pass","Fail"))'
        ws1['C13'].font = Font(size=11, name="Meiryo UI")

        ws1['A14'] = 'Pass / Fail criteria'
        ws1['A14'].font = Font(size=11, name="Meiryo UI")
        ws1['B14'] = '=2'
        ws1['B14'].font = Font(size=11, name="Meiryo UI")
        ws1['C14'] = 'N'
        ws1['C14'].font = Font(size=11, name="Meiryo UI")


        ws1['K4'] = 'Approval'
        ws1['K4'].font = Font(size=6, name="Meiryo UI")
        ws1['L4'] = 'Confirmation'
        ws1['L4'].font = Font(size=6, name="Meiryo UI")
        ws1['M4'] = 'Responsible'
        ws1['M4'].font = Font(size=6, name="Meiryo UI")

        d_today = datetime.date.today()
        print(d_today)
        
        ws1['B3'] = men
        ws1['B4'] = d_today 
        ws1['B5'] = mic
        ws1['B6'] = pl
        ws1['B7'] = slot

        #列幅指定
        ws1.column_dimensions['A'].width = 27
        ws1.column_dimensions['B'].width = 11.38
        ws1.column_dimensions['C'].width = 11.38
        ws1.column_dimensions['D'].width = 2
        
        #セルの結合承認欄
        ws1.merge_cells('M1:M3')
        ws1.merge_cells('K1:K3')
        ws1.merge_cells('L1:L3')
        ws1.merge_cells('B3:C3')
        ws1.merge_cells('B4:C4')
        ws1.merge_cells('B5:C5')
        ws1.merge_cells('B6:C6')
        ws1.merge_cells('B7:C7')
        #オーバーリザルト結合
        ws1['A20'] = 'Overall result'
        ws1['A20'].font = Font(size=20, name="Meiryo UI")
        ws1['B20'] = '=IF(AND(B13="Pass",C13="Pass"),"Pass","Fail")'
        ws1['B20'].font = Font(size=20, name="Meiryo UI")
        ws1.merge_cells('A20:A23')
        ws1.merge_cells('B20:C23')


        # 罫線の指定
        side = Side(style='thin')
        # 罫線の箇所を指定
        border = Border(bottom=side, right=side, left=side, top=side)
        # 罫線を引く

        num2 = 1
        while num2 < 4:
            num = 3
            while num < 8:
                ws1.cell(num, num2).border = border
            
                num += 1
            num2 += 1

        num2 = 1
        while num2 < 4:
            num = 9
            while num < 15:
                ws1.cell(num, num2).border = border
            
                num += 1
            num2 += 1

        num2 = 11
        while num2 < 14:
            num = 1
            while num < 5:
                ws1.cell(num, num2).border = border
            
                num += 1
            num2 += 1


        num2 = 1
        while num2 < 4:
            num = 20
            while num < 24:
                ws1.cell(num, num2).border = border
           
                num += 1
            num2 += 1


        # 中央揃え
        ws1["A3"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A4"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A5"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A6"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A7"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A9"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A10"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A11"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A12"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B3"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B4"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B5"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B6"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B7"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B9"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B10"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B11"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B12"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["C9"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["C10"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["C11"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["C12"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["K4"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["L4"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["M4"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A13"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A14"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B13"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B14"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["C13"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["C14"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["A20"].alignment = Alignment(horizontal="center", vertical="center")
        ws1["B20"].alignment = Alignment(horizontal="center", vertical="center")


        
        #ws1生データを別のwb wsにコピー
        for row in ws:
            for cell in row:
                ws2[cell.coordinate].value = cell.value

        ws2.protection.enable()#measurement data'の保護設定
        # 図の貼り付け
        img = Image(self.Graph(inputfile))
        ws1.add_image(img, 'E6')

        # エクセル保存
        wb2.save(output_file)
        wb2.close()
        app.Quit()
        pythoncom.CoUninitialize()

        pythoncom.CoInitialize()
        app.Visible = False
        app.DisplayAlerts = False
        
        outputpath =  os.path.abspath(output_file)#アウトプットファイルの絶対パスを作成

        book = app.Workbooks.Open(outputpath)
        sheet = book.Worksheets('result')
        sheet.ResetAllPageBreaks()#印刷設定破棄
        sheet.PageSetup.Orientation = 2#横向き設定
        sheet.PageSetup.PrintArea = "$A$1:$M$33"# 印刷範囲指定
        xlTypePDF = 0
        sheet.ExportAsFixedFormat(xlTypePDF, outputpath ,IgnorePrintAreas=True)



        App.DisplayAlerts = False
        book.Save
        book.Close()
        App.DisplayAlerts = False


        app.Quit()
        pythoncom.CoUninitialize()
        
        
        self.btn.SetLabel("レポート作成")
        wx.MessageBox('FINISH\n終わったよ', u'お疲れ様です',wx.STAY_ON_TOP)
            # Excelを終了

        return 0


app = wx.App()#プログラム実行

App(None, -1, 'measurement analysis program')




app.MainLoop()

def Graph(self,path):
    df_sample = pd.read_excel(path, parse_dates=True)#inputファイルを開く
    # dfの準備
    df2 = df_sample.iloc[2:,1:3]#inputファイルから行3から最後まで 列Bから列Cを抜き出す
    column1 = 'load[N]'
    column2 = 'Moving distance[mm]'
    df2.columns = [column1, column2]#列の最初に挿入する
    df2=df2.astype(float)#小数点の数字として入れる
    l = df2[column1]#Nの列
    m = df2[column2]#距離の列

    sns.set()#グラフ作るときのおまじないだったか。。。
    sns.set_style("whitegrid", {'grid.linestyle': '--'})

    # 1.普通のプロットdf[0:5]は行
    df2.plot(x=column2, y=column1,title='measurement', grid=True, legend=True, alpha=0.5,c='r')#横軸縦軸タイトルを指定
    plt.xlim([0,7]) #ここでx軸の範囲を指定
    plt.ylim([-2,2]) #ここでy軸の範囲を指定lt.xlabel(column2,size=12)#x軸指定
    plt.ylabel(column1,size=12)#Y軸指定
    plt.grid(c='gainsboro', zorder=18)#グリッド線 zoder は優先順位
    plt.yticks( np.arange(-2.0, 2.5, 0.5) )#縦軸 -2.5 2.5 を0.5きざみで表示
    plt.xticks( np.arange(0, 7, 1) )#横軸 0 60 を10きざみで表示
    graph = path  +'.jpg'
    plt.savefig(graph)#グラフ出力 あとで張り付ける行を指定する
    plt.close('all')#閉じる

    return graph


def Exceltemplate(self,men,mic,pl,slot):
    base = os.getcwd()
    now = datetime.datetime.now()
    output_file = os.path.join(base, "output "+ now.strftime('%Y%m%d_%H%M%S')+'.xlsx')#アウトプットファイルの名前つけとパス表示
    inputfile = self.text_entry.GetValue()


    # Excelを起動する
    pythoncom.CoInitialize()
    app = win32com.client.Dispatch("Excel.Application")
    app.Visible = False
    app.DisplayAlerts = False
    wb1 = xl.load_workbook(inputfile)#読み込んだインプットファイルを開く
    ws = wb1.worksheets[0]#wbからシートを読み込む
    wb2 = xl.Workbook()#wb2を作成?
    ws2 = wb2.worksheets[0]#ws2を作成?
    ws2.title ='measurement data' #ws2の名前を'measurement data'にする

    wb2.create_sheet(index=0,title='result')#wb2にシート追加一番最初に 名前を'result'にする
    ws2 = wb2['measurement data']#wsに'measurement data'を入れる
    ws1 = wb2['result']#wsに'result'を入れる


    #アウトプットのテンプレつくり入力とフォント指定
    ws1['A1'] = "Sliding measurement"
    ws1['A1'].font = Font(size=22, name="Meiryo UI")
    ws1['A3'] = "measuring equipment No."
    ws1['A3'].font = Font(size=11, name="Meiryo UI")
    ws1['A4'] = "measurement data"
    ws1['A4'].font = Font(size=11, name="Meiryo UI")
    ws1['A5'] = 'Person in charge'
    ws1['A5'].font = Font(size=11, name="Meiryo UI")
    ws1['A6'] = 'PRODUCT LOT:'
    ws1['A6'].font = Font(size=11, name="Meiryo UI")
    ws1['A7'] = 'Sheet LOT:'
    ws1['A7'].font = Font(size=11, name="Meiryo UI")

    for i in range(3,8):
        ws1['B{}'.format(i)].font = Font(size=11, name="Meiryo UI")


    ws1['A9'] = 'Number of slides'
    ws1['A9'].font = Font(size=11, name="Meiryo UI")
    ws1['B9'] = '6-10'
    ws1['B9'].font = Font(size=11, name="Meiryo UI")
    ws1['C9'] = '46-50'
    ws1['C9'].font = Font(size=11, name="Meiryo UI")



    #測定の計算範囲指定 エクセル関数になっていまった。
    b="'measurement data'!B20:B25,"  #6回目push
    c="'measurement data'!B40:B45,"  #7回目push
    d="'measurement data'!B60:B65,"  #8回目push
    e="'measurement data'!B80:B85,"  #9回目push
    f="'measurement data'!B100:B105"  #10回目push

    g="'measurement data'!B30:B35,"  #6回目pull
    h="'measurement data'!B50:B65,"  #7回目pull
    i="'measurement data'!B70:B85,"  #8回目pull
    j="'measurement data'!B90:B105,"  #9回目pull
    k="'measurement data'!B110:B125"  #10回目pull

    l="'measurement data'!B20:B25,"  #46回目push
    m="'measurement data'!B40:B45,"  #47回目push
    n="'measurement data'!B60:B65,"  #48回目push
    o="'measurement data'!B80:B85,"  #49回目push
    p="'measurement data'!B100:B105"  #50回目push

    q="'measurement data'!B30:B35,"  #46回目pull
    r="'measurement data'!B50:B65,"  #47回目pull
    s="'measurement data'!B70:B85,"  #48回目pull
    t="'measurement data'!B90:B105,"  #49回目pull
    u="'measurement data'!B110:B125"  #50回目pull

    #アウトプットのテンプレつくり入力とフォント指定
    ws1['A10'] = 'AVE[N]Push'
    ws1['A10'].font = Font(size=11, name="Meiryo UI")
    ws1['B10'] ="=ROUND(VALUE(AVERAGE(" + b + c + d + e + f + ')),2)'

    ws1['B10'].font = Font(size=11, name="Meiryo UI")
    ws1['C10'] ="=ROUND(VALUE(AVERAGE(" + l + m + n + o + p + ')),2)'
    ws1['C10'].font = Font(size=11, name="Meiryo UI")

    ws1['A11'] = 'AVE[N]Pull'
    ws1['A11'].font = Font(size=11, name="Meiryo UI")
    ws1['B11'] ="=ROUND(VALUE(AVERAGE(" + g + h + i + j + k + ')),2)'
    ws1['B11'].font = Font(size=11, name="Meiryo UI")
    ws1['C11'] ="=ROUND(VALUE(AVERAGE(" + q + r + s + t + u + ')),2)'
    ws1['C11'].font = Font(size=11, name="Meiryo UI")

    ws1['A12'] = 'AVE range'
    ws1['A12'].font = Font(size=11, name="Meiryo UI")
    ws1['B12'] = '=ROUND(VALUE((ABS(B10)+ABS(B11))),2)'
    ws1['B12'].font = Font(size=11, name="Meiryo UI")
    ws1['C12'] = '=ROUND(VALUE((ABS(C10)+ABS(C11))),2)'
    ws1['C12'].font = Font(size=11, name="Meiryo UI")

    ws1['A13'] = 'Judgement'
    ws1['A13'].font = Font(size=11, name="Meiryo UI")
    ws1['B13'] = '=IF(B12="","",IF(B12<$B$14,"Pass","Fail"))'
    ws1['B13'].font = Font(size=11, name="Meiryo UI")
    ws1['C13'] = '=IF(C12="","",IF(C12<$B$14,"Pass","Fail"))'
    ws1['C13'].font = Font(size=11, name="Meiryo UI")

    ws1['A14'] = 'Pass / Fail criteria'
    ws1['A14'].font = Font(size=11, name="Meiryo UI")
    ws1['B14'] = '=2'
    ws1['B14'].font = Font(size=11, name="Meiryo UI")
    ws1['C14'] = 'N'
    ws1['C14'].font = Font(size=11, name="Meiryo UI")


    ws1['K4'] = 'Approval'
    ws1['K4'].font = Font(size=6, name="Meiryo UI")
    ws1['L4'] = 'Confirmation'
    ws1['L4'].font = Font(size=6, name="Meiryo UI")
    ws1['M4'] = 'Responsible'
    ws1['M4'].font = Font(size=6, name="Meiryo UI")

    d_today = datetime.date.today()
    print(d_today)

    ws1['B3'] = men
    ws1['B4'] = d_today 
    ws1['B5'] = mic
    ws1['B6'] = pl
    ws1['B7'] = slot

    #列幅指定
    ws1.column_dimensions['A'].width = 27
    ws1.column_dimensions['B'].width = 11.38
    ws1.column_dimensions['C'].width = 11.38
    ws1.column_dimensions['D'].width = 2

    #セルの結合承認欄
    ws1.merge_cells('M1:M3')
    ws1.merge_cells('K1:K3')
    ws1.merge_cells('L1:L3')
    ws1.merge_cells('B3:C3')
    ws1.merge_cells('B4:C4')
    ws1.merge_cells('B5:C5')
    ws1.merge_cells('B6:C6')
    ws1.merge_cells('B7:C7')
    #オーバーリザルト結合
    ws1['A20'] = 'Overall result'
    ws1['A20'].font = Font(size=20, name="Meiryo UI")
    ws1['B20'] = '=IF(AND(B13="Pass",C13="Pass"),"Pass","Fail")'
    ws1['B20'].font = Font(size=20, name="Meiryo UI")
    ws1.merge_cells('A20:A23')
    ws1.merge_cells('B20:C23')


    # 罫線の指定
    side = Side(style='thin')
    # 罫線の箇所を指定
    border = Border(bottom=side, right=side, left=side, top=side)
    # 罫線を引く

    num2 = 1
    while num2 < 4:
        num = 3
        while num < 8:
            ws1.cell(num, num2).border = border

            num += 1
        num2 += 1

    num2 = 1
    while num2 < 4:
        num = 9
        while num < 15:
            ws1.cell(num, num2).border = border

            num += 1
        num2 += 1

    num2 = 11
    while num2 < 14:
        num = 1
        while num < 5:
            ws1.cell(num, num2).border = border

            num += 1
        num2 += 1


    num2 = 1
    while num2 < 4:
        num = 20
        while num < 24:
            ws1.cell(num, num2).border = border

            num += 1
        num2 += 1


    # 中央揃え
    ws1["A3"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A4"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A5"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A6"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A7"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A9"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A10"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A11"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A12"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B3"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B4"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B5"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B6"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B7"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B9"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B10"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B11"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B12"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["C9"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["C10"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["C11"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["C12"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["K4"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["L4"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["M4"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A13"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A14"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B13"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B14"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["C13"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["C14"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["A20"].alignment = Alignment(horizontal="center", vertical="center")
    ws1["B20"].alignment = Alignment(horizontal="center", vertical="center")



    #ws1生データを別のwb wsにコピー
    for row in ws:
        for cell in row:
            ws2[cell.coordinate].value = cell.value

    ws2.protection.enable()#measurement data'の保護設定
    # 図の貼り付け
    img = Image(self.Graph(inputfile))
    ws1.add_image(img, 'E6')

    # エクセル保存
    wb2.save(output_file)
    wb2.close()
    app.Quit()
    pythoncom.CoUninitialize()

    pythoncom.CoInitialize()
    app.Visible = False
    app.DisplayAlerts = False

    outputpath =  os.path.abspath(output_file)#アウトプットファイルの絶対パスを作成

    book = app.Workbooks.Open(outputpath)
    sheet = book.Worksheets('result')
    sheet.ResetAllPageBreaks()#印刷設定破棄
    sheet.PageSetup.Orientation = 2#横向き設定
    sheet.PageSetup.PrintArea = "$A$1:$M$33"# 印刷範囲指定
    xlTypePDF = 0
    sheet.ExportAsFixedFormat(xlTypePDF, outputpath ,IgnorePrintAreas=True)



    App.DisplayAlerts = False
    book.Save
    book.Close()
    App.DisplayAlerts = False


    app.Quit()
    pythoncom.CoUninitialize()


    self.btn.SetLabel("レポート作成")
    wx.MessageBox('FINISH\n終わったよ', u'お疲れ様です',wx.STAY_ON_TOP)
        # Excelを終了

    return 0
app = wx.App()#プログラム実行
App(None, -1, 'measurement analysis program')
app.MainLoop()

まとめ

素人でも頑張ればそれっぽいものができる!!

3か月くらいかかったけど。

参考になれば幸いです。


プログラムを駆使して仕事楽したい

プログラム張り付けて動作確認が面倒くさかった
いい方法ないんかなー

コメント

タイトルとURLをコピーしました