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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

openpyxl

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

Python

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

Q&A

解決済

1回答

2011閲覧

Python、同一Excelファイル・複数シートへの書き込み

kgnmakl

総合スコア12

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

openpyxl

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

Python

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

0グッド

1クリップ

投稿2022/12/15 09:31

編集2022/12/19 16:46

前提

Python を用いて業務改善に取り組んでいます。

実現したいこと

各社員のタイムカードを集計し、一つのExcelファイルにシートを分けて書き込みを行いたいです。集計については完了しDataFrameまで出力できました。「◯月分出勤管理簿.xlsx」というファイルに、シート名を社員名として、集計したデータの書き込みを行いたいです。

発生している問題・エラーメッセージ

For文を用いて、社員毎にデータの集計を行っており、集計が終わると、[社員名]のシートを作成し、そこに書き込み、次の社員のデータ集計、シート作成、書き込みというふうにしたいのです。しかし、[社員名]というシートが追加されていくだけで、集計したデータの書き込みができません。以下にコードを添付します。

該当のソースコード

For文外の最初に下記のコードで◯月分出勤管理簿.xlsxを作成します。

Python

1import pandas as pd 2import openpyxl 3 4file_name=str(dt)+"月分出勤管理簿.xlsx" 5#book作成 6book = openpyxl.Workbook() 7# 保存する 8book.save(file_name) 9 10browser = webdriver.Chrome()

そして、For文の最後に下記のコードでシートの追加・書き込み・保存を試みました

Python

1 df_xlsx=pd.DataFrame(data2) 2 worker_name=browser.find_element_by_class_name('pagetitle').text.split(" ")[0] 3 4 wb = openpyxl.load_workbook(file_name) 5 wb.create_sheet(title=worker_name) 6 7 #全レコードを'全体'シートに出力 8 df_xlsx.to_excel(file_name, sheet_name =worker_name) 9 10 11 #Excelファイルを保存 12 wb.save(file_name)

この結果は変数worker_nameに格納された社員名のシートが追加されるのみで、[社員名]のシートにデータの書き込みが行われません。

試したこと

for文の最後のコードを以下のコードに書き換えたところ

df_noseyo_xlsx.to_excel(worker_name,index=False)

[社員名]というExcelファイルが社員人数分作成されます。

[追記]
wbを作成しているにも関わらず

df_xlsx.to_excel(file_name, sheet_name =worker_name)

の書き込みをしているのが間違いだと考えています。

ws=wb[worker_name]

でワークシートを作成し、書き込みを行えば良いのかとも考えましたが、
その場合、DataFrameのままでの書き込みの方法がわかりませんでした。

[追記]

wb = openpyxl.load_workbook(file_name) wb.create_sheet(title=worker_name) ws=wb[worker_name] ws=wb.active #全レコードを'全体'シートに出力 for row in data2: ws.append(row) #Excelファイルを保存 wb.save(file_name)

としたところ、ValueError: 日付 is not a valid column name とでました。
DataFrameは下記のようなものとなっています。
イメージ説明

補足情報(FW/ツールのバージョンなど)

Python,JupyterLabを使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

openpyxlでexcelファイルを開いでおいて、pandasを使ってそのブックのシートに書き込むというようなことはできません。両者は別の動作なので、pandasで作ったファイルを最後のwriteで上書きしてしまっています。

pandasを使って複数のシートにデータを書く方法はちゃんとドキュメントに書いてあります。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_excel.html

To write to multiple sheets it is necessary to create an ExcelWriter object with a target file name, and specify a sheet in the file to write to.

ExcelWriterを作らなければならないとあります。 以下がドキュメントです。
https://pandas.pydata.org/docs/reference/api/pandas.ExcelWriter.html#pandas.ExcelWriter

簡単な例も載っています。

python

1>>> df1 = pd.DataFrame([["AAA", "BBB"]], columns=["Spam", "Egg"]) 2>>> df2 = pd.DataFrame([["ABC", "XYZ"]], columns=["Foo", "Bar"]) 3>>> with pd.ExcelWriter("path_to_file.xlsx") as writer: 4... df1.to_excel(writer, sheet_name="Sheet1") 5... df2.to_excel(writer, sheet_name="Sheet2")

日本語の使いかたは、 「pandas.to_excel ExcelWriter」あたりで検索すればわかるでしょう。

例の使い方は、with を使っているので、 全員分のDFを作って(worker_nameをキーにしたdictに入れるとか)最後にまとめて入れる形になるでしょう。

今のソースの形にこだわるなら、 withでなく、 wb = pd.ExcelWRiter() などとして、そこにto_excelで書き込んで、最後に wb.close() とするという感じでしょうか。
都度ExcelWriterを開いてとする方法もできそうですが、 開くときに追記で開かないと1つしか残りませんね。たぶん。

投稿2022/12/15 12:03

TakaiY

総合スコア12657

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

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

kgnmakl

2022/12/19 07:46

アンサーありがとうございます。理解するのに時間を要しましたが、やりたいことを実現できました。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問