In python removing rows from a excel file using xlrd, xlwt, and xlutils

只愿长相守 提交于 2019-12-01 09:03:25

问题


Hello everyone and thank you in advance.

I have a python script where I am opening a template excel file, adding data (while preserving the style) and saving again. I would like to be able to remove rows that I did not edit before saving out the new xls file. My template xls file has a footer so I want to delete the extra rows before the footer.

Here is how I am loading the xls template:

self.inBook = xlrd.open_workbook(file_path, formatting_info=True)
self.outBook = xlutils.copy.copy(self.inBook)
self.outBookCopy = xlutils.copy.copy(self.inBook)

I then write the info to outBook while grabbing the style from outBookCopy and applying it to each row that I modify in outbook.

so how do I delete rows from outBook before writing it? Thanks everyone!


回答1:


I achieved using Pandas package....

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)



回答2:


xlwt does not provide a simple interface for doing this, but I've had success with a somewhat similar problem (inserting multiple copies of a row into a copied workbook) by directly changing the worksheet's rows attribute and the row numbers on the row and cell objects.

Given the number of rows you want to delete and the starting number of the first row you want to keep, something like this might work:

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:]

Do you have merged ranges in the rows you want to delete, or below them? If so you'll also need to run through the worksheet's merged_ranges attribute and update the rows for them. Also, if you have more rows to delete than rows in your footer, you'll need to

As a side note - I was able to write text to my worksheet and preserve the predefined style thus:

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)

That might let you skip having two copies of your spreadsheet open at once.



来源:https://stackoverflow.com/questions/16616563/in-python-removing-rows-from-a-excel-file-using-xlrd-xlwt-and-xlutils

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!