【删除含有合并单元格的excel某列】

删除含有合并单元格的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])

最终结果仅将“区县”这一列删除,其他单元格任何属性都没有影响。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值