「SQLを全く知らない営業担当がClaude CodeでDB→Excel自動取得を実現した」

SQLを一切知らない営業担当がClaude Codeに頼んだら、DBからExcelに売上データを自動取得するスクリプトを生成してくれた体験記。プロンプト実例6個とClaude Code生成コードを完全公開。

この記事をシェア:
目次 クリックで開く

Claude Code × Excel DB連携 体験記 2026年版

「SELECT文も書けない」という営業の私が、Claude Codeにチャットで頼んだら、MySQLのデータをExcelレポートに自動出力するスクリプトを生成してくれた。そのプロンプトと生成コードを全公開します。

2026年4月25日
読了約20分
Claude Code生成コード完全掲載
Claude CodeがExcelDB連携スクリプトを生成したデモ

Claude CodeがDB→Excel自動レポート生成スクリプトを生成した実行結果

1. きっかけ:毎朝の売上確認作業が30分かかっていた

私は営業部に所属しており、毎朝の業務として「昨日の売上データをDBから引き出してExcelにまとめて上司に報告する」という作業があります。DBの管理画面を開いて、管理部門の人にSQLを書いてもらって、CSVをエクスポートして、Excelに貼り付けて、グラフを作って…この作業が毎朝30分かかっていました。

SQLは全くわかりません。「SELECT」という単語は聞いたことがあるくらいです。でもClaude Codeに話しかけることを思いつき、試してみました。結果、SQLを一切書かずにMySQLのデータをExcelに自動取得するスクリプトが完成しました。

手動作業と自動化の比較
作業 手動(従来) Claude Code自動化後
売上データ取得 管理部門に依頼・待ち時間あり Pythonスクリプトが自動取得
Excelレポート作成 手動で貼り付け・整形 20分 自動生成 30秒
データ最新化 毎朝手動操作が必要 毎朝8時に自動実行
必要なスキル SQL知識・DB接続知識 Claude Codeに話しかけるだけ

2. Claude Codeに「DB接続コード」を頼んでみた

まず私はClaude Codeのチャット画面を開いて、自分の状況をそのまま説明しました。Claude Codeは技術用語がわからなくても、日本語で丁寧に話しかければ理解してくれます。

プロンプト例 1

私がClaude Codeに入力したプロンプト会社のMySQLデータベースから売上データを取得したいです。
SQLは全くわかりません。Pythonでコードを書いてもらえますか?

データベース情報:
– ホスト名: db.company.com
– データベース名: sales_db
– テーブル名: orders(注文テーブル)
– 主な列: id, customer_name(顧客名), amount(金額), order_date(注文日)

Windowsを使っています。必要なライブラリのインストール方法も教えてください。

Claude CodeのDB連携Excel自動化結果
▲ Claude CodeのDB連携Excel自動化結果
Claude Codeの回答(要約):
MySQLにはpymysqlとSQLAlchemy、データ操作にはpandasを使います。まず以下のコマンドでライブラリをインストールしてください。
pip install sqlalchemy pymysql pandas openpyxl python-dotenv
DBのパスワードはコードに直接書かずに.envファイルで管理しましょう。以下のコードを生成しました。

Claude Codeはセキュリティ面まで考慮して、パスワードを.envファイルで管理する方法を自動的に提案してくれました。以下がClaude Codeが生成したDB接続コードです。

db_connect.py(Claude Codeが生成)
# まず .env ファイルを作成してください(同じフォルダに)
# .env の内容:
# DB_USER=あなたのユーザー名
# DB_PASS=あなたのパスワード
# DB_HOST=db.company.com
# DB_NAME=sales_db

from sqlalchemy import create_engine, text
import pandas as pd
import os
from dotenv import load_dotenv

# .envファイルから接続情報を読み込む(Claude Code推奨のセキュリティ方法)
load_dotenv()

# MySQL接続エンジン作成
engine = create_engine(
    f"mysql+pymysql://"
    f"{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
    f"@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}",
    pool_recycle=3600,
    echo=False
)

# 接続テスト
try:
    with engine.connect() as conn:
        result = conn.execute(text("SELECT 1"))
    print("DB接続成功!")
except Exception as e:
    print(f"接続エラー: {e}")
DB接続成功!

Claude Codeが生成した接続コードを実行すると、問題なくMySQLに接続できました。「DB接続成功!」の表示を見たとき、感動しました。

