質問: pd.DataFrame(np.zeros(300).reshape(20, 15)) clear_df.to_excel(exl_w, sheet_name="aaa", index=False, header=False) clear_df.to_excel(exl_w, sheet_name="bbb", index=False, header=False) clear_df.to_excel(exl_w, sheet_name="ccc", index=False, header=False) ``` ### 試したこと pandas 1.2.0の変更点などについて調査した。 ### 補足情報(FW/ツールのバージョンなど) python 3.7.4 numpy 1.21.0 openpyxl 3.0.7 pandas 1.2.0(1.1.5では動作する)
回答: 既存のxlsxファイルに、pandasからシートを追加する場合によく使われるやり方のようですが、 ドキュメントに書かれていない内部の属性を外から変更して対処しています。 pythonの場合、public/privateの区別がないため、オブジェクトの内部の属性を外から簡単に変更できてしまいます。 そのため、「こうやったらできるよ」的な情報として、内部の属性に手を加えるハックが見つかりますが、 今回のようにバージョンが変わると使えないということがあるので、注意が必要です。 ドキュメント化されていない部分(作者が外から触ってほしくないと思っている部分)なので、 内部設計が変わってそこに変更が入っても、変更点として公表されない場合が多いと思います。 既存のxlsxファイルに追加したいのならば、シンプルに mode='a' でやったらできないでしょうか? (参考にされているページにもmode='a'が使えるというコメントがあります) ``` with pd.ExcelWriter(dst, mode="a", engine="openpyxl") as exl_w: clear_df = pd.DataFrame(np.zeros(300).reshape(20, 15)) clear_df.to_excel(exl_w, sheet_name="aaa", index=False, header=False) clear_df.to_excel(exl_w, sheet_name="bbb", index=False, header=False) clear_df.to_excel(exl_w, sheet_name="ccc", index=False, header=False) ```