#python #excel #winapi #com
#python #excel #winapi #com
Вопрос:
Как я могу получить все определенные имена из листа Excel, используя COM-интерфейс, т.Е. Win32 API на Python?
Я хочу получить какой-то диктант, например. в приведенном ниже примере это будет:
cols['Stamm_ISIN'] = 2
чтобы я мог получить доступ к столбцу позже, используя его идентификатор 2, чтобы установить некоторые значения: excel.Cells(row, cols['Stamm_ISIN']).Value = 'x'
Я несколько застрял в документации API https://msdn.microsoft.com/en-us/library/office/ff841280.aspx так что, кажется, это каким-то образом возможно… Более того, я не смог найти никакого результата при поиске в Google: (
Комментарии:
1. Разве вы не можете использовать openpyxl? Проверьте это: openpyxl.readthedocs.io/en/default
2. Только для этой задачи? Да, это было бы возможно. Кроме того, я использую COM Api, потому что мне легко изменять существующие ячейки в книге, которая уже открыта в Excel. Я не хочу открывать и повторно сохранять книгу с нуля, поскольку OpenPyxl не поддерживает VBA и форматирование. Следовательно, я использую COM Api для изменения некоторых ячеек
Ответ №1:
Следующий скрипт показывает, как отобразить все заголовки столбцов для данного рабочего листа. Сначала он вычисляет количество используемых столбцов, а затем перечисляет каждый столбец. Затем он отображает все именованные диапазоны для данной книги, для каждого из которых он сохраняет экземпляр в cols
словаре. Затем это можно использовать в сочетании с Range()
, чтобы присвоить всем ячейкам в заданном именованном диапазоне заданное значение:
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(r"test file.xlsx")
ws = wb.Worksheets("Sheet1")
cols = {} # Dictionary holding named range objects
# Determine the number of columns used in the top row
xlToLeft = -4159
col_count = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
# Print each column heading
for col in range(1, col_count 1):
print "Col {}, {}".format(col, ws.Cells(1, col).Value)
# Enumerate all named ranges in the Workbook
for index in range(1, wb.Names.Count 1):
print "Workbook: ", wb.Names(index).Name, wb.Names(index).Value
cols[wb.Names(index).Name] = wb.Names(index)
# Enumerate any named ranges in the current Worksheet
for index in range(1, ws.Names.Count 1):
print "Sheet: ", ws.Names(index).Name, ws.Names(index).Value
# Change all cells for a named range called "TestRange" to "TEST"
ws.Range(cols["TestRange"]).Value = "TEST"
# Save the changes
wb.Save()
excel.Application.Quit()
В этом примере вашему файлу Excel потребуется вызвать именованный диапазон TestRange
.