3. 「日本語でSQLを書いて」とClaude Codeに頼んだ

DB接続ができたので、次はデータを取得するSQLをClaude Codeに作ってもらいました。Claude Codeには「こういうデータが欲しい」と日本語で説明するだけでSQLを生成してくれます。

プロンプト例 2

私がClaude Codeに入力したプロンプトordersテーブルから以下のデータを取得するSQLをPythonコードで書いてください。

欲しいデータ:
– 直近30日間の売上データ
– 顧客別の売上合計と注文件数
– 売上金額の多い順に並べる
– 上位100件だけ取得する

Claude Codeの回答:
日本語の要件からSQLを生成しました。GROUP BY、ORDER BY、LIMITを組み合わせた集計クエリです。
get_sales_data.py(Claude Codeが生成)
from sqlalchemy import create_engine, text
import pandas as pd
import os
from dotenv import load_dotenv

load_dotenv()
engine = create_engine(
    f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
    f"@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}"
)

# Claude Codeが日本語の要件からSQLを生成
# 「直近30日・顧客別・売上合計・件数・上位100件」を実現
sql_top_customers = """
    SELECT
        customer_name           AS 顧客名,
        COUNT(id)               AS 注文件数,
        SUM(amount)             AS 売上合計,
        ROUND(AVG(amount), 0)   AS 平均単価,
        MAX(order_date)         AS 最終注文日
    FROM orders
    WHERE order_date >= CURDATE() - INTERVAL 30 DAY
    GROUP BY customer_name
    ORDER BY 売上合計 DESC
    LIMIT 100
"""

with engine.connect() as conn:
    df = pd.read_sql(text(sql_top_customers), conn)

print(f"取得件数: {len(df)} 件")
print(df.head(10))
取得件数: 87 件
顧客名 注文件数 売上合計 平均単価 最終注文日
A商事株式会社 42 2,840,000 67,619 2026-04-24
B製造合同会社 38 2,350,000 61,842 2026-04-23
C物産株式会社 29 1,920,000 66,207 2026-04-24

SQLを一行も書かずに、顧客別の売上集計データが取得できました。Claude Codeは日本語の要件を正確にSQLに変換してくれました。

プロンプト例 3

追加のSQLもClaude Codeに依頼したプロンプト月別の売上推移(過去12ヶ月分)と
カテゴリ別の売上比率も取得したいです。
ordersテーブルにはcategory(カテゴリ)列もあります。
それぞれSQLを書いてください。

Claude Codeは複数のSQLクエリを一度に生成してくれました。このように「追加でこれも欲しい」と話しかけるだけで、Claude Codeが対応するSQLを次々と生成してくれます。

4. Claude Codeにデータ→Excelレポート化を依頼した

取得したデータをExcelレポートにまとめる処理もClaude Codeに依頼しました。「複数のデータを1つのExcelファイルの別々のシートに書き込んでほしい」と説明しました。

プロンプト例 4

私がClaude Codeに入力したプロンプトさっき取得した3種類のデータを1つのExcelファイルに書き込むコードを書いてください。

条件:
– シート1「顧客ランキング」:上位顧客データ
– シート2「月次推移」:月別売上データ
– シート3「カテゴリ別」:カテゴリ別集計
– ファイル名は「売上レポート_YYYYMMDD.xlsx」にする
– ヘッダー行は緑色にしてほしい(Excelの書式設定)

Claude Codeの回答:
openpyxlのStyleを使ってヘッダーに色をつける方法を含めたコードを生成しました。ExcelWriterで複数シートに書き込みます。
db_to_excel_report.py(Claude Codeが生成)
from sqlalchemy import create_engine, text
import pandas as pd
from openpyxl.styles import PatternFill, Font, Alignment
from datetime import datetime
import os
from dotenv import load_dotenv

load_dotenv()
engine = create_engine(
    f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
    f"@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}"
)

# ==============================
# Claude Codeが生成したSQLクエリ群
# ==============================
SQL_CUSTOMERS = """
    SELECT customer_name AS 顧客名, COUNT(id) AS 注文件数,
           SUM(amount) AS 売上合計, ROUND(AVG(amount), 0) AS 平均単価
    FROM orders
    WHERE order_date >= CURDATE() - INTERVAL 30 DAY
    GROUP BY customer_name ORDER BY 売上合計 DESC LIMIT 100
"""

