You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python下载xlsx文件后无法用Excel打开,该如何解决?

你的代码逻辑本身是对的,出现写出来的xlsx打不开的问题,基本都是以下几种原因,按优先级排查就行:

  • 没有处理站点反爬规则,拿到的返回内容根本不是xlsx文件流
    大部分站点会校验请求头的User-Agent字段,直接用requests发起的默认请求会被识别为爬虫,返回的其实是403错误页、验证页这类HTML内容,你把HTML内容写到后缀为xlsx的文件里,Excel自然无法识别。
  • 没有校验请求状态就直接写入内容
    如果请求本身失败(比如404、500等错误),返回的错误信息被写入文件,也会导致文件损坏。
  • 文件写入时没有正常关闭句柄
    你现在的写法没有主动关闭文件对象,偶发会出现内容没完全落盘就结束进程,导致文件损坏。

修复后的参考代码

import requests

url = 'https://some_url'
# 加模拟浏览器的请求头,避免被反爬
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}
resp = requests.get(url, headers=headers)

# 先校验请求是否成功
if resp.status_code == 200:
    # 可选:校验返回内容类型是不是xlsx格式,排除返回错误页的情况
    if 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' in resp.headers.get('Content-Type', ''):
        # 用上下文管理器自动处理文件关闭,避免文件损坏
        with open('some_filename.xlsx', 'wb') as f:
            f.write(resp.content)
        print("文件下载成功")
    else:
        print("返回内容不是xlsx格式,请检查请求是否被站点拦截")
        # 排查时可以打开下面这行,把返回内容存成html看是不是拦截页
        # with open('error.html', 'w', encoding='utf-8') as f:
        #     f.write(resp.text)
else:
    print(f"请求失败,状态码:{resp.status_code}")

排查小技巧

如果修改后还是打不开,直接把下载的文件后缀改成.txt用文本编辑器打开,如果能看到HTML标签结构,就说明请求还是被站点拦截了,需要根据站点的规则加对应的cookie、请求参数或者验证码处理逻辑。

内容的提问来源于stack exchange,提问作者Patrick Ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:12:00