3

我在使用 openpyxl for python 加载 xlsm 文件时收到警告,然后在我将一些数据添加到特定工作表中的特定 7 个单元格后保存/关闭它。问题是我收到了一个“FutureWarning”,我不知道它是关于什么的。我已经搜索了一段时间,但无法破译。

我怀疑 wb.save() 方法是触发此警告的原因,因为当我评论此特定行时它没有显示。

有谁知道这是什么?

代码

wb = openpyxl.load_workbook(filename=directory_path.xlsm, keep_vba=True)
ws = wb['sheetname']
ws.cell(row1, col1).value = ### (some number)
ws.cell(row2, col2).value = ### (some number)
ws.cell(row3, col3).value = ### (some number)
ws.cell(row4, col4).value = ### (some number)
ws.cell(row5, col5).value = ### (some number)
ws.cell(row6, col6).value = ### (some number)
ws.cell(row7, col7).value = ### (some number)
wb.save(directory_path.xlsm)
wb.close()

警告信息

C:\Users\...\Anaconda3\lib\site-packages\openpyxl\comments\shape_writer.py:75: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead.
  if not shape_types:
4

1 回答 1

5

Openpyxl似乎使用的是旧版本的lxml. 这是您的lxml.

shape_writer源代码的第 73-76 行是:

# check whether comments shape type already exists
shape_types = root.find("{%s}shapetype[@id='_x0000_t202']" % vmlns)
if not shape_types:
    self.add_comment_shapetype(root)

问题是if not shape_types:. root.find()是对lxml. 的文档lxml说:

在 ElementTree 1.3 和 lxml 2.0 之前,您还可以检查元素的真值以查看它是否有子元素,即子元素列表是否为空:

if root:   # this no longer works!
    print("The root element has children")

这不再受支持,因为人们倾向于期望“某物”评估为 True 并期望元素是“某物”,无论他们是否有孩子。因此,许多用户对任何 Element 在上述 if 语句中的计算结果为 False 感到惊讶。相反,使用 len(element),它更明确且不易出错。

于 2018-08-02T04:55:45.793 回答