[英]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.