如何使用python将多个 Dataframe 写入excel并使用streamlit下载结果?

kgqe7b3p  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(172)

我有一个使用streamlit的Python脚本,它允许用户上传某些Excel文件,然后它会自动运行我的分析,然后我希望他们使用streamlit下载按钮下载xlsx的结果。不过,我知道如何让他们下载一个dataframe到csv,但不是一个xlsx文件使用streamlit下载按钮,这是我想做的。
这是我到目前为止所尝试的,这是在我的分析之后,我只是试图为用户创建下载按钮来下载存储在3个不同 Dataframe 中的结果:

Import pandas as pd
Import streamlit as st

# arrived_clean, booked_grouped, and arrived_grouped are all dataframes that I want to export to an excel file as results for the user to download. 

def convert_df():
    writer = pd.ExcelWriter('test_data.xlsx', engine='xlsxwriter')
    arrived_clean.to_excel(writer, sheet_name='Cleaned', startrow=0, startcol=0, index=False)
    booked_grouped.to_excel(writer, sheet_name='Output', startrow=0, startcol=0, index=False)
    arrived_grouped.to_excel(writer, sheet_name='Output', startrow=0, startcol=20, index=False)
    writer.save()

csv = convert_df()

st.download_button(
     label="Download data",
     data=csv,
     file_name='test_data.xlsx',
     mime='text/xlsx',
 )

当我第一次在本地运行streamlit应用程序时,我得到了这个错误:
“名称错误:未定义名称'booked_grouped'”
因为我还没有上传任何文件,所以我得到了它。在我上传我的文件后,错误信息消失了,一切正常运行。然而,我得到这个错误,我看不到下载按钮来下载我的新 Dataframe :
RuntimeError:无效的二进制数据格式:<class 'NoneType'>行313,in马歇尔_file raise RuntimeError(“Invalid binary data format:%s”% type(data))
有人能告诉我我哪里做错了吗?这是我最后一个要解决的问题。

92dk7w1h

92dk7w1h1#

Pluviophile的答案是正确的,但是你应该在pd.ExcelWriter中使用output而不是file_name

def dfs_tabs(df_list, sheet_list, file_name):

    output = BytesIO()

    writer = pd.ExcelWriter(output, engine='xlsxwriter')   
    for dataframe, sheet in zip(df_list, sheet_list):
        dataframe.to_excel(writer, sheet_name=sheet, startrow=0 , startcol=0)   
    writer.save()

    processed_data = output.getvalue()
    return processed_data
8xiog9wr

8xiog9wr2#

当我第一次在本地运行streamlit应用程序时,我得到了这个错误:
“名称错误:未定义名称'booked_grouped'”
假设你的代码

booked_grouped = st.fileuploader('Something.....`)

您可以使用以下方法跳过错误

if booked_grouped:
    # All your code inside this indentation

下载excel

将所有dataframes转换为一个Excel

# Function to save all dataframes to one single excel
def dfs_tabs(df_list, sheet_list, file_name):

    output = BytesIO()

    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')   
    for dataframe, sheet in zip(df_list, sheet_list):
        dataframe.to_excel(writer, sheet_name=sheet, startrow=0 , startcol=0)   
    writer.close()

    processed_data = output.getvalue()
    return processed_data

# list of dataframes 
dfs = [df, df1, df2]

# list of sheet names
sheets = ['df','df1','df2']
  • 请注意,要下载的数据在用户连接时存储在内存中,因此最好将文件大小控制在几百MB以下以节省内存。*
df_xlsx = dfs_tabs(dfs, sheets, 'multi-test.xlsx')
st.download_button(label='📥 Download Current Result',
                                data=df_xlsx ,
                                file_name= 'df_test.xlsx')

相关问题