在python中,使用xlrd、xlwt和xlutils从excel文件中删除行

在python中,使用xlrd、xlwt和xlutils从excel文件中删除行,python,xls,xlrd,xlwt,xlutils,Python,Xls,Xlrd,Xlwt,Xlutils,大家好,提前谢谢大家 我有一个python脚本,打开一个模板excel文件,添加数据(同时保留样式)并再次保存。我希望能够删除在保存新xls文件之前未编辑的行。我的模板xls文件有一个页脚,因此我想删除页脚之前的额外行 以下是我加载xls模板的方式: self.inBook = xlrd.open_workbook(file_path, formatting_info=True) self.outBook = xlutils.copy.copy(self.inBook) self.outBook

大家好,提前谢谢大家

我有一个python脚本,打开一个模板excel文件,添加数据(同时保留样式)并再次保存。我希望能够删除在保存新xls文件之前未编辑的行。我的模板xls文件有一个页脚,因此我想删除页脚之前的额外行

以下是我加载xls模板的方式:

self.inBook = xlrd.open_workbook(file_path, formatting_info=True)
self.outBook = xlutils.copy.copy(self.inBook)
self.outBookCopy = xlutils.copy.copy(self.inBook)
然后,我将信息写入outBook,同时从outBookCopy中获取样式并将其应用于我在outBook中修改的每一行


那么,如何在编写outBook之前从outBook中删除行呢?谢谢大家

xlwt没有提供一个简单的界面来实现这一点,但我成功地解决了一个类似的问题(将一行的多个副本插入到复制的工作簿中),方法是直接更改工作表的“行”属性以及行和单元格对象上的行号

给定要删除的行数和要保留的第一行的起始行数,类似的操作可能会起作用:

rows_to_move = worksheet.rows[first_kept_row:]
for row in rows_to_move:
    new_row_number = row._Row__idx - number_to_delete
    row._Row__idx = new_row_number
    for cell in row._Row__cells.values():
        if cell:
            cell.rowx = new_row_number
    worksheet.rows[new_row_number] = row
# now delete any remaining rows
del worksheet.rows[new_row_number + 1:]
是否在要删除的行中或其下方有合并的范围?如果是这样,您还需要运行工作表的“合并范围”属性,并更新它们的行。此外,如果要删除的行数多于页脚中的行数,则需要

作为旁注-我能够将文本写入工作表并保留预定义的样式,因此:

def write_with_style(ws, row, col, value):
    if ws.rows[row]._Row__cells[col]:
        old_xf_idx = ws.rows[row]._Row__cells[col].xf_idx
        ws.write(row, col, value)
        ws.rows[row]._Row__cells[col].xf_idx = old_xf_idx
    else:
        ws.write(row, col, value)

这可能会让您避免同时打开两份电子表格。

我使用Pandas软件包实现了

import pandas as pd

#Read from Excel
xl= pd.ExcelFile("test.xls")

#Parsing Excel Sheet to DataFrame
dfs = xl.parse(xl.sheet_names[0])

#Update DataFrame as per requirement
#(Here Removing the row from DataFrame having blank value in "Name" column)

dfs = dfs[dfs['Name'] != '']

#Updating the excel sheet with the updated DataFrame

dfs.to_excel("test.xls",sheet_name='Sheet1',index=False)

对于那些仍然坚持使用
xlrd
/
xlwt
/
xlutils
的人,这里有一个您可以使用的:

从xlutils.filter导入BaseFilter
类RowFilter(基本筛选器):
行到排除:“Iterable[int]”
_下一个输出行:int
定义初始化__(
自己
行_至_排除:“Iterable[int]”,
):
self.rows_to_exclude=rows_to_exclude
self.\u next\u output\u row=-1
定义应包括行(self,rdrowx):
将rdrowx不在self.rows\u中返回到\u exclude
def行(self、rdrowx、wtrowx):
如果是self.\u应包括第行(rdrowx):
#继续将该行写入输出文件
self.\u next\u output\u row+=1
self.next.row(
rdrowx,self.\u下一个\u输出\u行,
)
#在调用'row()'之后,将为该行的每个单元格调用'cell()'
def单元(自身、rdrowx、rdcolx、wtrowx、wtcolx):
如果是self.\u应包括第行(rdrowx):
self.next.cell(
rdrowx,rdcolx,self.\u下一个\u输出\u行,wtcolx,
)
然后将其与例如:

从xlrd导入打开的\u工作簿
从xlutils.filter导入DirectoryWriter,XLRDReader
xlutils.filter.process(
XLRDReader(打开工作簿(“输入文件名.xls”、“输出文件名.xls”),
行筛选器([3,4,5]),
DirectoryWriter(“输出目录”),
)