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

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

新規登録して質問してみよう
ただいま回答率
85.35%
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

8460閲覧

openpyxlでExcelシートの削除方法(警告メッセージを出さないようにする方法)

nmty

総合スコア19

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/12 01:23

編集2021/11/12 06:25

Pythonでopenpyxlを使用し、Excelのブックの数シートを削除(removeメソッド)し、
保存後、再度開くと、

○○○.xlsxの一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は「はい」をクリックしてください。

との表示あり、

はい、を選択すると、

読み取れなかった内容を修復または削除することにより、ファイルを開くことができました。[削除されたレコード: /xl/workbook.xml パーツ内の名前付き範囲 (ブック)]

との表示が出ています。

Excelのブックは削除したシートはちゃんと削除されて確認もできたのですが、
上記のような警告メッセージが表示されないようにしたいのですが解決方法が
わからず質問させていただきました。


参考:

異なる言語で同じような現象の記事を拝見しましたが、
Pythonでの解決方法を知りたく思います。
https://social.msdn.microsoft.com/Forums/ja-JP/9ddd9862-7dcb-47b2-985e-6a11b4a10a74/openxml12391sheet21066385002446012289125011244912452125231243438283?forum=vbgeneralja



特定のシート以外を削除し、保存するコード

Python

1counter = 1 2 3# Excelを読み込む 4wb = openpyxl.load_workbook(excel_path) #追記:excel_path(storage/xxx/old.xlsx) 5 6# 3番目のシート以外削除 7for ws in wb.worksheets: 8 if not counter == 3: 9  wb.remove(wb[ws.title]) 10 counter +=1 11 else: 12 counter +=1 13# タイトルを変更する 14ws.title = "新しいシート" 15# 保存する 16wb.save(storage/xxx/new.xlsx) #追記:storage/xxx/new.xlsx で保存

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

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

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

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

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

guest

回答2

0

読み込んだExcelの拡張子と保存の時した拡張子は何でしょうか。

投稿2021/11/12 01:45

ekTJ

総合スコア109

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

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

nmty

2021/11/12 01:55

どちらも".xlsx"です。
ekTJ

2021/11/12 02:08

確認して頂きたいのですが、読み込むxlsxのファイルに入力規則など設定していないでしょうか。
nmty

2021/11/12 03:44

読み込むxlsxのファイルは全シートに入力規則の項目があります。(削除したシートにも、残したシートにもあります。)入力規則があるシートがあるExcellブックは削除すると警告が出るのでしょうか? やりたいことは、10シートほどあるExcelのブック(入力規則あり)の特定の1シートだけ別名で保存することです。1シートだけ別名のExcel保存する方法がわからず、現在は特定のシート以外を削除しています。
ekTJ

2021/11/12 04:14

コードが無いので何とも言えませんが・・・ シートを別名にしたいだけでしたら下記のような方法でも可能です。 # シートを取得 sheet = book['Sheet'] # シート名を変更 Sheet → シート1 sheet.title = 'シート1'
nmty

2021/11/12 05:12

すみません、ご丁寧にありがとうございます。コードを添付いたしました。 シート名の変更というよりは、1シートだけ残して、Execlファイルを保存したく思います。 例: 変更前:old_EXCEL.xlsx(Sheet1,Sheet2,Sheet3) 変更後:new_EXCEL.xlsx(Sheet2_new) のようなイメージです。
ekTJ

2021/11/12 05:36

でしたらその方法で問題ないかと思います。 wb = openpyxl.load_workbook(excel_path,keep_vba=True) の部分を変更してみてはいかがでしょうか。
nmty

2021/11/12 06:35

ありがとうございます。keep_vba=Trueを記載して上記のエラーは解消しましたが、 新しく、「~.xlsxを開くことができません。ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。」と表示されました。 さきほど添付したソースコードに少し記載漏れがあったのですが、保存する時に、Excelのファイル名も変更してsaveしているのですが、こちらが原因でしょうか?
ekTJ

2021/11/12 06:43

フルパスで指定はいかがでしょうか。 例.wb.save("C:\Users\ユーザー名\Desktop\test.xlsx")などで試してみてはいかがでしょう
nmty

2021/11/12 08:17

フルパスでも同様のエラーが発生しました。 keep_vba=True、の記載で当初のエラーは解決されましたが、 新しく発生したエラーの調査をもう少し進めます。
nmty

2021/11/15 01:43

ちなみに、名前付き範囲、というものをopenpyxlなど削除する方法等はあるのでしょうか? 初めに出力されたエラーにそのような表示があり、また参考のリンクでは、Sheetの削除と”WorksheetPart”(名前付き範囲?)の削除の記述があり、この辺りが本件のエラーに関連している可能性もありそうです。
guest

0

自己解決

名前付き範囲を以下のように削除(clear)するとエラー解消されました。

python

1wb.defined_names.definedName.clear()

投稿2021/11/18 00:49

nmty

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問