使用openpyxl开启rich_text保存工作簿时触发Permission Error问题
开启rich_text参数后openpyxl无法保存工作簿的原因
问题重现
执行以下代码尝试打开并保存Excel工作簿时触发错误:
import openpyxl as ox if __name__ == '__main__': wb = ox.load_workbook("colSort.xlsx", rich_text=True) wb.save("TEST.xlsx")
错误信息
$ python test.py Traceback (most recent call last): File "C:\DEV\Fiverr2024\ORDER\robalf\SOLcolSorting\test.py", line 5, in <module> wb.save("TEST.xlsx") File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\workbook\workbook.py", line 386, in save save_workbook(self, filename) File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\writer\excel.py", line 294, in save_workbook writer.save() File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\writer\excel.py", line 275, in save self.write_data() File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\writer\excel.py", line 77, in write_data self._write_worksheets() File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\writer\excel.py", line 215, in _write_worksheets self.write_worksheet(ws) File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\writer\excel.py", line 200, in write_worksheet writer.write() File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\worksheet\_writer.py", line 359, in write self.write_rows() File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\worksheet\_writer.py", line 125, in write_rows self.write_row(xf, row, row_idx) File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\worksheet\_writer.py", line 147, in write_row write_cell(xf, self.ws, cell, cell.has_style) File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\cell\_writer.py", line 87, in etree_write_cell whitespace(text) File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\xml\functions.py", line 85, in whitespace stripped = node.text.strip() ^^^^^^^^^^^^^^^ AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'strip' Exception ignored in atexit callback: <function _openpyxl_shutdown at 0x0000018250C27880> Traceback (most recent call last): File "C:\DEV\.venv\xlwings\Lib\site-packages\openpyxl\worksheet\_writer.py", line 32, in _openpyxl_shutdown os.remove(path) PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'C:\Users\WRSPOL\AppData\Local\Temp\1\openpyxl.er0fcti4'
正常场景
移除rich_text=True参数后,保存操作可正常执行:
wb = ox.load_workbook("colSort.xlsx")
原因分析
- 核心错误根源:报错中的
AttributeError才是关键——开启rich_text=True时,openpyxl会将单元格内容解析为XML Element结构的富文本对象,但写入保存时的代码逻辑错误,试图对XML Element对象调用字符串的strip()方法,导致直接崩溃。 - Permission Error是连锁反应:因为前面的写入过程崩溃,openpyxl创建的临时文件未被正常关闭和清理,后续触发了文件占用无法删除的权限错误。
- 触发条件:你的Excel文件
colSort.xlsx中存在特殊格式的富文本单元格(比如嵌套格式、特殊符号或非标准样式),导致openpyxl解析后生成的富文本对象在写入时出现兼容性问题。
解决建议
- 检查并修复Excel文件:打开
colSort.xlsx,检查所有包含富文本的单元格(如带字体颜色、加粗、斜体的单元格),尝试简化格式或清除异常格式后重新测试。 - 升级openpyxl版本:该问题大概率是openpyxl的已知bug,升级到最新版本可能已修复此类富文本处理问题。
- 规避或手动处理富文本:如果不需要修改富文本内容,可暂时不使用
rich_text=True;若必须处理富文本,可遍历单元格将富文本对象转换为普通字符串或标准格式后再保存。
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

