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

用Python处理Excel提取3列后出现异常,求数据规整解决方案

问题描述

我编写了一段Python程序用于打开Excel文件并提取其中3列数据,但运行后结果不符合预期。处理后的Excel文件出现无内容的行,点击合并单元格后数据才会显示,我想要的是规整的三列数据。代码如下:

from tkinter import * 
from tkinter.ttk import *
from tkinter.filedialog import askopenfile
import openpyxl

excel_file = openpyxl.load_workbook('EX (5).xlsx')

excel_sheet = excel_file['Recovered_Sheet1']
# delete row
excel_sheet.delete_rows(idx=1, amount=12)
# delete column 
excel_sheet.delete_cols(idx=1, amount=2)
excel_sheet.delete_cols(idx=2, amount=2)
excel_sheet.delete_cols(idx=3, amount=1)
excel_sheet.delete_cols(idx=4, amount=4)

sh = excel_file.active
for row in range(1,300):
    if (sh.cell(row=row,column=2).value) == None:
        sh.delete_rows(idx=row)
    if (sh.cell(row=row,column=1).value) == "Total:":
        sh.delete_rows(idx=row)

# to save the file
excel_file.save('Edited.xlsx')
问题原因
  1. 合并单元格数据存储特性:openpyxl中合并单元格的数据仅保存在合并区域的左上角单元格,其余单元格值为None。删除行列后,原合并结构被打乱,导致数据看似隐藏,点击合并单元格才会显示。
  2. 正序删除行的索引错位:从前往后循环删除行时,删除某一行后,后续行会自动上移,导致部分行跳过检查,无法被正确删除。
解决方案

完整修改代码

from tkinter import * 
from tkinter.ttk import *
from tkinter.filedialog import askopenfile
import openpyxl

excel_file = openpyxl.load_workbook('EX (5).xlsx')
excel_sheet = excel_file['Recovered_Sheet1']

# 1. 处理合并单元格:填充所有合并单元格的值并解除合并
merged_cells = list(excel_sheet.merged_cells.ranges)
for merged_range in merged_cells:
    # 获取合并区域左上角的值
    top_left_value = excel_sheet.cell(row=merged_range.min_row, column=merged_range.min_col).value
    # 给合并区域内所有单元格赋值
    for row in range(merged_range.min_row, merged_range.max_row + 1):
        for col in range(merged_range.min_col, merged_range.max_col + 1):
            excel_sheet.cell(row=row, column=col).value = top_left_value
# 解除所有合并单元格
excel_sheet.merged_cells.ranges = []

# 2. 删除指定行和列
excel_sheet.delete_rows(idx=1, amount=12)
excel_sheet.delete_cols(idx=1, amount=2)
excel_sheet.delete_cols(idx=2, amount=2)
excel_sheet.delete_cols(idx=3, amount=1)
excel_sheet.delete_cols(idx=4, amount=4)

# 3. 倒序删除空行和Total行,避免索引错位
sh = excel_file.active
max_row = sh.max_row
for row in range(max_row, 0, -1):
    col2_value = sh.cell(row=row, column=2).value
    col1_value = sh.cell(row=row, column=1).value
    if col2_value is None or col1_value == "Total:":
        sh.delete_rows(idx=row)

# 保存文件
excel_file.save('Edited.xlsx')

关键修改说明

  • 合并单元格预处理:先遍历所有合并单元格,将左上角的值填充到合并区域的每个单元格,再解除合并,确保数据不会因结构变化被隐藏。
  • 倒序删除行:从最后一行往前遍历删除,避免删除行后索引错位,保证所有符合条件的行都能被检查并删除。

内容的提问来源于stack exchange,提问作者Va SA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:06:25