我有以下代码:
def openFile():
filepath = filedialog.askopenfilename(
title="Please select a file",
filetypes = (('Excel files', '*.xlsx'),
('Excel macro files', '*.xlsm'))
)
file = open(filepath, 'r')
wb = load_workbook(filepath, read_only=False, keep_vba=True)
ws=wb.active
fileonly = filepath.split('/')[-1]
filewithoutextension = fileonly.split('-')[0]
fileextension = fileonly.split('.')[-1]
y = pyautogui.prompt(text='Please specify the number of file duplicates', title='Number of files', default='2')
file_path = filedialog.askdirectory()
print(y)
for x in range(2, (int(y))+1):
newname = "%03d" % x
dv = DataValidation(type="list", formula1='"COLLECTION,INTER PROJECT COLLECTION,INTER PROJECT TRANSFER,TRANSFER"', allow_blank=False)
dv.error = 'Please select entry from the list!'
c1 = ws["D4"]
c1.value = "COLLECTION"
dv.add(c1)
ws.add_data_validation(dv)
save_path = Path(file_path) / f"{filewithoutextension}- {newname}.{fileextension}"
wb.save(save_path)
print (filewithoutextension+'- '+newname+'.'+fileextension)
wb.close()
rootwindow = tk.Tk()
rootwindow.geometry("500x100")
rootwindow.title("Excel file duplicator")
font.families()
windowfont=tk.font.nametofont("TkDefaultFont")
windowfont.config(
family="Segoe Script",
size=24,
weight=font.BOLD)
button = tk.Button(rootwindow, text='Open Excel
document',command=openFile, fg='black', bg='yellow')
button.pack()
rootwindow.mainloop()
这会引发以下错误:
ValueError:对已关闭文件进行 I/O 操作。
尝试使用代码中包含的 file.close() 和其他解决方案(此处列出),但它们不起作用。
Python 错误:Python ValueError:对已关闭文件进行 I/O 操作
我如何将它们应用到这样的情况,即在多个文件之间有一个循环而不是文件?
更新:
以前,我在使用 openpyxl 复制的文件保存图像时遇到了问题。 通过使用以下解决方案: 使用 python 复制 Excel 文档时图像消失 我已经安装了 Pillow 库。安装后就出现这个错误。
您的代码为我运行,并且基本上实现了您可能试图通过几个小问题实现的目标。
我没有有任何“ValueError:已关闭文件上的 I/O 操作”错误,并且没有看到引发此错误的任何特定原因。
我已经浏览了代码以突出显示我看到的问题。
下面列出了这些,它们都不是主要的或会导致运行时错误。
file = open(filepath, 'r')
是无关的,包含它是没有意义的。不需要在 Excel 文件上打开句柄,Openpyxl 不需要它,而且您也不会在代码中的任何地方使用它。keep_vba=True
加载,然后使用原始扩展名保存。keep_vba=True
打开并以“.xlsx”扩展名保存。这将导致 Excel 无法打开不匹配的文件。使用 keep_vba=True
时,工作簿现在是 Excel 宏工作簿,并且必须使用扩展名“.xlsm”。filewithoutextension = fileonly.split('-')[0]
应该是filewithoutextension = fileonly.split('.')[0]
。分隔符位于下一行,用于获取 Excel 文件扩展名。range(2, 3)
,因此循环将仅在“x”等于 2 时迭代一次。range(2, (int(y)) + 2)
,因此对于我们的示例,它是 range(2, 4)
,并且 x 的值为 2 和 3。wb.close()
对于工作簿的打开方式没有影响。我不知道为什么你想在此时关闭它,但是 wb.close()
只影响以读或写方式打开的工作簿,而你还没有这样做。