Xlwings,如何打开单个模板工作簿,创建 2 个副本,编辑每个副本,并保存 2 个单独的工作簿

问题描述 投票:0回答:1

我想打开一个 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 xlwings
1个回答
0
投票

您还可以利用 Excel 的使用和移动/复制工作表的便利性,只需创建模板的副本、修改并移动到新工作簿;

  1. 打开模板xlsx文件
  2. 在同一工作簿中创建 2 个(或您需要的任意数量的新工作表)模板工作表副本
  3. 根据需要编辑这些工作表,作为同一工作簿中的工作表(“ws1”和“ws2”)。
  4. 编辑完成后,创建 2 个新工作簿(“wb1”和“wb2”)
  5. 将新修改的工作表移动到每个新工作簿中(并删除创建工作簿时创建的默认“Sheet1”)
  6. 保存新工作簿并退出

这会导致您的两个新工作簿中的工作表基于模板工作表,并且原始模板工作簿不会更改。
您可以更改更新工作表、创建工作簿和保存的顺序,并且可以在原始工作簿中或迁移到新工作簿后更新工作表,但请记住,创建新工作簿后可能会运行 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')
© www.soinside.com 2019 - 2024. All rights reserved.