加密Excel文件用ExcelWriter无法新增工作表且无报错问题排查
问题排查与修复方案
核心问题分析
你的代码无法创建新工作表且无报错,主要有以下几个关键点:
- BytesIO指针位置未重置:解密操作后,
self.file_name这个BytesIO对象的文件指针停留在末尾,后续pd.ExcelWriter以追加模式打开时,无法正确读取到已解密的工作簿内容。 - 未关联已加载的工作簿:注释掉的
writer.self.wb = self.wb写法错误,正确的做法是将已通过load_workbook加载的self.wb赋值给writer.book,否则pd.ExcelWriter会尝试重新读取BytesIO内容,导致和原工作簿脱节。 - 未将修改后的内容写回实际文件:所有操作都在内存中的BytesIO里完成,最后没有把修改后的工作簿内容保存到原Excel文件,所以实际文件里看不到新工作表。
修复后的代码示例
class MainWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.file_name = io.BytesIO() # 读取并解密加密文件到BytesIO with open('private\cabc.xlsx', 'rb') as file: office_file = msoffcrypto.OfficeFile(file) office_file.load_key(password='password') office_file.decrypt(self.file_name) # 重置BytesIO指针到开头,确保load_workbook能读取完整内容 self.file_name.seek(0) self.wb = load_workbook(filename=self.file_name) print('created new excel sheet') # 初始化ExcelWriter时关联已加载的工作簿 writer = pd.ExcelWriter(self.file_name, engine='openpyxl', mode='a') writer.book = self.wb # 复制已有的工作表样式(可选,避免格式丢失) writer.sheets = {ws.title: ws for ws in self.wb.worksheets} title = ['a','b'] df3 = pd.DataFrame(columns=title) df3.to_excel(writer, sheet_name=self.today) writer.close() # 将修改后的BytesIO内容写回原文件 self.file_name.seek(0) with open('private\cabc.xlsx', 'wb') as output_file: output_file.write(self.file_name.getvalue())
关键修复点说明
- 重置BytesIO指针:每次读取或写入BytesIO后,调用
seek(0)将指针移到开头,确保后续操作能正确访问完整内容。 - 关联工作簿到Writer:通过
writer.book = self.wb让Pandas使用已加载的工作簿,同时writer.sheets的赋值能保留原有工作表的结构和格式。 - 写回实际文件:最后将内存中修改后的BytesIO内容覆盖写入原文件,这样新创建的工作表才能被持久化保存。
内容的提问来源于stack exchange,提问作者Bireysel Finans
相关产品推荐
相关产品推荐

