1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

業務自動化に役立つ:PythonでExcelファイルを自在に操作するレシピ集

Posted at

user:

エクセルファイルを読み込み、どのような名前のシートがあるか見せるPython関数を書いてください。

assistant:

以下は、指定したExcelファイルを読み込み、含まれている シート名の一覧を表示 するPython関数です。pandas ライブラリを使います。

import pandas as pd

def show_excel_sheet_names(file_path):
    """
    指定されたExcelファイルのシート名一覧を表示する関数。

    Parameters:
    - file_path (str): Excelファイルのパス(.xlsx, .xlsなど)

    Returns:
    - list: シート名のリスト
    """
    try:
        excel_file = pd.ExcelFile(file_path)
        sheet_names = excel_file.sheet_names
        print("シート名一覧:")
        for name in sheet_names:
            print(f" - {name}")
        return sheet_names
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return []

使用例:

file_path = "example.xlsx"
sheet_list = show_excel_sheet_names(file_path)

補足:

  • .xls.xlsx の両方に対応しています。
  • ファイルが存在しない、またはExcel形式でない場合はエラーになります。
  • openpyxl.xlsx用)または xlrd.xls用)のインストールが必要な場合があります。

必要なら、Streamlit対応版やアップロード対応版もご提供できます。

user:

ありがとうございます。エクセルファイル名と、シート名を入力すると、それに対応するシートをpandas dataframeで返す関数を書いてください。

assistant:

どういたしまして!以下は、Excelファイル名シート名を指定して、そのシートを pandas.DataFrame として返す関数です。


✅ 関数定義:

import pandas as pd

def load_excel_sheet(file_path, sheet_name):
    """
    指定されたExcelファイルの指定シートをpandasのDataFrameとして読み込む関数。

    Parameters:
    - file_path (str): Excelファイルのパス
    - sheet_name (str): 読み込みたいシート名

    Returns:
    - pd.DataFrame: 読み込んだデータフレーム
    """
    try:
        df = pd.read_excel(file_path, sheet_name=sheet_name)
        print(f"'{sheet_name}' シートを正常に読み込みました。")
        return df
    except FileNotFoundError:
        print(f"ファイルが見つかりません: {file_path}")
    except ValueError as e:
        print(f"シート名に関するエラー: {e}")
    except Exception as e:
        print(f"その他のエラーが発生しました: {e}")

🧪 使用例:

file_path = "example.xlsx"
sheet_name = "データ"

df = load_excel_sheet(file_path, sheet_name)

# 読み込めているか確認
print(df.head())

🔧 備考:

  • sheet_name に存在しない名前を指定すると ValueError になります(そのため try-except を追加しています)。
  • 拡張子が .xlsx の場合、openpyxl が必要です。インストールされていない場合は以下で追加できます:
pip install openpyxl

ご希望があれば、StreamlitやGUIでの選択対応などにも拡張できます。

user:

ありがとうございます。pandas dataframe 形式のデータが複数あるとき、それを、複数シートから成るエクセルファイルに変換して保存する関数を書いてください。

assistant:

こちらこそありがとうございます!
複数の pandas.DataFrame を、複数シートを持つ Excel ファイルに保存する関数 を以下に示します。


✅ 関数定義

import pandas as pd

def save_dfs_to_excel(file_path, dfs_dict):
    """
    複数のDataFrameを複数シートに分けてExcelファイルに保存する関数。

    Parameters:
    - file_path (str): 保存するExcelファイルのパス(例: 'output.xlsx')
    - dfs_dict (dict): {シート名: DataFrame} の辞書

    Returns:
    - None
    """
    try:
        with pd.ExcelWriter(file_path, engine="openpyxl") as writer:
            for sheet_name, df in dfs_dict.items():
                df.to_excel(writer, sheet_name=sheet_name, index=False)
        print(f"正常に保存されました: {file_path}")
    except Exception as e:
        print(f"保存中にエラーが発生しました: {e}")

🧪 使用例

# サンプルのDataFrame
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'X': ['a', 'b', 'c'], 'Y': ['d', 'e', 'f']})

# 辞書にまとめる
dfs = {
    '数値データ': df1,
    '文字データ': df2
}

# Excelファイルに保存
save_dfs_to_excel('output.xlsx', dfs)

