一、安装 msoffcrypto-tool
注意: 运行前请确保已执行 pip install msoffcrypto-tool。
二、抽取函数
python
import pandas as pd
import msoffcrypto
import io
def encrypt_excel_buffer(buffer, filename, password):
"""
将内存中的 Excel 数据加密并保存到磁盘
"""
buffer.seek(0)
office_file = msoffcrypto.OfficeFile(buffer)
with open(filename, "wb") as f_out:
office_file.encrypt(password=password, outfile=f_out)
buffer.close()
三、先将数据全部写进内存 buffer,关闭 writer 后再加密输出到磁盘。
python
for i in ['1','2','3']:
# 1. 创建内存缓冲区
buffer = io.BytesIO()
# 2. 将数据写入内存缓冲区而不是直接写磁盘
with pd.ExcelWriter(buffer, engine='openpyxl') as writer:
# 写入第一个 Sheet
df_fh = wnrfh[wnrfh['统筹区'] == i]
df_fh.to_excel(writer, sheet_name='符合导入', index=False)
# 写入第二个 Sheet
df_tc = wnrtc[wnrtc['统筹区'] == i]
df_tc.to_excel(writer, sheet_name='存在个单', index=False)
# 3. 调用加密函数,将内存数据变成加密文件保存
target_filename = f'未缴费纳入统计审核通过-{i}.xlsx'
encrypt_excel_buffer(buffer, target_filename, password="你的密码")
print("所有统筹区文件已加密生成。")
1.with 语句的作用:
在 with pd.ExcelWriter... 结束时,Pandas 会自动完成 Excel 的结构构建并将其"保存"到 buffer 中。只有在 writer 关闭后,buffer 里的内容才是完整的 Excel 文件。
2.避免磁盘残留:
通过 io.BytesIO(),整个过程中没有任何一个时刻会在磁盘上产生"不带密码"的临时文件,安全性最高。
3.文件名处理:
使用了 Python 的 f-string (f'...'),比 .format() 更简洁,适合 2026 年的主流写法。
4.性能:
此方法在内存中操作,对于几万行以内的数据,速度会比先写磁盘再加密快很多。