pandas.read_excel() 无 encoding 参数,.xls 需 xlrd≤1.2.0,.xlsx 推荐 openpyxl 引擎;自动处理 Unicode,不需手动设编码。

用 pandas.read_excel() 读取 Excel 时要注意哪些编码和引擎问题
Excel 文件本身没有“编码”概念,但 read_excel() 在读取 .xls 和 .xlsx 时依赖底层引擎,容易因缺失依赖或版本不匹配报错。常见错误如 ImportError: Missing optional dependency 'xlrd' 或 Unsupported format, or corrupt file。
- .xls 文件必须用
xlrd(注意:v2.0+ 不再支持 .xls,得降级到xlrd==1.2.0) - .xlsx 文件推荐用默认引擎
openpyxl(pip install openpyxl),无需额外配置 - 显式指定引擎更稳妥:
pd.read_excel("data.xlsx", engine="openpyxl") - 含中文表头或数据时,不用管 encoding 参数——那是给
read_csv()用的,read_excel()自动处理 Unicode
把 DataFrame 转成 JSON 用 to_json(),但输出格式不对怎么办
to_json() 默认输出紧凑单行字符串,嵌套深、可读性差,且日期/NaN 处理不直观。这不是 bug,是设计如此——它优先考虑传输效率,不是人工阅读。
- 加
indent=2让结构清晰:df.to_json("out.json", indent=2) - 日期列默认转成时间戳(毫秒数),加
date_format="iso"输出标准 ISO 字符串 - 空值(NaN)默认转为
null,符合 JSON 规范;若需字符串"null"或空字符串,得先用df.fillna("") - orient 参数决定键结构:
orient="records"最常用,生成对象数组;orient="index"会把行号当 key,慎用
Excel 有多张 sheet,怎么批量导出为多个 JSON 文件
直接传 sheet_name=None 给 read_excel() 会返回 dict,key 是 sheet 名,value 是对应 DataFrame——这是批量处理的前提。
- 先用
pd.read_excel("book.xlsx", sheet_name=None)一次性加载全部 sheet - 遍历 dict:
for sheet_name, df in all_sheets.items(): df.to_json(f"{sheet_name}.json", orient="records", indent=2) - 注意文件名合法性:sheet 名含斜杠、星号等特殊字符时,需清洗,例如
sheet_name.replace("/", "_") - 如果只要特定几个 sheet,传列表:
sheet_name=["Summary", "Details"]
导出后 JSON 数据量大,浏览器打不开或解析慢,怎么优化
JSON 本身无压缩,纯文本体积大,尤其含大量重复字段名(如 [{"name":"A","age":20},{"name":"B","age":25}] 中的 "name"、"age" 反复出现)。
立即学习“Python免费学习笔记(深入)”;
- 用
orient="values"+ 单独存字段名,可省约 30%–50% 体积(但牺牲可读性和结构语义) - 导出前删掉无用列:
df = df[["id", "title", "status"]] - 数值列避免字符串化:Excel 里数字被存成文本时,
to_json()会输出带引号的字符串,用df["col"] = pd.to_numeric(df["col"], errors="ignore")预处理 - 真要兼顾体积与兼容性,导出后用 gzip 压缩文件(
gzip.open(..., "wt")),但前端需解压逻辑
最常被忽略的是日期列处理——不设 date_format 时,to_json() 输出毫秒时间戳,前端 new Date(1712345678901) 能解析,但可读性归零;而 date_unit="s" 改成秒级又可能丢精度。实际项目里,统一用 ISO 字符串最省心。


















