解决xlrd打开含#NAME错误xls文件时的AreaN公式令牌报错问题
解决xlrd打开含#NAME错误的.xls文件时的"Token 0x2d (AreaN)"报错问题
方案一:调用本地Excel客户端(Windows环境推荐)
利用win32com直接调用系统安装的Excel程序,Excel本身可以忽略公式错误打开文件,完全规避xlrd的解析限制。
代码示例:
import win32com.client as win32 import os def extract_data_from_xls(file_path, target_range): excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False try: # 以修复模式打开文件,自动处理损坏内容 workbook = excel.Workbooks.Open(file_path, CorruptLoad=1) worksheet = workbook.Worksheets(1) # 读取指定区域数据 range_obj = worksheet.Range(target_range) data = [] for row in range_obj.Rows: row_data = [cell.Value for cell in row] data.append(row_data) return data finally: # 不保存修改,避免破坏原文件 workbook.Close(SaveChanges=False) excel.Quit() # 批量处理示例 folder_path = r"C:\Users\metin.unlu\Desktop\Python\renk_study\labs" target_range = "A1:C10" # 替换为你的目标区域 for filename in os.listdir(folder_path): if filename.endswith(".xls"): file_path = os.path.join(folder_path, filename) try: data = extract_data_from_xls(file_path, target_range) print(f"文件 {filename} 提取完成") # 可添加数据保存逻辑(如写入CSV/Excel) except Exception as e: print(f"处理文件 {filename} 出错: {str(e)}")
方案二:使用pyxlsb库(跨平台可选)
pyxlsb针对二进制格式的.xls文件开发,对损坏公式的兼容性优于xlrd,无需依赖Excel客户端。
代码示例:
import pyxlsb import os def extract_data_with_pyxlsb(file_path, target_range): # 解析Excel区域字符串为行列索引(从0开始) def parse_range(range_str): start, end = range_str.split(':') # 提取列字母和行号 def split_cell(cell_str): col = ''.join([c for c in cell_str if c.isalpha()]) row = int(''.join([c for c in cell_str if c.isdigit()])) - 1 return col, row start_col, start_row = split_cell(start) end_col, end_row = split_cell(end) # 列字母转数字(A=0) def col_to_num(col): num = 0 for c in col.upper(): num = num * 26 + (ord(c) - ord('A') + 1) return num - 1 return (start_row, end_row), (col_to_num(start_col), col_to_num(end_col)) (start_row, end_row), (start_col, end_col) = parse_range(target_range) data = [] with pyxlsb.open_workbook(file_path) as wb: with wb.get_sheet(1) as sheet: for row_idx in range(start_row, end_row + 1): row_data = [] for col_idx in range(start_col, end_col + 1): cell = sheet.cell(row_idx, col_idx) row_data.append(cell.v) data.append(row_data) return data # 批量处理示例 folder_path = r"C:\Users\metin.unlu\Desktop\Python\renk_study\labs" target_range = "A1:C10" for filename in os.listdir(folder_path): if filename.endswith(".xls"): file_path = os.path.join(folder_path, filename) try: data = extract_data_with_pyxlsb(file_path, target_range) print(f"文件 {filename} 提取完成") except Exception as e: print(f"处理文件 {filename} 出错: {str(e)}")
为什么xlrd无法解决?
xlrd的ignore_workbook_corruption=True仅处理文件结构层面的损坏,无法绕过公式解析时的语法错误(如AreaN token对应的无效公式)。对于含#NAME错误的文件,xlrd的公式解析模块会直接抛出异常,没有内置的跳过机制。
内容的提问来源于stack exchange,提问作者Lastingk
相关产品推荐
相关产品推荐

