質問するログイン新規登録
openpyxl

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

Python

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

Q&A

解決済

1回答

110閲覧

openpyxlでエクセルの既存シートに書き込もうとするとエラーになります

python_2019

総合スコア71

openpyxl

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

Python

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

0グッド

0クリップ

投稿2025/08/16 03:01

0

0

python初心者です。

openpyxlでエクセルの既存シートにCSVのデータを書き込もうとするとエラーが出ます。
エラー内容をいろいろ検索して調べてもどうしてよいのか分かりません。。
どなかたお詳しい方お教えください。
よろしくお願いいたします。

===プログラム===
#書き込みたいデータ
df_x = pd.read_csv('log009_AirFilter2410170759.csv',encoding="shift-jis")

#既存のExcelファイルを読み込む
file_path = 'log009_AirFilter2410170759_ver3_plate.xlsx'
wb = load_workbook(file_path)

#書き込みたいシートを選択する
sheet_name = 'Sheet0' # 書き込みたいシート名
sheet = wb[sheet_name]

#書き込みたいデータをリストで指定する
data_to_write = df_x

  (元のサンプルではもともと以下のようになっていたのを修正しました。
この修正方法がおかしいのでしょうか?
data_to_write = ['value1', 123, 'value3'] # 書き込みたいデータ)

#sheet.append()でデータを追加する
sheet.append(data_to_write)

#変更を保存する
wb.save(file_path)

===エラーメッセージ===
TypeError Traceback (most recent call last)
<ipython-input-9-d1cc27c3ddc8> in <module>
14
15 # 4. sheet.append()でデータを追加する
---> 16 sheet.append(data_to_write)
17
18 # 5. 変更を保存する

C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\worksheet\worksheet.py in append(self, iterable)
659
660 else:
--> 661 self._invalid_row(iterable)
662
663 self._current_row = row_idx

C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\worksheet\worksheet.py in _invalid_row(self, iterable)
790 def _invalid_row(self, iterable):
791 raise TypeError('Value must be a list, tuple, range or generator, or a dict. Supplied value is {0}'.format(
--> 792 type(iterable))
793 )
794

TypeError: Value must be a list, tuple, range or generator, or a dict. Supplied value is <class 'pandas.core.frame.DataFrame'>

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージには Pandas のデータフレームを直接追記することはできないと表示されています。

TypeError: Value must be a list, tuple, range or generator, or a dict. Supplied value is <class 'pandas.core.frame.DataFrame'>

この様な場合は OpenPyXL の dataframe_to_rows() を使用して適切な形式に変換します。

openpyxl.utils.dataframe module — openpyxl 3.1.4 documentation

openpyxl.utils.dataframe.dataframe_to_rows(df, index=True, header=True)

Convert a Pandas dataframe into something suitable for passing into a worksheet. If index is True then the index will be included, starting one row below the header. If header is True then column headers will be included starting one column to the right. Formatting should be done by client code.

python

1import pandas as pd 2from openpyxl import load_workbook 3from openpyxl.utils.dataframe import dataframe_to_rows 4 5#書き込みたいデータ 6df_x = pd.read_csv('log009_AirFilter2410170759.csv',encoding="shift-jis") 7 8#既存のExcelファイルを読み込む 9file_path = 'log009_AirFilter2410170759_ver3_plate.xlsx' 10wb = load_workbook(file_path) 11 12#書き込みたいシートを選択する 13sheet_name = 'Sheet0' # 書き込みたいシート名 14sheet = wb[sheet_name] 15 16#書き込みたいデータ(データフレーム)をワークシートに書き込むことができる形式に変換する 17data_to_write = dataframe_to_rows(df_x, index=False) 18 19#sheet.append()でデータを追加する 20for row in data_to_write: 21 sheet.append(row) 22 23#変更を保存する 24wb.save(file_path)

投稿2025/08/16 03:42

編集2025/08/16 03:47
melian

総合スコア21400

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

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

python_2019

2025/08/16 05:20

上手く行きました! データフレームを直接追記できないことによるエラーだったのですね。 具体的なコードをお教え頂き、とっても助かりました。 ご指導どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問