使用openpyxl更新Excel工作表表格后文件无法打开问题求助
错误根因
- 直接创建新
Table对象替换原有表格,会丢失原表格中微软扩展的xr:uid、xr3:uid等唯一标识属性,这些属性是Office正常解析表格的必要参数 - 新表格的列名和原有表格列名不匹配(原有第一列名为
Link,新生成的为Link ID),也会触发Excel的文件校验失败
解决方案
不要替换整个Table对象,直接修改原有Table的ref属性即可,原有属性、列定义、样式都会被保留,无需重新创建配置。
修改后代码如下:
import re # 定位目标原有表格 target_table = None for table in mysheet_LT._tables: if table.name == "LinkTable": target_table = table break # 动态读取原表格范围清空数据,无需写死范围 ref_match = re.match(r'([A-Z]+)(\d+):([A-Z]+)(\d+)', target_table.ref) start_col, start_row, end_col, end_row = ref_match.groups() clear_range = f"{start_col}{int(start_row)+1}:{end_col}{end_row}" for row in mysheet_LT[clear_range]: for cell in row: cell.value = None # 写入新数据 r = int(start_row) for per in ['AM' ,'PM']: for link in all_veh_attributes: r += 1 ID = int(link[0]) length = float(link[1]) demand = int(link[2]) if link[2] is not None else 0 mysheet_LT.cell(r,1).value = ID mysheet_LT.cell(r,2).value = per mysheet_LT.cell(r,3).value = length mysheet_LT.cell(r,4).value = demand print(f"{per} finished.") # 仅修改原有表格的范围属性即可 target_table.ref = f"A1:D{r}" # 保存文件 f_excel.save(filepath.replace(".xlsx","_copy.xlsx")) del f_excel
如果需要修改列名、表格样式,直接修改target_table对应的tableColumns、tableStyleInfo属性即可,不要新建Table对象替换原有实例。
内容的提问来源于stack exchange,提问作者Han Zheng
相关产品推荐
相关产品推荐

