2013-02-15 12 views
7

Excel(xlsx)スプレッドシートの「縮小」バージョンを作成したいと考えています(つまり、いくつかの基準に従っていくつかの行を削除しています)。openpyxlでこれを実行できるかどうかを知りたいと思います。openpyxlで行を削除するには?

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で行うことができ、そうであれば、どのように:

(pythonish)擬似コードで

は、私がやりたいようになりますか?

答えて

1

内部でopenpyxlは「行」の概念を持たないようで、セルで動作し、次元を追跡します。Worksheet.rowsを使用すると、そのセルから2D配列が計算されます。配列を変更することはできますが、ワークシートは変更されません。

ワークシート内でこれを実行する場合は、値を元の位置から新しい位置にコピーし、不要なセルの値を''またはNoneに設定し、Worksheet.garbage_collect()にコールする必要があります。

データセットが小さく、均一な性質(すべての文字列など)の場合は、関連するセル(コンテンツ)を新しいワークシートにコピーし、古いものを削除し、新しいセルのタイトルをちょうど削除されたもののタイトル。

IMHOは、Worksheetまたはサブクラスdelete_rowsの方法を拡張することです。私はその場所のそのCellの座標を変更することによってそのような方法を実装します。しかし、openpyxl内部が変更された場合、これが破損する可能性があります。

+0

セルの値を ''またはNoneに設定しても、セルの値は削除されず、行全体が削除されます。 – Cerin

+2

しかし、 'garbage_collect'を呼び出すと、末尾の空の行が削除されます。 –

関連する問題