使用Python从SQL数据库导出Excel时遇'File is not a zip file'错误求助
问题解决:Pandas循环写入Excel报错'File is not a zip file'
错误原因
原代码每次循环重复打开、修改并关闭Excel文件,容易引发文件读写冲突,导致文件内容损坏,无法被识别为合法的.xlsx压缩包(.xlsx本质是zip格式的文件集合)。此外,手动创建空工作簿后多次操作的方式也增加了文件损坏的概率。
修复后的openpyxl方案
无需每次循环单独操作文件,一次性初始化ExcelWriter,批量写入所有工作表后统一保存,避免文件操作冲突:
import pandas as pd # 直接初始化ExcelWriter,自动创建文件 writer = pd.ExcelWriter('result.xlsx', engine='openpyxl') for table in tables_list: query = f"select * from {table}" df = pd.read_sql_query(query, engine) # 写入当前表到对应工作表 df.to_excel(writer, sheet_name=table) # 所有表写入完成后统一关闭保存 writer.close()
如果必须保留逐次写入的逻辑,需使用追加模式并确保文件正确处理:
import pandas as pd from openpyxl import load_workbook, Workbook def write_table_to_excel(table, file): # 加载已存在的工作簿 book = load_workbook(file) # 使用追加模式打开writer,存在同名工作表则替换 with pd.ExcelWriter(file, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer: writer.book = book query = f"select * from {table}" df = pd.read_sql_query(query, engine) df.to_excel(writer, sheet_name=table) # 先创建空工作簿(仅第一次执行需要) book = Workbook() book.save('result.xlsx') for table in tables_list: write_table_to_excel(table, 'result.xlsx')
不使用openpyxl的替代方案
方案1:使用xlsxwriter引擎
xlsxwriter支持直接批量写入多工作表,无需手动管理工作簿,代码更简洁且不易出错:
import pandas as pd # 使用xlsxwriter引擎创建ExcelWriter with pd.ExcelWriter('result.xlsx', engine='xlsxwriter') as writer: for table in tables_list: query = f"select * from {table}" df = pd.read_sql_query(query, engine) df.to_excel(writer, sheet_name=table)
方案2:使用pandas默认引擎
若系统已安装xlsxwriter或openpyxl,可省略引擎参数,pandas会自动选择可用引擎:
import pandas as pd with pd.ExcelWriter('result.xlsx') as writer: for table in tables_list: query = f"select * from {table}" df = pd.read_sql_query(query, engine) df.to_excel(writer, sheet_name=table)
内容的提问来源于stack exchange,提问作者Marharyta Kalynchuk
相关产品推荐
相关产品推荐

