【问题标题】:Reading a cell value that contains a formula returns 0.0 when using xlrd使用 xlrd 读取包含公式的单元格值会返回 0.0
【发布时间】:2014-06-10 02:44:21
【问题描述】:

我尝试读取一个单元格值,例如 Excel 工作表中的 E5 和 E5 包含公式“=(A29 - A2)”。我使用以下代码,它返回 0.00 而不是实际值 1.440408 .有没有办法解决这个问题?我想打印正确的值。请帮我解决一下这个。谢谢。

book = xlrd.open_workbook('Test.xlsx')
first_sheet = book.sheet_by_index(0)
particular_cell_value = (first_sheet.cell_value(4,4))
print(particular_cell_value)

【问题讨论】:

  • 似乎在first_sheet.cell_value(2, 2) 中,您采用了C3 的值(或者D4,如果cell_value 的参数是基于1 的)单元格?
  • 很抱歉我只使用了 (4,4)。我已经更改它以进行测试,并在此处给出错误。
  • 我不介意在 Python 中使用任何 excel 解析器来获得正确的结果。我也尝试了 openpyxl 和 win32comclient ,但它们都没有正确返回结果。 :-(
  • +1 因为我前段时间遇到过同样的问题,但我从未找到解决方案

标签: python xlrd


【解决方案1】:

Excel 文件独立存储公式和值。 如果文件由 Excel 直接保存,则 Excel 会同时写入。但是,其他软件生成的文件,例如 xlwt、OpenPyXL 和 XlsxWriter,只写公式。这是因为无法保证第三方包能够以与 Excel 完全相同的方式评估 Excel 的内置函数。因此建议(实际上来自 Microsoft 本身)是让第三方包编写公式,将值设置为零,并设置全局“自动重新计算”标志(因此,如果文件在 Excel 中打开,Excel 将继续计算 所有公式结果自动)。

XlsxWriter 在其write_formula() 方法的文档中详细说明:

XlsxWriter 不计算公式的值,而是将值 0 存储为公式结果。然后它在 XLSX 文件中设置一个全局标志,表示在打开文件时应该重新计算所有公式和函数。这是 Excel 文档中推荐的方法,通常它适用于电子表格应用程序。但是,没有计算公式功能的应用程序(例如 Excel Viewer)或某些移动应用程序只会显示 0 结果。

然后它会告诉你如何将值和公式写在一起,如果你真的想把一个值放在那里。该值将是您选择的任何值,它不一定与 Excel 计算的值相同。在撰写本文时,xlwt 和 OpenPyXL 都不支持此功能。

所以,说了这么多,当涉及到读取一个 Excel 文件时,xlrd 自然会选择 0,除非同时写入了结果。您会注意到,当文件最后一次由 Excel 保存时,xlrd 总是会选择正确的结果。它还将获取结果(可能正确也可能不正确)如果您使用 XlsxWriter 编写了一个

【讨论】:

  • 你拯救了我的一天...谢谢!
  • 在 excel 中打开文件,保存,现在可以使用了!谢谢!
【解决方案2】:

值为零的单元格和空单元格之间存在差异。要在 openpyxl 中对此进行测试,您必须检查 TYPE_NULL 并检查 None 的值,因为 TYPE_NULL 和 TYPE_STRING 使用相同的值“s”。这对我来说似乎是一个错误。也许 openpyxl 以后会为 TYPE_NULL 选择一个唯一的值。

def use_openpyxl():
    import openpyxl
    print ("Using openpyxl:")
    wb = openpyxl.load_workbook('cell_formula_test.xlsx')
    ws = wb.get_sheet_by_name('Sheet1')
    for row in ws.rows:
        for cell in row:
            if (cell.data_type == openpyxl.cell.Cell.TYPE_NULL) and (cell.value == None):
                continue
            print ("  %s:%s:%s" % (cell.address, cell.data_type, cell.value))

在 xlrd 中,cell_type 确实具有用于空单元格的唯一类型,因此检查更加直接。

def use_xlrd():
    import xlrd
    print ("Using xlrd:")
    wb = xlrd.open_workbook('cell_formula_test.xlsx')
    ws = wb.sheet_by_name('Sheet1')
    for i in range(ws.nrows):
        for j in range(ws.ncols):
            if ws.cell_type(i, j) != xlrd.XL_CELL_EMPTY:
                print ("  (%d, %d):%s:%s" % (i, j, ws.cell_type(i, j), ws.cell_value(i, j)))

【讨论】:

  • 嗨 ChipJust,我永远无法打印包含公式的单元格,因为条件本身在 if 条件下失败。 :-( 由于它检测到的值为 0.00,因此它不会打印任何包含公式的该死单元格 :-(
  • 哦,我明白了。空单元格和零值之间存在差异。您可以使用 cell_type 属性进行检查,尤其是对于 xlrd。我将修改这个例子来展示这一点。
  • 不,这里的问题是我的单元格没有零值。我的单元格的值类似于 14.2 或 8.5 或任何值。问题是工作表是由 XlsxWriter 生成的,当我尝试使用 xlrd 或 openpyxl 读取它时,我面临无法读取包含公式的单元格的问题。我无法解决此问题。
  • 你能发布你的代码和数据吗?手动创建电子表格时是否仍有问题?也许你能告诉我上面的代码对你的数据显示了什么?
  • Data: TimeStamp Events Time from Event 1 20178.55447 Event 1 0 Event 3 from Event 1 20178.64812 Event 2 0.093647 0.1671 20178.67671 Event 3 0.122242 Event N from Event 1 20178.72157 Event 4 0.1671 0.559553 20179.08555 Event 5 0.531082 20179.10126 Event 6 0.54679 20179.11403 事件 7 0.559553
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 2011-06-09
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多