Ошибка при копировании диапазонов вставки на листах xlwings

#python-3.x #excel #xlwings #xlsm

#python-3.x #excel #xlwings #xlsm

Вопрос:

Я хочу скопировать диапазоны вставки для листов в моей .xlsm книге, используя xlwings.Я хочу сохранить исходное форматирование и начальную одинарную кавычку, из-за которой я использовал .copy .paste метод , . Я получаю эту ошибку при попытке запустить код (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', 'Select method of Range class failed', 'xlmain11.chm', 0, -2146827284), None) после успешного копирования листа 1. Первый лист в цикле копируется правильно, но вышеупомянутая ошибка отображается после завершения листа 1. Это код, который я использовал для копирования и вставки диапазонов между листами :

 
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 
  

Ответ №1:

Ответ Мауси работает нормально. В качестве альтернативы вы можете использовать pastespecial, и с его помощью вам не придется выбирать лист

 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 для полного контроля.

Комментарии:

1. Я предполагаю, что вы используете специальные ячейки для получения видимых ячеек только в случае фильтров или скрытых ячеек, в противном случае это не требуется для простой вставки копирования

2.Спасибо за ответ. Таким образом, без вставки будет сохранено исходное форматирование, как есть, просто с помощью copy paste

3. Еще раз спасибо, если вы считаете, что это поможет другим, сталкивающимся с той же проблемой, вы можете поддержать этот вопрос. Лично, когда я столкнулся с проблемой, я искал много ответов SO, и ни один из ответов не сработал (возможно, из-за другой версии или может быть по любой другой причине)

Ответ №2:

Лист должен быть активным, прежде чем вы сможете выбрать на нем диапазон. Использовать 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()