簡體   English   中英

openpyxl 在第一次讀取后阻塞 excel 文件

[英]openpyxl blocking excel file after first read

我正在嘗試使用 openpyxl 覆蓋給定單元格中的值。 我有兩張床單。 一個稱為 Raw,它由 API 調用填充。 其次是從原始表中提取的數據。 兩張紙具有完全相同的形狀(列/行)。 我正在對兩者進行比較,看看 Raw 中是否有 bay assignment。 如果有 - 將其抓到數據表中。 如果 Raw 和 Data 都缺少該列中的值 - 然后運行復雜的算法(與此問題無關)以根據邏輯分配托架編號。 我在使用 openpyxl 重寫 Excel 時遇到問題。

這是我的代碼示例。

data_df = pd.read_excel('Algo Build v23test.xlsx', sheet_name='MondayData') 
raw_df = pd.read_excel('Algo Build v23test.xlsx', sheet_name='MondayRaw')
no_bay_res = data_df[data_df['Bay assignment'].isnull()].reset_index() #grab rows where there is no bay assignment in a specific column

book = load_workbook("Algo Build v23test.xlsx")
    sheet = book["MondayData"]
    for index, reservation in no_bay_res.iterrows():
        idx = int(reservation['index'])
        if pd.isna(raw_df.iloc[idx, 13]):
            continue
        else:
            value = raw_df.iat[idx,13]
            data_df.iloc[idx, 13] = value
            sheet.cell(idx+2, 14).value = int(value)
        
    book.save("Algo Build v23test.xlsx")
    book.close()
print(value) #302

現在的問題是 book.close() 似乎不起作用。 Book 仍然可以在 python 中調用。現在,它完全可以覆蓋 Excel。 但是,如果我再次嘗試運行這兩行

data_df = pd.read_excel('Algo Build v23test.xlsx', sheet_name='MondayData') 
raw_df = pd.read_excel('Algo Build v23test.xlsx', sheet_name='MondayRaw')

我正在獲取包含 NULL 個值的數據集,但被替換的值除外。 (附上圖片)。 在此處輸入圖像描述 但是,如果我從文件夾中手動打開 Excel 文件並保存 (CTRL+S) 並嘗試再次運行代碼 - 它可以正常工作。 最奇怪的問題。 我需要在周一至周日循環上面的代碼,因此我需要它能夠再次讀取數據而無需手動重新保存文件。

由於某種原因,pandas 將在 openpyxl 在腳本中使用文件后將所有公式讀取為 NaN,直到文件被打開、保存和關閉。 這是有助於在腳本中執行此操作的代碼。 但是,它相當緩慢。

import xlwings as xl

def df_from_excel(path, sheet_name):
    app = xl.App(visible=False)
    book = app.books.open(path)
    book.save()
    app.kill()
    return pd.read_excel(path, sheet_name)

我遇到了同樣的問題,我發現的唯一解決方法是從 taskmanager 手動終止 excel.exe。 之后一切順利。

暫無
暫無

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

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