2017-06-04 756 views
0

我知道你可能看过这个标题,但请不要标记为重复的,因为我的错误是不同的。我正在比较使用openpyxl的excel程序,并使用tkinter使UI更友好。这里是我的代码:openpyxl KeyError工作表{0}不存在

import openpyxl 
from tkinter import * 
from tkinter.filedialog import askopenfilename 
from openpyxl.utils import get_column_letter, column_index_from_string 

f1 = '' 
f2 = '' 
sheet1 = '' 
sheet2 = '' 

root = Tk() 
root.configure(background='light green') 
root.geometry("500x500") 
root.wm_title("BananaCell") 

e1 = Text(root, width=15, height=1) 
e1.pack() 
e1.place(x=70, y=150) 


e2 = Text(root, width=15, height=1) 
e2.pack() 
e2.place(x=300, y=150) 

def destroy(): 
    root.destroy() 

def get_1(): 
    inputValue = e1.get("1.0", "end-1c") 
    print(inputValue) 

def get_2(): 
    inputValue2 = e2.get("1.0", "end-1c") 
    print(inputValue2) 

bf = Button(root, text="Enter", width=6, height=0, command=get_1) 
bf.pack() 
bf.place(x=15, y=147) 

bf = Button(root, text="Enter", width=6, height=0, command=get_2) 
bf.pack() 
bf.place(x=430, y=147) 

def askForFileName1(): 
    global f1 
    f1 = askopenfilename(title="Select Workbook 1") 
    print(str(f1)) 


def askForFileName2(): 
    global f2 
    f2 = askopenfilename(title="Select Workbook 2") 
    print(str(f2)) 

sheet1 = e1.get("1.0", "end-1c") 
sheet2 = e2.get("1.0", "end-1c") 

b = Button(root, text="Workbook 1", width=12, height=2, command=askForFileName1) 
b.pack() 
b.place(x=100, y=100) 

b2 = Button(root, text="Workbook 2", width=12, height=2, command=askForFileName2) 
b2.pack() 
b2.place(x=300, y=100) 

mainloop() 

wb = openpyxl.load_workbook(str(f1)) 
wb1 = openpyxl.load_workbook(str(f2)) 

ws = wb.get_sheet_by_name(str(sheet1)) 
ws1 = wb1.get_sheet_by_name(str(sheet2)) 

col1 = input('Column letter from Sheet 1 to compare from: ') 
col2 = input('Column letter from Sheet 2 to compare from: ') 

for (col, col_1) in zip(ws.iter_cols(min_col = column_index_from_string(col1), max_col=column_index_from_string(col1)), ws1.iter_cols(min_col = column_index_from_string(col2), max_col=column_index_from_string(col2))): 
    for (cell, cell_1) in zip(col, col_1): 
     if cell.value != cell_1.value and cell.row == cell_1.row: 
      print('Row ' + str(cell.row) + ' ' + str(cell.value) + ' is not 
equal to ' + str(cell_1.value) + ' ' + 'Row ' + str(cell_1.row)) 

exit_if = input('Press x to exit when you\'re ready: ') 

一切运行正常,直到我与行:ws = wb.get_sheet_by_name(str(sheet1))。之后,它给了我错误:

raise KeyError("Worksheet {0} does not exist.".format(key)) 
KeyError: 'Worksheet does not exist.' 

任何人都可以解决这个问题吗?任何帮助将非常感激。

+0

看来,E1文本为空。什么get_1()显示? – valignatev

+0

@valentjedi e1打印我输入的任何东西 – Bill

+0

显然,当您将它传递给'get_sheet_by_name'时,sheet1是空的。你有没有尝试硬编码表名并检查它是否有效? – valignatev

回答

2
def get_1(): 
    global sheet1 
    sheet1 = e1.get("1.0", "end-1c") 
    print(sheet1) 

def get_2(): 
    global sheet2 
    sheet2 = e2.get("1.0", "end-1c") 
    print(sheet2) 

当你调用当时以下行

sheet1 = e1.get("1.0", "end-1c") 
sheet2 = e2.get("1.0", "end-1c") 

,有没有在E1和E2。 所以你必须在像文件名一样的函数中调用它。

此外,你应该使用Entry部件用于获取输入

+0

谢谢你解释了很多 – Bill