跨工作表复制粘贴范围时出错 xlwings

Error while copy pasting ranges across sheets xlwings

我想在我的 .xlsm 工作簿中复制 sheet 的粘贴范围 xlwings.I 想保持源格式和前导单引号,因为我已经使用了.copy , .paste 方法。 我在成功复制 sheet 1 之后尝试 运行 代码 (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', 'Select method of Range class failed', 'xlmain11.chm', 0, -2146827284), None) 时遇到此错误。循环中的第一个 sheet 被正确复制,但在 sheet 1 完成后显示上述错误。 这是我用来复制粘贴 sheets 范围的代码:


wb = xw.Book('standalone.xlsm')
sheet_names = ['Sheet1','Sheet2']
for sheet_name in sheet_names:
    sht=wb.sheets(sheet_name)
    sht.range('A1:A6').api.SpecialCells(12).copy
    sht.range('B1').select()
    sht.api.paste
    sht.api.Application.CutCopyMode=0
wb.save('standalone.xlsm')
wb.close()


PS :- I don't want to use `.value` method of copying ranges as it doesn't preserve source formatting and cells which start with single quote 

sheet 必须处于活动状态才能 select 在其上设置范围。使用 sht.select():

import xlwings as xw

wb = xw.Book('test.xlsx')
sheet_names = ['Sheet1', 'Sheet2']
for sheet_name in sheet_names:
    sht = wb.sheets[sheet_name]
    sht.range('A1:A6').api.copy
    sht.select()
    sht['B1'].select()
    sht.api.paste
    wb.app.api.CutCopyMode = False
wb.save('test.xlsx')
wb.close()

Mouwsy 的回答很好。或者,您可以使用 pastespecial,有了它,您就不必 select sheet

import xlwings as xw

wb = xw.Book('test.xlsx')
sheet_names = ['Sheet1', 'Sheet2']
for sheet_name in sheet_names:
    sht=wb.sheets(sheet_name)
    sht.range('A1:A6').api.SpecialCells(12).copy
    sht.range("R1").api.PasteSpecial("-4104")
    sht.api.Application.CutCopyMode=0
wb.save('standalone.xlsm')
wb.close()

更新: 刚刚发现 xlwings 已经有一个复制和粘贴方法,所以一个简单的复制粘贴将是:

for sheet_name in sheet_names:
    sht=wb.sheets(sheet_name)
    sht.range('A1:A6').copy()
    sht.range("R1").paste()
    sht.api.Application.CutCopyMode=0

这会保留源格式。我无法从文档中找到用于自定义复制和粘贴操作的任何其他选项,所以我想您仍然需要 api 才能完全控制。