前言


当打开一个Excel工作簿的时候,并不是每一个表都是几行几列的标准形式,譬如它可能出现这样的形式:也就是包含合并单元格的数据,如果以这种表格形式去做接下来的数据处理一定会遇到很多问题。

python读取合并单元格数据 python 单元格合并_python读取合并单元格数据

0 1

拆分合并单元格

对于如何拆分合并单元格,首先搞清楚一个问题合并单元格到底是什么?或者说它是如何储存数据的。用pandas库直接读取,答案就会很清晰。

import pandas as pddata = pd.read_excel(r"C:\Users\Administrator\Desktop\合并单元格.xlsx")print(data)

python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_02


python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_03

从上面结果很清晰的显示出,无论怎么合并单元格,数据永远储存在合并单元格区域内的最左上角,而其他单元格都是空值。我们再用openpyxl库写成列表的形式再看一遍。

import openpyxl as opwb = op.load_workbook(r"C:\Users\Administrator\Desktop\合并单元格.xlsx")ws = wb.worksheets[0]for rows in list(ws.rows): data2 = [r.value for r in row] print(data2)

python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_04


python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_03

然后再用Excel本身的友好提醒来看下,根据提醒不难发现不同的数据是不能轻易合并,否则会丢失数据。那么现在的问题就变成了如何将空值解决掉,将表格变成常见的形式。

python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_06


python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_03

这一点pandas提供了很好的支撑,可以使用fillna方法把缺失值重新编码为其他值,可以选择前置填充(fill forward)或后值填充(fill backward),前值填充时,将按照前一个值填充缺失值。而按照后一个值填充则为后置填充。本例中选择前置填充来试下效果。(最后一列为全部空值,暂不取。)

import pandas as pddata = pd.read_excel(r"C:\Users\Administrator\Desktop\合并单元格.xlsx")print(data.fillna(method = "ffill").iloc[0:8,0:4])

python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_08

这样的表格再进行后面处理就方便许多。


0 2

合并单元格

前言

当解决了拆分的单元表格,假设处理完成后又想将表格某一部分合并又该如何办呢?很遗憾pandas并未给出很好的解决方案。pandas能做的合并拆分仅限为索引。如果真想实现过程过于复杂,这不是我们想要的。这时候openpyxl库则给出了一个很好的答案:merge_cells方法。

根据下面的结果可以看出,它实施合并的机制和Excel是一模一样的,并没有什么不同。你要确定自己合并的数值,确定的值在你要合并单元格区域内的左上角即可。

import openpyxl as opwb = op.load_workbook(r"C:\Users\Administrator\Desktop\合并单元格.xlsx")ws = wb.worksheets[0]ws.merge_cells('B2:C3')wb.save(r"C:\Users\Administrator\Desktop\合并单元格.xlsx")

python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_09

python读取合并单元格数据 python 单元格合并_python读取合并单元格数据_10

end