17

Excel(xlsx)スプレッドシートの「縮小」バージョンを作成したいのですが(つまり、何らかの基準に従っていくつかの行を削除することによって)、これがで実行できるかどうかを知りたいの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、で行うことができますか?もしそうなら、どのように?

4

2 に答える 2

15

2018 更新: 今日、行を削除する方法を検索していたところ、openpyxl 2.5.0-b2 で機能が追加されていることがわかりました。試してみただけで、完全に機能しました。答えを見つけたリンクは次のとおりです: https://bitbucket.org/openpyxl/openpyxl/issues/964/delete_rows-does-not-work-on-deleting

そして、1行を削除する構文は次のとおりです。

ws.delete_rows(index, 1)

ここで、'ws' はワークシート、'index' は行番号、'1' は削除する行数です。

列を削除する機能もありますが、試したことはありません。

于 2018-03-19T18:41:39.943 に答える
3

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

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

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

私見ですが、最も洗練された方法Worksheetは、メソッドを使用して拡張またはサブクラスを作成するdelete_rowsことです。その s の座標をそのCell場で変更することにより、そのようなメソッドを実装します。openpyxlしかし、内部が変更されると、これは壊れる可能性があります。

于 2013-03-19T07:29:59.440 に答える