如何用Python+FastAPI开发带文件级加密的Excel下载API?
实现带文件级加密的Excel下载API方案
核心思路
要实现文件级加密(区别于工作表加密),推荐使用msoffcrypto-tool结合Pandas、FastAPI完成,该工具支持Office Open XML加密标准,完全兼容Mac/Linux/Windows平台,无需依赖Windows专属库。
具体实现步骤
1. 安装依赖包
pip install fastapi pandas msoffcrypto-tool uvicorn
2. 完整代码示例
from fastapi import FastAPI, Response import pandas as pd import msoffcrypto import io import tempfile import os app = FastAPI() @app.get("/download-encrypted-excel") def download_encrypted_excel(): # 生成测试DataFrame(实际业务中替换为你的数据) df = pd.DataFrame({ "姓名": ["张三", "李四", "王五"], "年龄": [28, 32, 25], "部门": ["技术部", "市场部", "财务部"] }) # 第一步:导出未加密的临时Excel文件 with tempfile.NamedTemporaryFile(mode='w+b', suffix='.xlsx', delete=False) as temp_unencrypted: df.to_excel(temp_unencrypted, index=False, engine='openpyxl') temp_path = temp_unencrypted.name # 第二步:对临时文件做文件级加密 encrypted_buffer = io.BytesIO() with open(temp_path, 'rb') as f: office_file = msoffcrypto.OfficeFile(f) office_file.load_key(password='your_secure_pwd') # 替换为实际密码,建议从配置/环境变量读取 office_file.decrypt(encrypted_buffer) # 清理临时文件 os.unlink(temp_path) # 第三步:返回加密文件给客户端 return Response( content=encrypted_buffer.getvalue(), media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', headers={"Content-Disposition": 'attachment; filename="加密数据.xlsx"'} ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
3. 关键细节说明
msoffcrypto-tool:直接支持Office文件的原生加密,生成的文件可被Excel、WPS等主流软件直接识别,输入密码即可解锁整个文件- 临时文件处理:针对大DataFrame场景,用临时文件避免内存过载,用完即时删除
- 密码安全:禁止硬编码密码,建议从环境变量、配置中心等安全渠道获取
备选方案
如果对原生Excel加密要求不高,也可采用以下方式:
- 将Excel文件打包为带密码的ZIP包:用Python内置
zipfile库实现,但客户端需先解压再打开文件,体验略差 - 使用加密压缩工具:调用系统级加密压缩命令(如
7z),但需要依赖系统环境
内容的提问来源于stack exchange,提问作者최미리
相关产品推荐
相关产品推荐

