用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')
问题原因
- 合并单元格数据存储特性:openpyxl中合并单元格的数据仅保存在合并区域的左上角单元格,其余单元格值为
None。删除行列后,原合并结构被打乱,导致数据看似隐藏,点击合并单元格才会显示。 - 正序删除行的索引错位:从前往后循环删除行时,删除某一行后,后续行会自动上移,导致部分行跳过检查,无法被正确删除。
解决方案
完整修改代码
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
相关产品推荐
相关产品推荐

