为什么我的openpyxl WorkBook.active(file_name)给我一个TypeError:对象不可调用?

时间:2016-03-02 13:35:26

标签: python excel openpyxl

我第一次尝试使用openpyxl。我有一个excel文件,有两列数据。列'A'具有ID号,而列'C'具有值。我只是试图将它们作为普通键/值对象提取出来。

这些是我想要实现的伪步骤

  • 按位置查找文件,并创建工作簿对象
  • 定义WorkSheet对象。就我而言,这是默认的第一页
  • 只要列'A'
  • 中有键值,就会遍历行
  • 将“A”和“C”中的键和值添加到对象中。

问题是我无法通过第2步创建工作表。行ws = wb.active()似乎是获取默认WorkSheet的完全标准化方式。我看到它在很多例子中使用,并且在写这篇文章时,有关使用该行的SO有93个问题。但就我而言,它会引发错误:

  File "C:\myworkspace\Myclass.py", line 18, in <module>
    ws = wb.active()
TypeError: 'ReadOnlyWorksheet' object is not callable

我对Python很陌生,但之前我遇到过类似的错误。我知道如果我导入一个python模块名称而不是相关的类名,它会被抛出。到底发生了什么?为什么这种看似标准的检索工作表对象的方法,试图实现模块而不是类?我使用它错了吗?

file_url = 'C:/myfilepath.xlsx'
key_column_index = 1
value_column_index = 3
row_start = 2

request_map = {}

wb = load_workbook(filename = file_url, use_iterators = True)
ws = wb.active()

row_counter = row_start

while( ws.cell(row=row_counter, column=key_column_index).value ):
    key = ws.cell(row=row_counter, column=key_column_index).value
    value = ws.cell(row=row_counter, column=value_column_index).value
    request_map[key] = value

    row_counter += 1

pprint(dict([(n, tuple(l.split(';'))) for n, l in enumerate(requests.split('\n'))]))

为了让这真的很奇怪,我告诉你:

我想以最简单的方式重现我的错误,所以我找到了最简单的例子,并将其复制到我的工作区。除文件路径外,这与Ryu_Hayabusa对此问题的回答完全相同:parsing excel documents with python。现在得到这个:它有效,没有任何错误!

file_url = 'C:/myfilepath.xlsx'
wb = load_workbook(file_url)
ws = wb.active
for row in ws.iter_rows():
   for cell in row:
     print cell.value

当然,我怀疑行中的粗体文字

wb = load_workbook( filename = file_url ,use_iterators = True

是问题,但没有。删除粗体标记的文本,使其与工作示例相同,仍然会产生错误。唯一的区别是现在它说的是Worksheet而不是ReadOnlyWorksheet这个广阔的世界正在发生什么?

1 个答案:

答案 0 :(得分:9)

在openpyxl中,库提供wb.active作为属性,为您提供当前活动的工作表。因此,您无需添加()即可将其称为函数。

ws = wb.active

你的缩减示例是正确的。