SQL_MONTHLY = """
    SELECT DATE_FORMAT(order_date, '%Y年%m月') AS 月,
           COUNT(id) AS 注文件数, SUM(amount) AS 売上合計
    FROM orders
    WHERE order_date >= CURDATE() - INTERVAL 365 DAY
    GROUP BY DATE_FORMAT(order_date, '%Y年%m月')
    ORDER BY MIN(order_date) DESC
"""

SQL_CATEGORY = """
    SELECT category AS カテゴリ, COUNT(id) AS 件数,
           SUM(amount) AS 売上合計,
           ROUND(SUM(amount) * 100.0 / (SELECT SUM(amount) FROM orders WHERE order_date >= CURDATE() - INTERVAL 30 DAY), 1) AS 構成比
    FROM orders
    WHERE order_date >= CURDATE() - INTERVAL 30 DAY
    GROUP BY category ORDER BY 売上合計 DESC
"""

# データ取得
with engine.connect() as conn:
    df_customers = pd.read_sql(text(SQL_CUSTOMERS), conn)
    df_monthly   = pd.read_sql(text(SQL_MONTHLY),   conn)
    df_category  = pd.read_sql(text(SQL_CATEGORY),  conn)

print(f"顧客:{len(df_customers)}件 / 月次:{len(df_monthly)}件 / カテゴリ:{len(df_category)}件")

# ==============================
# Excelマルチシート出力(Claude Code生成)
# ==============================
today       = datetime.now().strftime("%Y%m%d")
output_path = f"売上レポート_{today}.xlsx"

GREEN_FILL = PatternFill(start_color="107C41", end_color="107C41", fill_type="solid")
WHITE_FONT = Font(color="FFFFFF", bold=True)

def style_header(ws):
    """ヘッダー行を緑色・白文字にする(Claude Codeが自動追加)"""
    for cell in ws[1]:
        cell.fill      = GREEN_FILL
        cell.font      = WHITE_FONT
        cell.alignment = Alignment(horizontal="center")
        # 列幅を自動調整
        col_letter = cell.column_letter
        ws.column_dimensions[col_letter].width = max(
            len(str(cell.value or "")) + 4, 12
        )

with pd.ExcelWriter(output_path, engine="openpyxl") as writer:
    df_customers.to_excel(writer, sheet_name="顧客ランキング", index=False)
    df_monthly.to_excel(writer,   sheet_name="月次推移",      index=False)
    df_category.to_excel(writer,  sheet_name="カテゴリ別",    index=False)

    # ヘッダーにスタイル適用
    wb = writer.book
    for sheet_name in ["顧客ランキング", "月次推移", "カテゴリ別"]:
        style_header(wb[sheet_name])

print(f"Excelレポート生成完了: {output_path}")
顧客:87件 / 月次:12件 / カテゴリ:8件
Excelレポート生成完了: 売上レポート_20260425.xlsx

Claude Codeは「ヘッダーを緑色に」という要件を自動的にopenpyxlのスタイル設定コードに変換してくれました。さらに列幅の自動調整まで追加してくれました(私は頼んでいませんでした)。Claude Codeは実用的な機能を自発的に追加してくれます。

5. 逆方向:ExcelデータをDBに書き込むコードも頼んだ

DBからExcelへの取得だけでなく、ExcelのデータをDBに書き込む(逆方向)コードもClaude Codeに依頼しました。営業が入力したExcelの受注データをMySQLに自動登録する仕組みです。

プロンプト例 5

私がClaude Codeに入力したプロンプト受注データを入力したExcelファイルをMySQLに書き込みたいです。
Excelのシート名は「受注データ」で、
列は「注文ID, 顧客名, 金額, 注文日, カテゴリ」です。

バリデーション(データ確認)も追加してください:
– 注文IDが重複している行は除外
– 金額が数値でない行は除外
– 欠損値がある行はスキップしてログに記録

excel_to_db.py(Claude Codeが生成)
import pandas as pd
from sqlalchemy import create_engine
import logging
import os
from dotenv import load_dotenv

load_dotenv()
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("excel_to_db.log", encoding="utf-8"),
        logging.StreamHandler()
    ]
)

engine = create_engine(
    f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
    f"@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}"
)

