我想打开一个 Excel 文件作为模板,然后创建该模板的两个副本,然后使用相关计算编辑每本书,然后另存为两个单独且不相关的输出。
打开模板文件后,似乎无法使用 xlwings 同时处理两个工作簿。虽然该文件似乎有两个实例,但对一个文件的更改会覆盖另一个文件中的值。
这里有一些虚拟代码来展示我正在尝试做的事情:
import xlwings as xw
import random
oneBook = xw.Book(r'TemplateExcelFile.xlsx')
# oneBook.save(r'TemplateExcelFile_temp') # first step in work around
twoBook = xw.Book(r'TemplateExcelFile.xlsx') # this creates two instances/links to the same open file (not wanted)
# twoBook = xw.books.add(r'TemplateExcelFile_temp.xlsx') # this approach does not open two separate workbooks
# twoBook = xw.Book(r'TemplateExcelFile_temp.xlsx') # this approach (with step 1) opens the same workbook twice, but feels like a workaround
result1a = random.randint(1,10)
oneBookSheet = oneBook.sheets["Sheet 1"]
oneBookSheet.range('a1').value = result1a
result2a = result1a * random.randint(1,10)
twoBookSheet = twoBook.sheets["Sheet 2"]
twoBookSheet.range('a1').value = result2a
result1b = result2a * random.randint(1,2)
oneBookSheet = oneBook.sheets["Sheet 1"]
oneBookSheet.range('a2').value = result1b
oneBook.save()
twoBook.save()
是否有(更好)的方法来打开同一个工作簿作为使用 xlwings 的两个输出的模板?
您还可以利用 Excel 的使用和移动/复制工作表的便利性,只需创建模板的副本、修改并移动到新工作簿;
这会导致您的两个新工作簿中的工作表基于模板工作表,并且原始模板工作簿不会更改。
您可以更改更新工作表、创建工作簿和保存的顺序,并且可以在原始工作簿中或迁移到新工作簿后更新工作表,但请记住,创建新工作簿后可能会运行 4 个 Excel 实例。
import xlwings as xw
excel_template = 'template_file.xlsx'
with xw.App(visible=True) as app:
wb = xw.Book(excel_template)
ws = wb.sheets['Template']
### Create template 2 Sheet
ws.copy(after=ws, name="Template_New2")
ws2 = wb.sheets['Template_New2']
### Create template 1 Sheet
ws.copy(after=ws, name="Template_new1")
ws1 = wb.sheets['Template_New1']
### Add data to Sheets 1 and 2 as needed
ws1["A2"].value = "Hello"
ws1["B2"].value = "Workbook1"
ws2["A10"].value = "Hello"
ws2["B10"].value = "WorkBook2"
### Create new workbooks
wb1 = xw.Book()
wb_sheet1 = wb1.sheets.active
wb2 = xw.Book()
wb_sheet2 = wb2.sheets.active
### Move Sheets to new work book and Delete the unwanted Sheets
ws1.copy(before=wb_sheet1)
wb_sheet1.delete()
ws2.copy(before=wb_sheet2)
wb_sheet2.delete()
### Save the new workbooks
wb1.save('Template_new1.xlsx')
wb2.save('Template_new2.xlsx')