如何用Python拆分合并的Excel单元格?

时间:2017-12-18 16:15:10

标签: python excel python-3.x openpyxl

我试图仅拆分Excel文件(包含多个工作表)中的合并单元格,如:

Original sheets

请注意,部分/完全空行。这些行未合并。

使用openpyxl,我在每个工作表中找到了合并的单元格区域,其中包含以下代码:

wb2 = load_workbook('Example.xlsx')  
sheets = wb2.sheetnames  ##['Sheet1', 'Sheet2']
for i,sheet in enumerate(sheets):
    ws = wb2[sheets[i]]
    print(ws.merged_cell_ranges)   

打印输出:
['B3:B9', 'B13:B14', 'A3:A9', 'A13:A14', 'B20:B22', 'A20:A22']

['B5:B9', 'A12:A14', 'B12:B14', 'A17:A18', 'B17:B18', 'A27:A28', 'B27:B28', 'A20:A22', 'B20:B22', 'A3:A4', 'B3:B4', 'A5:A9']

由于我找到了合并的单元格范围,我需要拆分范围并填写相应的行,如下所示:

Desired Sheets

如何使用openpyxl进行拆分?我是新手使用这个模块。非常感谢任何反馈!

2 个答案:

答案 0 :(得分:1)

您需要使用unmerge功能。例如:

ws.unmerge_cells(start_row=2,start_column=1,end_row=2,end_column=4)

答案 1 :(得分:0)

当您使用unmerge_cells函数时,sheet.merged_cells.ranges将被修改,因此请勿在for循环中使用sheet.merged_cells.ranges。

from openpyxl.workbook import Workbook
from openpyxl import load_workbook
from openpyxl.utils.cell import range_boundaries

wb = load_workbook(filename = 'tmp.xlsx')

for st_name in wb.sheetnames:
    st = wb[st_name]
    mcr_coord_list = [mcr.coord for mcr in st.merged_cells.ranges]
    
    for mcr in mcr_coord_list:
        min_col, min_row, max_col, max_row = range_boundaries(mcr)
        top_left_cell_value = st.cell(row=min_row, column=min_col).value
        st.unmerge_cells(mcr)
        for row in st.iter_rows(min_col=min_col, min_row=min_row, max_col=max_col, max_row=max_row):
            for cell in row:
                cell.value = top_left_cell_value

wb.save('merged_tmp.xlsx')