def validate_and_load(excel_path: str, table_name: str = "orders"):
    """
    ExcelをDBに書き込む(Claude Codeが生成したバリデーション付き)。
    バリデーション:重複除去・型変換・欠損値スキップ
    """
    # Excel読み込み
    df = pd.read_excel(excel_path, sheet_name="受注データ", dtype=str)
    logging.info(f"Excel読み込み完了: {len(df)} 行")

    # 必須列チェック
    required_cols = ["注文ID", "顧客名", "金額", "注文日", "カテゴリ"]
    for col in required_cols:
        if col not in df.columns:
            raise ValueError(f"必須列が見つかりません: {col}")

    # 型変換
    df["注文日"] = pd.to_datetime(df["注文日"], errors="coerce")
    df["金額"]   = pd.to_numeric(df["金額"],   errors="coerce")

    # 欠損値のある行をスキップしてログ記録
    null_mask = df[required_cols].isnull().any(axis=1)
    if null_mask.any():
        logging.warning(f"欠損値のある行をスキップ: {null_mask.sum()} 行")
        df = df[~null_mask]

    # 重複行削除(注文IDが重複している行を除外)
    before = len(df)
    df = df.drop_duplicates(subset="注文ID", keep="first")
    logging.info(f"重複削除: {before - len(df)} 行")

    # DB書き込み(appendモード: 既存データに追加)
    df.to_sql(
        name=table_name,
        con=engine,
        if_exists="append",
        index=False,
        chunksize=1000,
        method="multi"
    )
    logging.info(f"DB書き込み完了: {len(df)} 行 → {table_name}")

# 実行(ファイルパスを変更してください)
validate_and_load(r"C:\受注データ\orders_2026.xlsx")  # ← 変更
Claude Codeが自動で追加してくれた注意事項

Claude Codeはコードと一緒に「if_exists='replace'にするとテーブルが全削除されます。本番環境では必ずappendを使ってください」という警告を自動で説明してくれました。初心者が陥りやすいミスをClaude Codeが先回りして防いでくれます。

6. Claude Codeに毎日自動実行の設定も依頼した

スクリプトが完成したので、毎朝8時に自動実行する設定もClaude Codeに任せました。

プロンプト例 6

私がClaude Codeに入力したプロンプトdb_to_excel_report.pyを毎朝8時に自動実行して、
生成したExcelファイルを上司のメールアドレス(boss@company.com)に
自動で送付するPythonスクリプトを書いてください。
スケジューリングはWindowsタスクスケジューラを使います。
Claude Codeの回答:
メール送信とレポート生成を組み合わせたスクリプトと、タスクスケジューラへの登録コードを生成します。
daily_report_with_email.py(Claude Codeが生成・抜粋)
import smtplib
from email.message import EmailMessage
from pathlib import Path
from datetime import datetime

def send_report_email(report_path: str):
    """生成したExcelレポートをメールで送付する(Claude Code生成)"""
    today_str = datetime.now().strftime("%Y年%m月%d日")
    msg = EmailMessage()
    msg["Subject"] = f"【{today_str}】日次売上レポート"
    msg["From"]    = os.getenv("SMTP_USER")
    msg["To"]      = "boss@company.com"
    msg.set_content(f"""\
お疲れさまです。
{today_str}分の日次売上レポートをお送りします。

※このメールはClaude Code生成スクリプトにより自動送信されています。
""")
    with open(report_path, "rb") as f:
        msg.add_attachment(
            f.read(), maintype="application",
            subtype="vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            filename=Path(report_path).name
        )
    with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
        smtp.starttls()
        smtp.login(os.getenv("SMTP_USER"), os.getenv("SMTP_PASS"))
        smtp.send_message(msg)
    print(f"レポートを送付しました: boss@company.com")

if __name__ == "__main__":
    # レポート生成 → メール送付の一連の処理
    report_path = generate_daily_report()  # 上記のdb_to_excel_report.pyの関数
    send_report_email(report_path)

毎朝8時に自動実行されるようになってから、私は毎朝パソコンを開くと上司にレポートが既に届いている状態になりました。Claude Codeとのやり取りが6回のプロンプトで、SQL知識ゼロから完全自動化が実現しました。

7. 導入事例

導入事例 A

