Excelテンプレートのセルへ値を設定して、ダウンロードリンクを作成するStreamlitのコードをメモしておきます。
streamlit、pandas、openpyxlを予めインストールしておきます。
import streamlit as st
import pandas as pd
from openpyxl import load_workbook
from io import BytesIO
import base64
# データフレームの例
df = pd.DataFrame({
'Name': ['Alice', 'Bob'],
'Age': [30, 25],
'City': ['New York', 'Los Angeles']
})
# StreamlitアプリのUI部分
st.set_page_config(layout="wide")
st.title('Excelテンプレートへのデータ設定とダウンロード')
# Excelテンプレートファイルのパス
template_path = 'path/to/your/excel_template.xlsx'
# テンプレートファイルを読み込み
wb = load_workbook(template_path)
# アクティブなワークシートを取得
ws = wb.active
# データフレームの値をExcelに設定(ここでは例としてA2セルに'Name'の最初の値を設定)
ws['A2'] = df['Name'][0]
# メモリ内でExcelファイルを生成
output = BytesIO()
wb.save(output)
excel_data = output.getvalue()
output.close()
# ExcelファイルをBase64エンコード
encoded = base64.b64encode(excel_data).decode()
# ダウンロードリンクを生成
href = f'<a href="data:application/octet-stream;base64,{encoded}" download="downloaded_excel.xlsx">Download Excel file</a>'
# Streamlitページにリンクを埋め込む
st.markdown(href, unsafe_allow_html=True)
openpyxlを使用してExcelテンプレートファイルを読み込み、特定のセルにデータフレームの値を設定した後、BytesIOオブジェクトを使用してメモリ内でExcelファイルを生成し、そのバイトデータをBase64エンコードしています。
最後に、エンコードされたデータを含むダウンロードリンクをHTMLのアンカータグとして生成し、st.markdownを使用してStreamlitアプリに埋め込んでいます。
この方法を使用すると、サーバー上に一時ファイルを作成せずに、ユーザーに対してExcelファイルのダウンロードリンクを提供できます。
ダウンロードしたファイルを開くとA2セルに値が設定されています。
なお、値を設定するセルを行番号、列番号で指定する方法は以下のとおりです。
# 第2行第1列のセルに値を設定('A2'セルに相当)
ws.cell(row=2, column=1, value=df['Name'][0])