使用Python写入Excel公式出错

4
我将尝试按照这个问题 的解决方法,使用Python和openpyxl包在我的Excel中添加一些公式。
这个链接正是我需要的内容。
但在这段代码中:
for i, cellObj in enumerate(Sheet.columns[2], 1):
    cellObj.value = '=IF($A${0}=$B${0}, "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${0}=$B${0}, "Match", "Mismatch")'.format(i)

错误信息:
for i, cellObj in enumerate(Sheet.columns[2], 1):

TypeError: 'generator'对象没有'getitem'属性。

你把变量命名为“Sheet”来引用工作表了吗? - PRMoureu
@PRMoureu说'Sheet'就像这个问题链接中的简单表格一样。Sheet = wb.get_sheet_by_name('Sheet1') - Mar
请问您能否添加您所遇到的确切错误以及代码呢?如果您能更新您的帖子,那将非常有帮助。 - PRMoureu
@PRMoureu 我已经更新了。 - Mar
4个回答

5

ws.columnsws.rows是返回生成器的属性。但是openpyxl还支持对行和列进行切片和索引

因此,ws['C']将返回第三列中单元格的列表。


3

对于其他想要复制/粘贴公式的 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${0}, 'LibrarySheet'!C:D,2,FALSE)".format(i)

有一个问题,我有一个标题,但这个公式覆盖了它。 有人知道如何从第2行开始吗?


0

现在你可以轻松地在某些记录中进行公式计算。此外,还有更简单的函数可供使用,例如:

  1. wb.sheetnames 代替 wb.read_sheet_names()
  2. sheet = wb['SHEET_NAME'] 代替 sheet = wb.get_sheet_by_name('SHEET_NAME')

而且公式可以很容易地插入:

sheet['A1'] = '=SUM(1+1)'


0

如果你想从另一行开始,你可以使用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${0}, '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${0}, 'LibrarySheet'!C:D,2,FALSE)".format(i)

第二种方法需要你从2开始索引,并返回一个元组而不是单元格对象,因此你需要指定cellObj[0].value来返回单元格对象的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接