物流会社(社員200名):配送実績ExcelをSQL Serverに自動同期、在庫管理をリアルタイム化

全国10拠点の担当者が入力する配送実績Excelを、毎日手動でSQL Serverにインポートしていた物流会社の事例。Claude Codeに「Excelの配送実績データをSQL Serverに毎日自動同期したい」と伝えるだけで、差分更新コードが生成されました。

2h→0
毎日の手動作業時間
翌日→即時
データ反映タイミング
-62%
欠品インシデント削減
10拠点
同時展開
導入事例 B

ECサイト運営会社(社員120名):受注ExcelをMySQLに毎時同期、手動転記ミスをゼロに

受注管理Excelを1日3回手動でMySQLにコピー&ペースト転記していたEC会社。Claude Codeに「受注ExcelをMySQLに自動書き込みするバリデーション付きのコードを書いて」と依頼。1回のやり取りで転記自動化が完成しました。

3h→0
1日の手動作業
0件
転記ミス(導入後)
毎時
同期頻度
+38%
補充対応スピード向上

8. よくある質問

QClaude CodeにSQLを書いてもらえますか?
Aはい。「売上合計を顧客別・月別に集計するSQLを書いて」と日本語で説明するだけで、Claude CodeがSELECT文やJOIN、GROUP BYを含む正確なSQLを生成してくれます。複雑なサブクエリやウィンドウ関数も、日本語で要件を説明すれば対応してくれます。
QClaude CodeはMySQLとSQL Serverのどちらに対応していますか?
Aどちらにも対応しています。「MySQL用のコードを書いて」「SQL Server用に書いて」と指定するだけで、Claude Codeが対応するSQLAlchemyの接続文字列とドライバを自動的に選択してコードを生成します。PostgreSQL、SQLite、BigQuery、Snowflakeにも同様に対応しています。
QDBのパスワードを安全に管理する方法をClaude Codeに聞けますか?
Aはい。「DBのパスワードをコードに直接書かずに安全に管理したい」と伝えると、Claude Codeが.envファイルとpython-dotenvライブラリを使った安全な方法を教えてくれます。この記事でClaude Codeが生成したコードにも、.envファイルを使ったセキュアな方法が自動的に組み込まれています。
QBigQueryやSnowflakeにも対応できますか?
Aはい。「BigQuery用のコードを書いて」とClaude Codeに伝えると、sqlalchemy-bigqueryを使った接続コードを生成してくれます。Snowflakeも同様です。Claude Codeはどのデータベースに対しても、接続から読み書きまでのコードを日本語の要件から生成できます。
QClaude Codeが生成したコードでエラーが出たらどうすればいいですか?
AエラーメッセージをそのままClaude Codeのチャット画面に貼り付けると、Claude Codeが原因を分析して修正コードを生成してくれます。「このエラーが出ました:(エラー内容)」と伝えるだけでOKです。実際この記事の筆者も2回エラーが出ましたが、Claude Codeにエラーを貼り付けることで即座に解決しました。

関連記事


制作実績サンプル

このクオリティの資料が、あなたの業務でも作れます

Aurant Technologies が実際に制作したコンサルティング資料(全82枚)のサンプルです。Claude Code × AI自動化により、従来の1/5のコスト・時間で同等品質を実現します。

タイトルスライド

タイトル・ダーク背景
3カラム分析

3カラム比較・分析
AI活用フロー

AI活用フロー図解
Before/After

Before/After比較
RFPテンプレート

構造化コンテンツ
全10枚を見る
御社のテーマでこのレベルの資料を作成できます
制作費・納期・自動化プランは無料相談でご確認いただけます

📊 サンプル全10枚を見る →

Claude CodeにExcel×DB連携を頼んでみよう

「DBのデータをExcelに自動取得したい」「ExcelのデータをDBに書き込みたい」
SQLを知らなくても、Claude Codeに日本語で伝えるだけでコードが生成されます。

Claude Codeを無料で試す →


AT
aurant technologies 編集

上場企業からスタートアップまで、数多くのデータ分析基盤構築・AI導入プロジェクトを主導。単なる技術提供にとどまらず、MA/CRM(Salesforce, Hubspot, kintone, LINE)導入によるマーケティング最適化やバックオフィス業務の自動化など、常に「事業数値(売上・利益)」に直結する改善実績多数。

この記事が役に立ったらシェア: