簡體   English   中英

在python中使用xlrd、xlwt和xlutils從excel文件中刪除行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM