将公式写入 Excel 并出现 Python 错误
Write formula to Excel with Python error
我尝试按照这个 使用 python 和 openpyxl 包在我的 excel 中添加一些公式。
link 是我完成任务所需要的。
但在这段代码中:
for i, cellObj in enumerate(Sheet.columns[2], 1):
cellObj.value = '=IF($A[=12=]=$B[=12=], "Match", "Mismatch")'.format(i)
我在 Sheet.columns[2]
处出错,知道为什么吗?我遵循完整的代码。
我有 python 2.7.13 版本,如果这有助于解决这个错误。
****更新****
完整代码:
import openpyxl
wb = openpyxl.load_workbook('test1.xlsx')
print wb.get_sheet_names()
Sheet = wb.worksheets[0]
for i, cellObj in enumerate(Sheet.columns[2], 1):
cellObj.value = '=IF($A[=13=]=$B[=13=], "Match", "Mismatch")'.format(i)
错误信息:
for i, cellObj in enumerate(Sheet.columns[2], 1):
TypeError: 'generator' object has no attribute 'getitem'
ws.columns
和 ws.rows
是 return 生成器的属性。但是openpyxl也支持slicing and indexing for rows and columns
因此,ws['C']
将给出第三列中的单元格列表。
对于其他寻求 copy/paste 公式的 Stack 冒险家:
# Writing from pandas back to an existing EXCEL workbook
wb = load_workbook(filename=myfilename, read_only=False, keep_vba=True)
ws = wb['Mysheetname']
# Paste a formula Vlookup! Look at column A, put result in column AC.
for i, cellObj in enumerate(ws['AC'], 1):
cellObj.value = "=VLOOKUP($A[=10=], 'LibrarySheet'!C:D,2,FALSE)".format(i)
一个问题,我有一个 header 并且公式覆盖了它。有人知道如何从第 2 行开始吗?
如果您想从另一行开始,您可以使用 if 语句跳过第一行,或者在枚举中指定范围。编码示例如下:
wb = load_workbook(filename=myfilename, read_only=False, keep_vba=True)
ws = wb['Mysheetname']
# using an if statement
for i, cellObj in enumerate(ws['AC'], 1):
if i > 1:
cellObj.value = "=VLOOKUP($A[=10=], 'LibrarySheet'!C:D,2,FALSE)".format(i)
# specifying range, up to max row on worksheet - or you can specify an exact range
for i, cellObj in enumerate(ws['AC2:AC'+str(ws.max_row)],2):
cellObj[0].value = "=VLOOKUP($A[=10=], 'LibrarySheet'!C:D,2,FALSE)".format(i)
第二种方法要求您从 2 开始索引并且 returns 是一个元组而不是单元格对象,因此您需要将 cellObj[0].value 指定为 return 的值单元格对象。
幸运的是,现在您可以轻松地在某些记录中做公式。还有更简单的函数可以使用,比如:
wb.sheetnames
而不是 wb.read_sheet_names()
sheet = wb['SHEET_NAME']
而不是 sheet = wb.get_sheet_by_name('SHEET_NAME')
公式可以很容易地插入:
sheet['A1'] = '=SUM(1+1)'
我尝试按照这个
link 是我完成任务所需要的。
但在这段代码中:
for i, cellObj in enumerate(Sheet.columns[2], 1):
cellObj.value = '=IF($A[=12=]=$B[=12=], "Match", "Mismatch")'.format(i)
我在 Sheet.columns[2]
处出错,知道为什么吗?我遵循完整的代码。
我有 python 2.7.13 版本,如果这有助于解决这个错误。
****更新****
完整代码:
import openpyxl
wb = openpyxl.load_workbook('test1.xlsx')
print wb.get_sheet_names()
Sheet = wb.worksheets[0]
for i, cellObj in enumerate(Sheet.columns[2], 1):
cellObj.value = '=IF($A[=13=]=$B[=13=], "Match", "Mismatch")'.format(i)
错误信息:
for i, cellObj in enumerate(Sheet.columns[2], 1):
TypeError: 'generator' object has no attribute 'getitem'
ws.columns
和 ws.rows
是 return 生成器的属性。但是openpyxl也支持slicing and indexing for rows and columns
因此,ws['C']
将给出第三列中的单元格列表。
对于其他寻求 copy/paste 公式的 Stack 冒险家:
# Writing from pandas back to an existing EXCEL workbook
wb = load_workbook(filename=myfilename, read_only=False, keep_vba=True)
ws = wb['Mysheetname']
# Paste a formula Vlookup! Look at column A, put result in column AC.
for i, cellObj in enumerate(ws['AC'], 1):
cellObj.value = "=VLOOKUP($A[=10=], 'LibrarySheet'!C:D,2,FALSE)".format(i)
一个问题,我有一个 header 并且公式覆盖了它。有人知道如何从第 2 行开始吗?
如果您想从另一行开始,您可以使用 if 语句跳过第一行,或者在枚举中指定范围。编码示例如下:
wb = load_workbook(filename=myfilename, read_only=False, keep_vba=True)
ws = wb['Mysheetname']
# using an if statement
for i, cellObj in enumerate(ws['AC'], 1):
if i > 1:
cellObj.value = "=VLOOKUP($A[=10=], 'LibrarySheet'!C:D,2,FALSE)".format(i)
# specifying range, up to max row on worksheet - or you can specify an exact range
for i, cellObj in enumerate(ws['AC2:AC'+str(ws.max_row)],2):
cellObj[0].value = "=VLOOKUP($A[=10=], 'LibrarySheet'!C:D,2,FALSE)".format(i)
第二种方法要求您从 2 开始索引并且 returns 是一个元组而不是单元格对象,因此您需要将 cellObj[0].value 指定为 return 的值单元格对象。
幸运的是,现在您可以轻松地在某些记录中做公式。还有更简单的函数可以使用,比如:
wb.sheetnames
而不是wb.read_sheet_names()
sheet = wb['SHEET_NAME']
而不是sheet = wb.get_sheet_by_name('SHEET_NAME')
公式可以很容易地插入:
sheet['A1'] = '=SUM(1+1)'