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