使用xlrd时,读取包含公式的单元格值将返回0.0

时间:2013-12-23 04:03:39

标签: python xlrd

我尝试读取单元格值,例如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)

2 个答案:

答案 0 :(得分:12)

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编写一个,它也会获取结果(可能是也可能不正确)

答案 1 :(得分:0)

值为零的单元格与空单元格之间存在差异。要在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)))