💡 補足

  • シート名に 31文字以上 や *特殊文字(例: /, , ?, [, ]) が含まれるとエラーになります。必要ならシート名を事前に整形する処理も追加できます。
  • .xlsx 保存用に openpyxl が必要です。未インストールなら次で追加してください:
pip install openpyxl

必要であれば:
index を残す / 消すのオプション
既存ファイルに追記する機能
Streamlitアプリ対応

なども作成できますのでお知らせください!

user:

Streamlitアプリ用に、エクセルファイルをユーザに選択させて読み込ませる関数、計算結果を格納したエクセルファイルをダウンロードする関数、を書いてください。

assistant:

素晴らしいリクエストです!
以下に、Streamlitアプリ用に必要な2つの関数 を示します。


✅ 1️⃣ ユーザーにエクセルファイルを選ばせて読み込む関数

import pandas as pd
import streamlit as st

def streamlit_upload_excel():
    """
    Streamlit上でユーザーにExcelファイルをアップロードさせ、
    ファイルオブジェクトとシート一覧を返す。

    Returns:
    - file: アップロードされたファイルオブジェクト
    - sheet_names: シート名のリスト(アップロードされなければ None)
    """
    uploaded_file = st.file_uploader("Excelファイルを選択してください", type=["xlsx", "xls"])
    if uploaded_file is not None:
        try:
            excel = pd.ExcelFile(uploaded_file)
            sheet_names = excel.sheet_names
            st.success(f"シート一覧: {sheet_names}")
            return excel, sheet_names
        except Exception as e:
            st.error(f"ファイルの読み込みに失敗しました: {e}")
            return None, None
    else:
        return None, None

✅ 2️⃣ 計算結果を格納したエクセルファイルをダウンロードさせる関数

from io import BytesIO

def streamlit_download_excel(dfs_dict, download_filename="output.xlsx"):
    """
    複数DataFrameをExcelファイルに書き出し、ダウンロードリンクを作成する。

    Parameters:
    - dfs_dict: {シート名: DataFrame} の辞書
    - download_filename: ダウンロード時のファイル名

    Returns:
    - None
    """
    try:
        output = BytesIO()
        with pd.ExcelWriter(output, engine="openpyxl") as writer:
            for sheet_name, df in dfs_dict.items():
                df.to_excel(writer, sheet_name=sheet_name, index=False)
        st.download_button(
            label="結果ファイルをダウンロード",
            data=output.getvalue(),
            file_name=download_filename,
            mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        )
    except Exception as e:
        st.error(f"ダウンロードファイルの作成に失敗しました: {e}")

🌟 使用例(Streamlitスクリプト例)

import streamlit as st

st.title("Excel 読み込み & 結果ダウンロード アプリ")

# ファイルのアップロードとシート確認
excel, sheet_names = streamlit_upload_excel()

if excel is not None:
    sheet_name = st.selectbox("読み込むシートを選択してください", sheet_names)
    if sheet_name:
        df = pd.read_excel(excel, sheet_name=sheet_name)
        st.write("データプレビュー:")
        st.dataframe(df)

        # 仮の計算結果(ここは好きに変更可能)
        result_df = df.describe()

        # ダウンロード用リンク作成
        streamlit_download_excel({"元データ": df, "集計結果": result_df})

⚡ 補足

✅ どちらの関数も Streamlit v1.0+ 対応。
openpyxl が必要です。

pip install streamlit pandas openpyxl

必要なら、

  • アップロードしたExcel内容の動的可視化
  • 複数ファイル対応
  • ダウンロードファイルのパスワード保護

なども作れます。希望があればお知らせください!

user:

ダウンロードファイルのパスワード保護、教えてください。

assistant:

とても良い視点です!ただ、重要な点として pandas や openpyxl の標準機能だけでは、パスワード付き Excel ファイルを直接作成することはできません。ですが、以下の方法があります。


✅ Excel パスワード保護ファイルを作成する方法

xlsxwriter を使う(書き出し時にパスワード保護)

xlsxwriter には、ワークブックのパスワード保護機能があります。
以下に例を示します。

import pandas as pd

def save_dfs_to_protected_excel(file_path, dfs_dict, password):
    """
    複数DataFrameを複数シートに保存し、パスワードをかけたExcelファイルを作成。

    Parameters:
    - file_path (str): 出力ファイルパス
    - dfs_dict (dict): {シート名: DataFrame}
    - password (str): 設定するパスワード
    """
    try:
        with pd.ExcelWriter(file_path, engine='xlsxwriter') as writer:
            workbook = writer.book
            workbook.set_password(password)
            for sheet_name, df in dfs_dict.items():
                df.to_excel(writer, sheet_name=sheet_name, index=False)
        print(f"パスワード付きで保存しました: {file_path}")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

