![](/img/trans.png)
[英]How to delete an existing worksheet in excel file using xlutils, xlwt, xlrd with python
[英]In python removing rows from a excel file using xlrd, xlwt, and xlutils
大家好,提前謝謝你。
我有一個 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 中刪除行? 感謝大家!
我使用 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)
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:]
您是否在要刪除的行中或在它們下方合並了范圍? 如果是這樣,您還需要運行工作表的 merge_ranges 屬性並更新它們的行。 此外,如果要刪除的行數多於頁腳中的行數,則需要
作為旁注 - 我能夠將文本寫入我的工作表並因此保留預定義的樣式:
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)
這可能會讓您跳過同時打開電子表格的兩個副本。
對於我們這些仍然堅持使用xlrd
/ xlwt
/ xlutils
,這里有一個您可以使用的過濾器:
from xlutils.filter import BaseFilter
class RowFilter(BaseFilter):
rows_to_exclude: "Iterable[int]"
_next_output_row: int
def __init__(
self,
rows_to_exclude: "Iterable[int]",
):
self.rows_to_exclude = rows_to_exclude
self._next_output_row = -1
def _should_include_row(self, rdrowx):
return rdrowx not in self.rows_to_exclude
def row(self, rdrowx, wtrowx):
if self._should_include_row(rdrowx):
# Proceed with writing out the row to the output file
self._next_output_row += 1
self.next.row(
rdrowx, self._next_output_row,
)
# After `row()` has been called, `cell()` is called for each cell of the row
def cell(self, rdrowx, rdcolx, wtrowx, wtcolx):
if self._should_include_row(rdrowx):
self.next.cell(
rdrowx, rdcolx, self._next_output_row, wtcolx,
)
然后將其與例如一起使用:
from xlrd import open_workbook
from xlutils.filter import DirectoryWriter, XLRDReader
xlutils.filter.process(
XLRDReader(open_workbook("input_filename.xls", "output_filename.xls")),
RowFilter([3, 4, 5]),
DirectoryWriter("output_dir"),
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.