使用環境
- OS:Windows 10 Pro(バージョン:20H2)
- 言語:Python(pandas、openpyxl使用)
経緯
Pythonを使い、pandasで抽出したデータをopenpyxl経由でExcelに貼り付けようとしたところ、
次のエラーが発生しました。
ValueError: Cannot convert ('木',) to Excel
データを確認すると、
**「木」「林」「森」「4」「8」「12」**と並ぶ表があり、
1行目にカラム、2行目にデータが存在している構成でした。
このエラーへの対処と、より良いやり方を整理しました。
エラー原因
今回のエラーは、
セルに渡そうとした値が文字列ではなく、タプル型(tuple)になっていたために発生しています。
openpyxlでは、
文字列型(str)、数値型(int、float)、日付型(datetime)などのシンプルな型しか、セルに書き込むことができません。
タプルやリストなどの複合型をそのまま渡すとエラーになります。
あなたが採った応急処置方法(正しいアプローチ)
- 一旦データをすべて数値に変換してから貼り付ける
- その後、カラム名(木・林・森)を個別に手動で設定する
これは確かに実用的で正しいやり方です。
しかし、もっとスマートにエラーを防ぎながらデータを貼り付ける方法も存在します。
根本的な対処法:タプルを文字列に変換してから貼り付ける
タプルをセルに渡す直前で文字列に変換してしまえば、
エラーなく処理できます。
改善版コード
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
# ワークブックとシート作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "sheet1"
# データフレームを行ごとに取得
rows = dataframe_to_rows(data, index=False, header=True)
row_start = 1
col_start = 1
for row_no, row in enumerate(rows, row_start):
for col_no, value in enumerate(row, col_start):
# タプル型なら文字列に変換
if isinstance(value, tuple):
value = "".join(map(str, value))
ws.cell(row=row_no, column=col_no).value = value
ポイント解説
- **
isinstance(value, tuple)**で、タプルかどうか判定します。 - タプルなら、**
"".join(map(str, value))**で中身を結合して文字列化します。 - これにより、「(‘木’,)」のようなデータでも「木」という単純な文字列として書き込めるようになります。
補足:なぜタプルになったのか?
もともとのDataFrameで、
- 複数列まとめて1セルに格納しようとした
- あるいは何らかの加工時にタプルになってしまった
といった背景が考えられます。
特に、SQL抽出や結合処理後にタプル化するケースがよくあります。
まとめ
PythonでValueError: Cannot convert (‘木’,) to Excelが発生した場合は、
- セルに渡す前にデータ型を確認する
- タプル型の場合、文字列に変換してから書き込む
- 根本対策として、データ準備段階で型を整えるのも有効
これらを意識することで、
エラーなくスムーズにExcelファイル出力が可能になります。
技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。
プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。
気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。
