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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:03:32