如何使用Python Openpyxl保存转换后的Excel为新文件
问题描述
工作目录下共有3个以_Updated.xlsx结尾的Excel文件,需要删除所有文件内的空行后生成新文件存储结果,保留原始文件不被修改,现有编写的Python代码无法正常保存所有转换后的文件,无法定位问题。
原问题附带的代码如下:
import openpyxl import os from openpyxl import load_workbook,Workbook import glob from pathlib import Path Excel_file_path="/Excel" for file in Path(Excel_file_path).glob('*_Updated.xlsx'): wb=load_workbook(file) wb_modified = False for sheet in wb.worksheets: max_row_in_sheet = sheet.max_row max_col_in_sheet = sheet.max_column sheet_modified = False if max_row_in_sheet > 1: first_nonempty_row = nonempty_row() # Function to find nonempty row sheet_modified = del_rows_before(first_nonempty_row) #Function to delete nonempty row wb_modified = wb_modified or sheet_modified if wb_modified: for workbook in workbooks: for sheet in wb.worksheets: new_wb = Workbook() ws = new_wb.active for row_data in sheet.iter_rows(): for row_cell in row_data: ws[row_cell.coordinate].value = row_cell.value new_wb.save("/Excel/"+sheet.title+"_Transformed.xlsx")
代码错误点排查
- 函数调用缺失必要参数:自定义函数
nonempty_row()、del_rows_before()未传入当前操作的工作表对象,无法定位处理目标,不会实际执行空行删除逻辑 - 引用未定义变量:循环
for workbook in workbooks:中的workbooks变量从未被定义,代码运行时会直接抛出NameError中断执行 - 保存逻辑位置错误:
new_wb.save()被放在单元格遍历的最内层循环,每写入一个单元格就触发一次文件保存,不仅IO效率极低,还会导致文件内容被反复覆盖,最终仅保留最后一个单元格的内容 - 输出文件命名逻辑缺陷:保存时直接以工作表标题作为文件名,不同原文件如果存在同名工作表,后生成的文件会直接覆盖之前的结果,3个原文件最终可能仅输出1个文件
- 空行处理逻辑不全:现有逻辑仅设计了删除首个非空行之前的行,未覆盖表中间、表尾的空行,无法实现“删除所有空行”的需求
修正后可直接运行的代码
from openpyxl import load_workbook, Workbook from pathlib import Path # 替换为你的Excel文件实际存储目录,Windows路径示例:"C:/Users/xxx/Documents/Excel" Excel_file_path = "/Excel" for file in Path(Excel_file_path).glob('*_Updated.xlsx'): # 加载原始文件,不对原文件做任何修改 wb_original = load_workbook(file, data_only=True) # 新建空白工作簿存储处理结果 wb_processed = Workbook() # 删除新工作簿默认生成的空白工作表 wb_processed.remove(wb_processed.active) for sheet in wb_original.worksheets: # 在新工作簿中创建同名工作表 ws_processed = wb_processed.create_sheet(title=sheet.title) # 遍历原表所有行,过滤全空行后写入新表 for row in sheet.iter_rows(values_only=True): # 行内存在非空、非全空白字符的单元格时,判定为有效行保留 if any(cell is not None and str(cell).strip() != "" for cell in row): ws_processed.append(row) # 所有工作表处理完成后统一保存,输出文件名为原文件名加_Transformed后缀 output_path = Path(Excel_file_path) / f"{file.stem}_Transformed.xlsx" wb_processed.save(output_path) # 关闭工作簿释放内存 wb_original.close() wb_processed.close()
代码特性说明
- 全程不修改原始加载的Excel文件,所有处理结果写入全新文件,原始数据不会被改动
- 空行过滤覆盖全表范围:表头前空行、表中间空行、表尾空行都会被识别跳过
- 每个原文件对应独立的输出文件,不会出现不同文件内容互相覆盖的问题
- 单文件仅执行一次保存操作,避免频繁IO导致的文件损坏、内容缺失问题
- 内置完整空行判断逻辑,无需额外依赖自定义函数,不存在参数缺失、函数未定义问题
内容的提问来源于stack exchange,提问作者Data_is_Power
相关产品推荐
相关产品推荐

