Python读取excel删除空白行,python删除有空白单元格的行

  Python读取excel删除空白行,python删除有空白单元格的行

  1.前言

  由于近期有任务需要,要写一个能够处理超过的脚本,实现的功能是,在A表格上其中一列,对字符串进行分组和排序,然后根据排序好的A表格以固定格式自动填写到B表格上。

  开始写脚本之前查了很多资料,最开始采用了安装这个模块,用起来很顺手,使用这个对A表格其中一列进行了重新填写,但是后来发现,需要用到删除和插入空白行的操作,使用安装比较困难,这个模块仅支持在表格的最后一行继续添加新行,不支持在中间插入和删除行。

  在查找的过程中发现,网上流传了一些使用安装进行插入删除行的操作,现整理一下。

  2.使用安装

  一种思路是将表数据转换成列表,然后在目录进行操作,这种方法可行,但是实际测试之后发现运行起来速度太慢了,数据1000多条,时间就已经等不起了。

  #创造插入行函数组-

  def blankRowInsert(sheet,row_num,add_num):

  myList=Sheet2List(工作表)

  插入线(我的列表,行数,添加数,工作表最大列数)

  列表2工作表(工作表,我的列表)

  定义表2列表(表):

  # 把一个表格中的数据全部导出到一个列表

  listResult=[]

  对于范围内的I(1,sheet.max_row 1):

  lineData=[]

  对于范围内的j(1,sheet.max_column 1):

  cell=sheet.cell(row=i,column=j)

  lineData.append(cell.value)

  listResult.append(lineData)

  返回列表结果

  定义插入行(list,row_num,add_num,maxColumn):

  # 对列表进行添加操作操作

  对于_在范围(1,add_num 1):

  # []*N是创建一个个数为普通的空格列表,插入列表列表

  List.insert(row_num,[] * maxColumn)

  定义列表2工作表(工作表,列表):

  # 把数据写回表

  对于I在范围内(1,len(list) 1):

  对于范围(1,len(list[0]) 1中的j:

  cell=sheet.cell(row=i,column=j)

  cell.value=list[i-1][j-1]

  #插入行函数组的结尾-

  另外一种思路是直接自己给安装这个轮子补胎,添加一个新的方法,笔者没有试验,下面的代码是栈溢出相关问题上面贴的,如果各位有兴趣可以自己尝试。

  def insert_rows(self,row_idx,cnt,above=False,copy_style=True,fill _ formulae=True):

   在工作表中指定的行索引处插入新(空)行。

  :param row_idx:指定新行插入位置的行索引。

  :参数计数:要插入的行数。

  :以上参数:设置真实的以在指定的行索引上方插入行。

  :参数copy_style:如果新行应复制直接位于行上方的样式,请设置没错。

  :参数填充_公式:如果新行应采用直接位于该行上方的公式,并使用对行的新引用进行填充,则设置为没错。

  用法:

  * insert_rows(2,10,above=True,copy_style=False)

  CELL_RE=re.compile((?P

  \$?【A-Z】)(?P\$?\ d))row _ idx=row _ idx-1 if above else row _ idx

  定义替换(m):

  row=m.group(row )

  前缀=$ if row.find($ )!=-1 else

  row=int(row.replace($ ,))

  row=cnt if row row _ idx else 0

  返回m . group(“col”)前缀字符串(行)

  #首先,我们将所有单元格下移(cannot)不能行.

  old_cells=set()

  old_fas=set()

  new_cells=dict()

  new_fas=dict()

  对于自我中的丙._cells.values():

  旧颜色=c坐标

  #将所有引用移动到row_idx下面的任何位置

  if c.data_type==Cell .类型_公式:

  c.value=CELL _ RE.sub(

  替换,

  c。价值

  )

  #这里,我们需要正确地更新公式引用以反映新的行索引

  如果自己老了。formula _ attributes和 ref in self。公式_属性[old _ coor]:

  自我。formula _ attributes[old _ coor][ ref ]=CELL _ re。sub(

  替换,

  自我。formula _ attributes[old _ coor][ ref ]

  )

  #变魔术设置我们的实际班次

  if c.row row_idx:

  旧颜色=c坐标

  old_cells.add((c.row,c.col_idx))

  c.row=cnt

  new_cells[(c.row,c.col_idx)]=c

  如果自己老了。公式_属性:

  旧_fas.add(旧_颜色)

  fa=自我。公式属性[旧颜色].复制()

  new_fas[c坐标]=fa

  对于旧单元格中的颜色:

  德尔赛尔夫。_单元格[颜色]

  自我. cells.update(新单元格)

  对于旧federation of american scientists 美国科学家联合会中的fa:

  del self.formula_attributes[fa]

  自我。公式_属性。更新(新Fas)

  #接下来,我们需要将新行下面的所有行维度下移(cannot)不能.

  对于范围内的行(len(self.row_dimensions)-1 cnt,row_idx cnt,-1):

  new _ rd=复制。复制(自我。row _ dimensions[行计数])

  new_rd.index=row

  自我。row _ dimensions[row]=new _ rd

  德尔赛尔夫。行维度[行计数]

  #现在,用所有漂亮的单元格创建我们的新行

  row_idx=1

  对于范围内的行(row_idx,row_idx cnt):

  #为新行创建行维度

  new _ rd=复制。复制(自我。row _ dimensions[row-1])

  new_rd.index=row

  自我。row _ dimensions[row]=new _ rd

  对于范围内的列(1,self.max_column):

  col=get _ colum _ letter(col)

  cell=self.cell(%s%d%(列,行))

  单元格.值=无

  source=self.cell(%s%d%(列,行-1))

  if copy_style:

  单元格.数字_格式=源。数字格式

  cell.font=source.font.copy()

  细胞。对齐=源。对齐。复制()

  cell.border=source.border.copy()

  cell.fill=source.fill.copy()

  if fill _公式和来源。数据类型==单元格.类型_公式:

  s_coor=源。坐标

  如果颜色在自我.公式_属性中,而参考不在自我。公式_属性[颜色]中:

  fa=自我。公式属性.复制()

  自我。formula _ attributes[单元格。坐标]=fa

  #打印(将公式从单元格%s%d复制到% s % d“%(列,行-1,列,行))

  细胞。value=re \

  (\$?[A-Z]{1,3}\$?)% d“%(第一行),

  m:m . group(1)str(row),

  来源。价值

  )

  cell.data_type=单元格。类型_公式

  #检查需要扩展以包含新单元格的合并单元格区域

  对于cr_idx,Cr in enumerate(self。merged _ cell _ ranges):

  自我。merged _ CELL _ ranges[Cr _ idx]=CELL _ re _ sub(

  替换,

  铬

  )

  #使用方式:

  #工作表。插入行=插入行

  3.使用xlwings

  进行一些列尝试和折腾之后,笔者放弃了使用安装操作超过插入和删除行了,到网上寻觅,发现了xlwings这个轮子,说明里写有美国石油学会(美国石油协会)能够调用使用的函数,这就很炫酷了,然后翻了翻文档,决定使用这个轮子操作,现贴出来笔者写的几段代码作为使用方法示范。

  3.1.删除行:range.api.EntireRow.Delete()

  #删除原始行

  temp_del=0

  如果len(delete_list) 0:

  对于删除列表中的删除行:

  #报告时间表

  打印(已经完成: \

  str((temp _ del * 100)//delete _ num) % )

  #删除一行

  WB _ sheet。range( A str(delete _ row-temp _ del))。API。整行。删除()

  临时_删除=临时_删除一

  wb.save()

  上面这段代码使用了一些小技巧,删除列表储存的是原表格中,需要删除的行号,在删除过程中由于总行数也在跟着减少,所以需要把绝对行号转成相对行号进行标记删除,这个转换就是临时_删除变量的使用目的。

  3.2.插入行:sheet.api.Rows(row_number).插入()

  if key _ word==sheet。范围( A 字符串(I _ row 1)).价值:

  #插入新行

  sheet.api.Rows(i_row 2).插入()

  需要注意的是,这个使用函数是向上插入空行,并且xlwings这个轮子只能在窗子和苹果的系统下使用,暂时不支持Linux操作系统操作系统。不过xlwings运行速度要远超过openpyxl,而且还能直接调用使用的函数,对于文字处理系统和超过都能兼容,综合来看,还是选择xlwings比较好一些。

  以上这篇计算机编程语言操作超过插入删除行的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: