簡體   English   中英

使用帶有 streamlit 的 xlwings package 時出錯

[英]Error using xlwings package with streamlit

我有一個 streamlit 應用程序,它允許用戶讀取 excel 文件並嘗試將每張工作表拆分成不同的工作簿為此我正在使用xlwings package當我嘗試調試它崩潰的代碼並顯示以下錯誤時:

error :com_error:(-2147221008,'Colnitialize has not been called.',None,None)

這個錯誤是什么意思? 以及如何解決?

代碼:

import streamlit as st 
import pandas as pd
import numpy as np

from pathlib import Path
import xlwings as xw  

sheet5_path = "C:/Users/gm/Documents"

st.markdown("""

<style>
.header_title {
        font-size:30px !important;
        color:black;
        text-align :center
    }
.big-font {
        font-size:50px !important;
        color:Red
</style>
""", unsafe_allow_html=True)

st.title("Excel Split & Send")
try:
    data = st.sidebar.file_uploader("Upload Dataset",type=["csv","xlsx","xls"])
    
except Exception as e:
    st.write("error is: {}".format(e))
    
if data is not None:
    sheet1,sheet2,sheet3,sheet4,sheet5 = None,None,None,None,None
    with pd.ExcelFile(data,) as reader:
        sheet1 = pd.read_excel(reader,sheet_name="sheet1")
        sheet2 = pd.read_excel(reader,sheet_name="sheet2")
        sheet3 = pd.read_excel(reader,sheet_name="sheet3")
        sheet4 = pd.read_excel(reader,sheet_name="sheet4")
        sheet5 = pd.read_excel(reader,sheet_name="sheet5")

        st.write(sheet1.finished[0])
        st.write(sheet1.unfinished[0])
        st.markdown('<p class="header_title">sheet1|{}</p>'.format(str(sheet1.shape[0])), unsafe_allow_html=True)
        sheet1 = pd.read_excel(reader,sheet_name="sheet1",usecols=[0,1,2,3,4])
        st.dataframe(sheet1)
    
        st.write(sheet2.finished[0])
        st.write(sheet2.unfinished[0])
        st.markdown('<p class="header_title">sheet2|{}</p>'.format(str(sheet2.shape[0])), unsafe_allow_html=True)
        sheet2 = pd.read_excel(reader,sheet_name="sheet2",usecols=[0,1,2,3,4])   
        st.dataframe(sheet2)

        st.write(sheet3.finished[0])
        st.write(sheet3.unfinished[0])  
        st.markdown('<p class="header_title">sheet3|{}</p>'.format(str(sheet3.shape[0])), unsafe_allow_html=True)
        sheet3 = pd.read_excel(reader,sheet_name="sheet3",usecols=[0,1,2,3,4])
        st.dataframe(sheet3)
        
        st.write(sheet4.finished[0])
        st.write(sheet4.unfinished[0])
        st.markdown('<p class="header_title">sheet4|{} </p>'.format(str(sheet4.shape[0])), unsafe_allow_html=True)
        sheet4 = pd.read_excel(reader,sheet_name="sheet4",usecols=[0,1,2,3,4])
        st.dataframe(sheet4)

        st.write(sheet5.finished[0])
        st.write(sheet5.unfinished[0])
        st.markdown('<p class="header_title">sheet5|{} </p>'.format(str(sheet5.shape[0])), unsafe_allow_html=True)
        sheet5 = pd.read_excel(reader,sheet_name="sheet5",usecols=[0,1,2,3,4])  
        st.dataframe(sheet5)
    
    if st.sidebar.button("Split & Send"):
        #create  xlwings object
        app = xw.App(visible = False)

        # create workbook
        wb = xw.Book(data)
        # iterate over the sheets of the created workbook
    # if sheet name = total  delete it (do not copy it)
        for  sheet in wb.sheets:
            if "total" in sheet.name:
                sheet.delete()
            
            # create new work book copy the first sheet  
            else:
                wb_new = app.books.add()
                sheet.copy(after = wb_new.sheets[0])
                wb_new.sheets[0].delete()
                
                #delete the columns G:H 
                wb_new.sheets[0].range('G:H').delete()
                
                # save the new excel files  as name of each sheet  
                if "sheet5"  in sheet.name:
                    wb_new.save(f"{sheet5_path}/{sheet.name}.xlsx")
                else:
                    wb_new.save(f"{sheet.name}.xlsx")
                # close the create workbook
                wb_new.close()

        
else:
    st.markdown('<p class="big-font">You Need to Upload a FILE !!</p>', unsafe_allow_html=True)

在定義現有數據后定義 xw.App()。

if st.sidebar.button("Split & Send"):  
    wb = xw.Book(data)

    # Use context manager to prevent zombie processes.
    with xw.App(visible=False) as app:
        wb_new = app.books.add()
        # ...
        wb_new.close()
        
    wb.close()

我通過導入pythoncom package並在每次按下按鈕時調用pythoncom.CoInitialize()解決了這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM