Python xlrd Excel脚本转换“#不适用;到42岁

Python xlrd Excel脚本转换“#不适用;到42岁,python,excel,xlrd,Python,Excel,Xlrd,我有一个脚本,它使用xlrd模块,特别是row_values()方法,从excel电子表格中提取数据。它似乎做得很好,除了以前的VLookups自动生成了“#N/a”,在这种情况下,xlrd将“#N/a”作为整数42 我看过字符串格式化方法,但看不出这是怎么回事 除了有一个发现了生命意义的剧本(42),还有谁能提出这个问题是什么 干杯 注意:工作表中不再包含Vlookups,所有值都是从其他工作表复制的,所有内容都是普通值,没有公式。xlrd web上的文档(或在您的计算机上;在浏览器中打开文档

我有一个脚本,它使用xlrd模块,特别是row_values()方法,从excel电子表格中提取数据。它似乎做得很好,除了以前的VLookups自动生成了“#N/a”,在这种情况下,xlrd将“#N/a”作为整数42

我看过字符串格式化方法,但看不出这是怎么回事

除了有一个发现了生命意义的剧本(42),还有谁能提出这个问题是什么

干杯

注意:工作表中不再包含Vlookups,所有值都是从其他工作表复制的,所有内容都是普通值,没有公式。

xlrd web上的文档(或在您的计算机上;在浏览器中打开文档,然后执行
Ctrl-F#N/A
)为您提供的


查看和可能很有用,它为您提供了sheet.row_types()和其他返回的类型号之间的交叉引用。请注意,测试这些类型编号通常比在值上使用isinstance()更有效,并且使用类型编号不会产生歧义。

我发现这很有用。多亏了约翰最初的帮助

def xls_proc_text(cell, value_proc=None, text_proc=None):
    """Converts the given cell to appropriate text."""
    """The proc will come in only when the given is value or text."""
    ttype = cell.ctype
    if ttype == xlrd.XL_CELL_EMPTY or ttype == xlrd.XL_CELL_TEXT or ttype == xlrd.XL_CELL_BLANK:
        if text_proc is None:
            return cell.value
        else:
            return text_proc(cell.value)
    if ttype == xlrd.XL_CELL_NUMBER or ttype == xlrd.XL_CELL_DATE or ttype == xlrd.XL_CELL_BOOLEAN:
        if value_proc is None:
            return str(cell.value)
        else:
            return str(value_proc(cell.value))
    if cell.ctype == xlrd.XL_CELL_ERROR:
        # Apply no proc on this.
        return xlrd.error_text_from_code[cell.value]

如Andrew所列,如果单元格中有错误,xlrd将写入错误代码,您可以看到:

将代码0x2A从十六进制转换为十进制,可以得到42的值。 为了避免这种情况,您可以在代码中使用类似的内容:

for rownum in xrange(sh.nrows):
    wr.writerow(['#N/A' if col.ctype == xlrd.XL_CELL_ERROR else col.value for col in sh.row(rownum)])
  • 多亏了上面的每个人,我简化了解决方案。你可以 根据单元格类型识别错误单元格
  • 我们掌握的数据是C类型的#N/A
  • 值=42(而不是#N/A)
  • ctype将是5
简单的解决方案可能是识别错误单元格并将“无”替换为42

textType = sheet.cell(r,0).ctype #Get the type of the cell

        if textType == 5:
            text = None
        else:
            text = sheet.cell(r, 0).value
XLRD:

您可以根据下面的文档识别所有其他类型


XL_单元格_错误5 int表示内部Excel代码;有关文本表示,请参阅提供的字典错误\u text\u from\u code

Wild guess:Excel的数字代码\N/a错误值为2042。我对xlrd一无所知,但也许这会有所帮助。(我宁愿相信你的剧本在思考深层次的想法,尽管…)这些链接不再有效,无法让这成为一个有用的答案。
textType = sheet.cell(r,0).ctype #Get the type of the cell

        if textType == 5:
            text = None
        else:
            text = sheet.cell(r, 0).value