簡體   English   中英

python xlwings 不會在每次迭代中保存 excel 文件

[英]python xlwings won' t save the excel file in each iteration

這個解釋起來有點復雜,如有疑問請追問。

我有兩個命名為初始和更新的 excel 文件。 更新總是有更多的工作表,每張工作表中可能有更多的行或更改的值。 我正在嘗試比較初始文件和更新文件中存在的每個工作表,並將更改寫入並突出顯示到新的 excel 文件中。

這是我擁有的代碼。

from pathlib import Path
import pandas as pd
import numpy as np
import xlwings as xw


initial_version = Path.cwd() / "ConfigurationReport_TEST.xlsx"
updated_version = Path.cwd() / "ConfigurationReport_DEV2.xlsx"

excel1 = pd.ExcelFile(initial_version)
excel2 = pd.ExcelFile(updated_version)

lesser_sheetnames_dict = {}
greater_sheetnames_dict  = {}

for idx, value in enumerate(excel1.sheet_names if len(excel1.sheet_names) < len(excel2.sheet_names) else excel2.sheet_names):
    lesser_sheetnames_dict[idx] = value
for idx, value in enumerate(excel1.sheet_names if len(excel1.sheet_names) > len(excel2.sheet_names) else excel2.sheet_names):
    greater_sheetnames_dict[idx] = value

print(lesser_sheetnames_dict)
print(len(lesser_sheetnames_dict))
print(len(greater_sheetnames_dict))

for sheetnum,sheetname in lesser_sheetnames_dict.items():
    if sheetname not in greater_sheetnames_dict.values():
        continue
    else:
        df1 = pd.read_excel(initial_version,sheet_name=sheetname)
        df2 = pd.read_excel(updated_version,sheet_name=sheetname)
        df1 = df1.fillna('')
        df2 = df2.fillna('')
        
        df2 = df2.reset_index()
        df3 = pd.merge(df1,df2,how='outer',indicator='Exist')
        df3 = df3.query("Exist != 'both'")
        df_highlight_right = df3.query("Exist == 'right_only'")

        df_highlight_left = df3.query("Exist == 'left_only'")

        highlight_rows_right = df_highlight_right['index'].tolist()
        highlight_rows_right = [int(row) for row in highlight_rows_right]

        first_row_in_excel = 2

        highlight_rows_right = [x + first_row_in_excel for x in highlight_rows_right]

        with xw.App(visible=False) as app:

            updated_wb = app.books.open(updated_version)
            print(updated_wb.sheets([x+1 for x in greater_sheetnames_dict.keys() if greater_sheetnames_dict[x] == sheetname][0]))
            updated_ws = updated_wb.sheets([x+1 for x in greater_sheetnames_dict.keys() if greater_sheetnames_dict[x] == sheetname][0])
            rng = updated_ws.used_range

            print(f"Used Range: {rng.address}")

            # Hightlight the rows in Excel
            for row in rng.rows:
                if row.row in highlight_rows_right:
                    row.color = (255, 71, 76)  # light red
                
            updated_wb.save(Path.cwd() / "Difference_Highlighted.xlsx")

我面臨的問題是在with塊中。 理想情況下,此代碼應針對兩個文件中存在的每個工作表運行,並突出顯示更改並將其保存到新文件中。

但在這種情況下,它會為兩個文件中存在的每個工作表運行,但只突出顯示並保存最后一個工作表。

作為我與 xlwings 庫的第一次交互,我對該塊的工作原理知之甚少。 任何幫助將不勝感激。

我覺得現在發布這個問題很愚蠢。 錯誤是因為 scope 的with塊。 由於它在if塊內,它每次都打開一個工作簿,寫入它,突出顯示正在迭代的當前工作表的更改,然后保存它。 顯然,在最后一次迭代(工作表)期間,它再次打開文件,寫入文件,突出顯示更改並覆蓋先前保存的文件。

為了避免這種情況,我將 with 塊的開頭語句移到if塊之前,現在它可以按預期完美運行。

with xw.App(visible=False) as app:
    for sheetnum,sheetname in lesser_sheetnames_dict.items():
        if sheetname not in greater_sheetnames_dict.values():
            continue
        else:
          // code                    
    updated_wb.save(Path.cwd() / "Difference_Highlighted.xlsx")

暫無
暫無

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

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