python エクセルファイルを①ダイアログで選択後②読み込んで③inputで入力したファイル名で書き出す

 

from openpyxl import Workbook,load_workbook
from pprint import pprint

import os, tkinter, tkinter.filedialog, tkinter.messagebox
from os import path



def getfile():
# ファイル選択ダイアログ
    root = tkinter.Tk()
    root.withdraw()
    fTyp = [("","*")]
    iDir = os.path.abspath(os.path.dirname(__file__))
    file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
    return file

#open&read
#ファイルオープンからセルデータの読み込み
a = getfile()#ファイル選択

wb=load_workbook(a) #ワークブック(複数シート前提)開く
print(len(wb.sheetnames)) #ワークシートの枚数を数える
for name in wb.get_sheet_names():
    print(name)#シート名を書き出す
print('-'*32  )

#データの読み込み---------------------------------------
ws=wb.active
x_max=ws.max_column#最大列数
y_max=ws.max_row#最大行数
print('  列数は{}、行数は{}'.format(x_max,y_max))

list = [[0 for i in range(ws.max_column)]for j in range(ws.max_row)]
for x in range(0, ws.max_row):
    for y in range(0, ws.max_column):
        list[x][y] = ws.cell(row=x+1, column=y+1).value
pprint (list)

'''
#データに何が入っているかわからないのでcell 1個ずつ読み込む
for row in ws:
    for cell in row:
        print(cell.value,end=",")
    print('\n')
'''

#writeファイル新規書き込み
book = Workbook()
sheet = book.active
'''
データ投入例
#エクセルレンジ指定の書き込み
#.valueを指定
sheet['A1'].value='test'
sheet['A2']=12
sheet['A3']=13
sheet['B2']='B2'
sheet['C3']='tensuketen'
sheet['D4']=11
#cells行列形式のセル指定の書き込み
sheet.cell(row=4,column=5,value=10)
'''
#読み込んだデータをファイル名を付けてエクセルで書き込み
#行列に連続して書き込み
for i in range(1,y_max+1):#エクセルは1から始まるので(1to max+1)が範囲になる
    for n in range(1,x_max+1):
        sheet.cell(row=i, column=n, value=list[i-1][n-1])#データは0からなので-1
        とする
#book保存
#book.save(" sample. xlsx")
filename=input('output filename?(.xslx)')
b = path.join(path.dirname(__file__), filename+'.xlsx')
book.save(b)