#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()