🧪 使用例

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'X': [5, 6], 'Y': [7, 8]})
dfs = {'Sheet1': df1, 'Sheet2': df2}

save_dfs_to_protected_excel("protected_output.xlsx", dfs, password="secret123")

✅ Streamlit に組み込む場合

Streamlit のダウンロードボタンにバイト列で渡す必要があるため、BytesIO を使います。

from io import BytesIO
import pandas as pd

def streamlit_download_protected_excel(dfs_dict, password, download_filename="protected_output.xlsx"):
    """
    複数DataFrameをパスワード付きExcelにしてStreamlitでダウンロードリンク生成。
    """
    try:
        output = BytesIO()
        with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
            workbook = writer.book
            workbook.set_password(password)
            for sheet_name, df in dfs_dict.items():
                df.to_excel(writer, sheet_name=sheet_name, index=False)
        st.download_button(
            label="パスワード付きExcelをダウンロード",
            data=output.getvalue(),
            file_name=download_filename,
            mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        )
    except Exception as e:
        st.error(f"エラー: {e}")

⚠ 注意点

  • xlsxwriter.xlsx形式のみ 対応。 .xls は不可。
  • パスワードは ファイルを開くときに必要なもの(暗号化保護)であり、シート単位の保護(編集制限)は別です。
  • 完全な暗号化強度は Microsoft Excel の保護機能ほど強力ではない とされます(機密情報には注意)。

🔧 インストール

必要なら以下でインストールしてください:

pip install xlsxwriter

必要であれば、
シート編集禁止 (書き込み禁止) のオプション
ファイル開くときの警告文表示
パスワードをランダム生成するコード

もご提供できますのでお知らせください!

assistant:

ありがとうございました。今日はこの辺りで十分です。ここまでの会話をブログに残したいので、タイトル案をいくつか考えていただけませんか?

user:

こちらこそありがとうございました!
今日の会話の内容(Excelファイルの読み込み・シート一覧・データ保存・パスワード保護・Streamlit対応)を反映したブログタイトル案をいくつか提案します。


💡 ブログタイトル案

1️⃣ 「Python × Excel 操作の基本:シート一覧確認からパスワード付き保存まで」
2️⃣ 「Streamlitで作る!Excelファイルを読み込み・編集・パスワード付きでダウンロードするアプリ」
3️⃣ 「pandas + Streamlit:複数DataFrameを一気にExcel出力する実践ガイド」
4️⃣ 「Pythonで簡単!複数シートのExcel作成とパスワード保護の方法」
5️⃣ 「業務自動化に役立つ:PythonでExcelファイルを自在に操作するレシピ集」
6️⃣ 「PythonとStreamlitで作るExcel操作ツール:データ確認から安全な出力まで」
7️⃣ 「複数シート、パスワード保護、Streamlit対応:Pythonで極めるExcel操作」


どれも今日の内容をカバーしています。
もし「業務効率化」「初心者向け」「実践例重視」など方向性があれば、それに合わせて調整できます!どれが良さそうか、または別の切り口があればお知らせください。

user:

「業務自動化に役立つ:PythonでExcelファイルを自在に操作するレシピ集」でいきたいと思います。最後に、ここまでの会話の詳しいまとめを書いてください。

assistant:

素晴らしいタイトルです!
では 「業務自動化に役立つ:PythonでExcelファイルを自在に操作するレシピ集」 にふさわしい、今日の会話の詳しいまとめを以下にまとめます。


業務自動化に役立つ:PythonでExcelファイルを自在に操作するレシピ集

💡 はじめに

本記事では、業務で頻繁に使われる Excel ファイルの読み込み・編集・保存・パスワード保護 を、Python の pandasStreamlit を活用して効率的に操作する方法をまとめます。
実務でのデータ確認、加工、ファイル出力をスムーズにするレシピ集です。


📌 Excel ファイルのシート名一覧を取得する関数

まず、指定した Excel ファイルにどのようなシートが含まれているかを確認する関数です。

import pandas as pd

