質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

8473閲覧

【openpyxl】行を書式ごと削除する方法について

ikayarou

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/05/09 07:46

編集2019/05/09 08:18

前提・実現したいこと

openpyxlで操作しているシートの行削除を行いたいです。
(=マウスでエクセルの行を右クリックし、削除を実行するのと同じ動作。)

発生している問題

delete_rowsを使用して、行の値は削除できているのですが
書式が残ってしまいます。
delete_rowsの結果、削除対象とは異なる書式のセルが上詰めされると
体裁が崩れてしまいます。

どうか、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

magichan

2019/05/09 09:52 編集

『削除対象とは異なる書式のセルが上詰めされると体裁が崩れてしまいます』 は 『セルが結合されている箇所が崩れる』 という認識で合ってますか?それとも結合されていなくても崩れるのでしょうか?
ikayarou

2019/05/10 00:39

> magichanさん 『セルが結合されている箇所が崩れる』という認識で合っております。 セル結合されていないセルは、上詰めされても問題ないように見えます。
guest

回答2

0

質問への回答ありがとうございます。
「セル結合している箇所で崩れる」とのことですので、こちらの回答を参考にしてみてはいかがでしょうか。

https://stackoverflow.com/questions/54682506/openpyxl-in-python-delete-rows-function-breaks-the-merged-cell

私の環境では、この回答の delete_row_with_merged_ranges関数 にて不具合が改善されたのを確認できました。

投稿2019/05/10 00:47

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikayarou

2019/05/10 04:28

ご回答いただき、ありがとうございます。 リンク先の関数を試したところ、削除対象の行に結合されたセルが含まれていなければ、 正常に動作することは確認いたしました。 後出しになってしまい申し訳ないのですが、行の高さまでは変わらないみたいですね。 私としては、結合されたセルが含まれている行に対しても同様の処理を実行したいため、 これを参考にがんばってみます。
ikayarou

2019/05/10 06:53 編集

リンク先の関数にセル結合解除の処理を入れて、私のやりたいことは実現できました。 行の高さに関してはどうにかなると思っていますので、クローズします。 ありがとうございました。 ※このコメント欄にコードを載せたら書式が崩れたため、自己解決の方に記載します。
guest

0

自己解決

  • いただいた情報を基に書いた関数

Python

1def delete_row_with_merged_ranges(sheet, idx): 2 begin_col, end_col = [], [] 3 # 削除対象行の結合セルの列情報を取得 4 for n in sheet.merged_cells: 5 if (n.min_row == idx and n.max_row == idx): 6 begin_col.append(n.min_col) 7 end_col.append(n.max_col) 8 # 削除対象行のセル結合を解除 9 for n in range(0, len(begin_col), 1): 10 sheet.unmerge_cells( 11 start_row=idx, 12 start_column=begin_col[n], 13 end_row=idx, 14 end_column=end_col[n] 15 ) 16 sheet.delete_rows(idx) 17 for mcr in sheet.merged_cells: 18 if idx < mcr.min_row: 19 mcr.shift(row_shift=-1) 20 elif idx <= mcr.max_row: 21 mcr.shrink(bottom=1)

投稿2019/05/10 06:23

ikayarou

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問