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