删除含有合并单元格的excel某列:
提示:这里简述项目相关背景:
项目场景:昨天帮朋友忙,需求是删除excel的某一列,而该列被包含在合并单元格中。
我以为弄个dataframe多简单的事情,没想到啊,还是经验少
问题描述
提示:这里描述项目中遇到的问题:
例如:使用pandas读成dataframe再删除时,发现因为删除的列中的某几行是合并单元格的状态,导致结果不符合期望结果。因为使用的是dataframe,输出为新的excel文件时,单元格字体、大小等属性都和原本的excel表格不一致。
cols=[x for i,x in enumerate(df.columns) if df.iat[0,i]=='区县']
df_1=df.drop(cols,axis=1)
如图为删除前
如图为删除后,单元格框线都没了,很多数据也丢失了,刚开始的时候每一个合并的单元格都会被拆分然后填充合并时的内容。这是已经经过几次修改后的情况,还是不行。
原因分析:
提示:合并单元格时还是合并的原来的行列位置,我们已经删除了一列,那么所有列坐标在这一列之后的单元格都要往前移一列。若删除n列,就要往前移n列:
解决方案:
提示:使用openpyxl来操作excel,这样还不会更改单元格字体、大小等属性。先找出excel中所有合并单元格信息,再拆分,删除列后,再将这些单元格合并,但合并时要注意坐标要改变了。
# 这里是引用的模块
from copy import deepcopy
import openpyxl
import os
import warnings
warnings.filterwarnings('ignore')
#将所有合并单元格信息放入list
m_list = ws.merged_cells
# print(m_list)
cr = []
for m_area in m_list:
r1, r2, c1, c2 = m_area.min_row, m_area.max_row, m_area.min_col, m_area.max_col
cr.append((r1, r2, c1, c2))
# 找某个特定值所在的列索引
for row in ws.iter_rows(min_row=1, max_row=100, min_col=1, max_col=8):
for cell in row:
if cell.value == '区县':
val = cell.coordinate
a = cell.column
# print('即将删除'+val+'所在列')
# 先拆分,后删列
merge_cr = deepcopy(cr)
for r in cr:
ws.unmerge_cells(start_row=r[0], end_row=r[1], start_column=r[2], end_column=r[3])
ws.delete_cols(a)
# 合并已拆分得单元格,可根据实际情况,控制合并单元格坐标,这里仅删除了一列
for r in merge_cr:
if a < r[3] and r[2] - 1 > 1:
ws.merge_cells(start_row=r[0], end_row=r[1], start_column=r[2] - 1, end_column=r[3] - 1)
elif a < r[3] and r[2] - 1 < 1:
ws.merge_cells(start_row=r[0], end_row=r[1], start_column=r[2], end_column=r[3] - 1)
elif r[2] < a and r[3] < a:
ws.merge_cells(start_row=r[0], end_row=r[1], start_column=r[2], end_column=r[3])
最终结果仅将“区县”这一列删除,其他单元格任何属性都没有影响。