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

我是第一次尝试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)

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

解决方法:

在openpyxl中,库提供了wb.active作为属性,为您提供当前活动的工作表.因此,您不需要添加()来将其作为函数调用.

ws = wb.active

你的减少的例子正确地做了.

上一篇:python – “工作表范围名称不存在”openpyxl中的KeyError


下一篇:python – 使用OpenPyxl复制粘贴列范围