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

加密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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:55:31