2013-02-15 4 views
7

Я хотел бы создать «уменьшенную» версию таблицы Excel (xlsx) (т. Е. Удалив некоторые строки в соответствии с некоторым критерием), и я хотел бы знать, можно ли это сделать с помощью openpyxl.Как удалить строки с помощью openpyxl?

В (pythonish) псевдо-код, что я хочу сделать, будет выглядеть примерно так:

wb = openpyxl.reader.excel.load_workbook('/path/to/workbook.xlsx') 
sh = wb.get_sheet_by_name('someworksheet') 

# weed out the rows of sh according to somecriterion 
sh.rows[:] = [r for r in sh.rows if somecriterion(r)] 

# save the workbook, with the weeded-out sheet 
wb.save('/path/to/workbook_reduced.xlsx') 

Может что-то подобное можно сделать с openpyxl, и если да, то каким образом?

ответ

1

Внутренне openpyxl, похоже, не имеет понятия «строки», он работает с ячейками и отслеживает размеры, и если вы используете Worksheet.rows, он вычисляет 2D-массив ячеек из этого. Вы можете мутировать массив, но он не меняет рабочий лист.

Если вы хотите сделать это в пределах рабочего листа, вам необходимо скопировать значения из старого положения в новое положение, и установите значение ячеек, которые больше не нужны для '' или None и вызвать Worksheet.garbage_collect().

Если ваш набор данных мал и имеет единообразную природу (например, все строки), возможно, вам лучше скопировать соответствующую ячейку (содержимое) на новый рабочий лист, удалить старый и установить заголовок нового на название только что удаленной.

Самое элегантное, что нужно сделать, ИМХО, было бы расширить Worksheet или подкласс с delete_rows. Я бы применил такой метод, изменив координаты своих Cell s на месте. Но это может сломаться, если меняются внутренние элементы openpyxl.

+0

Установка значений ячейки в '' или None не удаляет их, а тем более всю строку. – Cerin

+2

Но вызов 'garbage_collect' удалит оставшиеся пустые строки. –

Смежные вопросы