Flask上传Excel保存报错:AttributeError: 'Typed'对象无to_tree属性
解决Flask中处理Excel保存时的AttributeError: 'Typed' object has no attribute 'to_tree'问题
问题分析
这个错误是openpyxl在处理含特殊图表(如组合图、带复杂元素的图表)的Excel文件时,内部序列化逻辑的bug导致的。你之前只删除了普通工作表中的图表,但工作簿中可能还存在独立的图表工作表(ChartSheet),或者openpyxl的内部图表结构未彻底清理,保存时仍会触发错误。
解决方案
方案1:彻底清理所有图表(保留原文件其他格式)
修改代码,同时删除图表工作表和普通工作表中的所有图表,避免索引错乱问题:
from flask import * from openpyxl import load_workbook # 补充缺失的导入 app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/submit', methods=['POST']) def submit(): if 'f1' in request.files: uploaded_file = request.files['f1'] # 读取上传的Excel文件 wb = load_workbook(uploaded_file, data_only=True, read_only=False, keep_vba=True, rich_text=True) # 1. 删除所有独立的图表工作表 chart_sheet_names = [name for name in wb.sheetnames if isinstance(wb[name], wb.ChartSheet)] for name in chart_sheet_names: del wb[name] # 2. 清空普通工作表中的所有图表 for sheet in wb.worksheets: sheet._charts.clear() # 保存处理后的文件 wb.save('output.xlsx') return "文件处理完成" return "未检测到上传文件"
方案2:用Pandas绕过图表问题(仅保留数据)
如果不需要保留原文件的VBA、图表或复杂格式,直接用Pandas读取数据再保存,完全避开openpyxl的图表解析问题:
from flask import * import pandas as pd app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/submit', methods=['POST']) def submit(): if 'f1' in request.files: uploaded_file = request.files['f1'] # 读取所有工作表数据 excel_file = pd.ExcelFile(uploaded_file) with pd.ExcelWriter('output.xlsx') as writer: for sheet_name in excel_file.sheet_names: df = pd.read_excel(excel_file, sheet_name=sheet_name) df.to_excel(writer, sheet_name=sheet_name, index=False) return "文件处理完成" return "未检测到上传文件"
方案3:升级openpyxl版本
你当前使用的openpyxl 3.1.4版本存在已知的图表序列化bug,升级到最新稳定版可能直接解决问题:
pip install --upgrade openpyxl
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