def show_excel_sheet_names(file_path):
    try:
        excel_file = pd.ExcelFile(file_path)
        sheet_names = excel_file.sheet_names
        print("シート名一覧:")
        for name in sheet_names:
            print(f" - {name}")
        return sheet_names
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return []

👉 用途: ファイル確認時にシート構成を素早く把握できます。


📌 シート名を指定して DataFrame として読み込む関数

次に、ファイル名とシート名を指定して、そのシートのデータを pandas.DataFrame に読み込む関数です。

def load_excel_sheet(file_path, sheet_name):
    try:
        df = pd.read_excel(file_path, sheet_name=sheet_name)
        print(f"'{sheet_name}' シートを正常に読み込みました。")
        return df
    except FileNotFoundError:
        print(f"ファイルが見つかりません: {file_path}")
    except ValueError as e:
        print(f"シート名に関するエラー: {e}")
    except Exception as e:
        print(f"その他のエラーが発生しました: {e}")

👉 用途: 必要なシートだけをピンポイントで取り出せます。


📌 複数 DataFrame を複数シートの Excel に保存する関数

複数のデータを一括で Excel にまとめたいときの関数です。

def save_dfs_to_excel(file_path, dfs_dict):
    try:
        with pd.ExcelWriter(file_path, engine="openpyxl") as writer:
            for sheet_name, df in dfs_dict.items():
                df.to_excel(writer, sheet_name=sheet_name, index=False)
        print(f"正常に保存されました: {file_path}")
    except Exception as e:
        print(f"保存中にエラーが発生しました: {e}")

👉 用途: 複数データを1つのファイルにまとめて管理できます。


📌 パスワード付き Excel ファイルの作成

セキュリティを意識したパスワード保護付きファイルの作成です。

def save_dfs_to_protected_excel(file_path, dfs_dict, password):
    import xlsxwriter
    try:
        with pd.ExcelWriter(file_path, engine='xlsxwriter') as writer:
            workbook = writer.book
            workbook.set_password(password)
            for sheet_name, df in dfs_dict.items():
                df.to_excel(writer, sheet_name=sheet_name, index=False)
        print(f"パスワード付きで保存しました: {file_path}")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

👉 用途: パスワードで保護したファイルを関係者に安全に渡せます。


📌 Streamlit 対応:Excel のアップロード・ダウンロード

Streamlit を使えば、これらの操作を Web アプリ化して簡単に操作できます。

ファイルアップロードとシート確認

def streamlit_upload_excel():
    uploaded_file = st.file_uploader("Excelファイルを選択してください", type=["xlsx", "xls"])
    if uploaded_file is not None:
        try:
            excel = pd.ExcelFile(uploaded_file)
            sheet_names = excel.sheet_names
            st.success(f"シート一覧: {sheet_names}")
            return excel, sheet_names
        except Exception as e:
            st.error(f"ファイルの読み込みに失敗しました: {e}")
            return None, None
    return None, None

パスワード付き Excel のダウンロードリンク作成

def streamlit_download_protected_excel(dfs_dict, password, download_filename="protected_output.xlsx"):
    from io import BytesIO
    output = BytesIO()
    with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
        workbook = writer.book
        workbook.set_password(password)
        for sheet_name, df in dfs_dict.items():
            df.to_excel(writer, sheet_name=sheet_name, index=False)
    st.download_button(
        label="パスワード付きExcelをダウンロード",
        data=output.getvalue(),
        file_name=download_filename,
        mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    )

👉 用途: Webアプリで Excel 操作を業務ツール化できます。


🚀 まとめ

今回まとめたコード群を使えば、次のことが簡単にできます:

✅ Excelファイルのシート確認
✅ 必要なシートのデータ読み込み
✅ 複数 DataFrame を1ファイルに保存
✅ パスワード保護ファイルの作成
✅ Streamlit でのアップロード・ダウンロード対応

これらを組み合わせれば、日々のデータ確認やレポート作成を自動化・効率化 できます。業務の「面倒なExcel作業」をPythonでスマートに解決しましょう!


必要であれば、このまとめをマークダウン形式のファイルに書き出すコードもお渡しできますので、お知らせください!

user:

これで充分です。ありがとうございました!

assistant:

こちらこそ、最後まで丁寧にやり取りいただきありがとうございました!
「業務自動化に役立つレシピ集」というテーマ、きっと実務でも役立つ内容になると思います。

またいつでもお気軽にご相談ください。お疲れさまでした!🌟🚀

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?