簡體   English   中英

如何使用熊貓,openpyxl,xlwings使用宏更新現有的xlsm工作表而不會丟失宏

[英]how to update existing xlsm sheet with macros using pandas, openpyxl, xlwings without losing macros

首先,我將從這篇文章中討論我的需要.....現在,我需要從另一個Excel csv文件中更新現有的Excel xlsm文件,因為此csv文件是從Outlook郵件收件箱導出的csv ,這是模板我的Outlook郵件csv

|---------------------|------------------|------------------|------------|
|      Subject        |       Body       |    From: (Name)  | To: (Name) |
|---------------------|------------------|------------------|------------|
|blabla LCAIN5678 bla |bla bla bla bla   |bla bla bla bla   |bla bla bla |
|---------------------|------------------|------------------|------------|

在我處理和分析此csv文件時,在閱讀熊貓文件后使用str.extract ,這是我的提取代碼,用於從csv文件中提取特定數據,以提取特定字符串,例如LCAIN5678包含五個字符和五個數字然后將dropna()

此代碼

# this object extract 5 chars and 5 numbers from specific column in csv
replaced_sbj_value = myOutlook_inBox['Subject']
.str.extract(pat='(L(?:DEL|CAI|SIN).\d{5})').dropna()

這是熊貓讀取的我的xlsm文件

gov_tracker_sheet = pd.read_excel(r'' + mydi
                              sheet_name
                              header=1) 

這是熊貓讀取的我的csv文件

myOutlook_inBox = pd.read_csv(r'' + mydir + 'test.CSV
                          encoding='latin-1')    

然后我像這樣初始化它

myOutlook_inBox["Subject"] = replaced_sbj_value
print (replaced_sbj_value)

像這樣

|-----------------|
|    Subject      |
|-----------------|
|   LCAIN5678     |
|-----------------|

然后我使用loc str.contains類的一些函數創建條件

像此條件一樣,因為此條件是csv某些文本的過濾器

# Condition 1: any mail from mowafy to te
frm_mwfy_to_te = myOutlook_inBox.loc[myOutlook_inBox['From: 
(Name)'].str.contains("mowafy", na=False) \
                                 & myOutlook_inBox['To: 
(Name)'].str.contains("te", na=False)] \
.drop_duplicates(keep=False)

然后,我通過創建一個變量join方法join變量frm_mwfy_to_te對Excel xlsm文件我想更新

filtered_data_cond1 = gov_tracker_sheet.loc[
gov_tracker_sheet['SiteCode']
.str.contains('|'.join(frm_mwfy_to_te.Subject))]
print(filtered_data_cond1)

因為這只是讓我從xlsm excel文件中更新的行

所以最后在這里創建一個元組值以使用此變量更新數據Dataframe ,這是我的tuple變量

values = tuple(filtered_data_cond1['Pending  '].values.tolist())

因為這是我的tuple值的輸出

(u'TE', u'PP', u'TE', u'TE', u'TE', u'TE', u'TE', u'TE', u'TE')

因此,從這里開始,我通過使用replace方法開始使用Regex

這是我創建的替換變量

updated_gov_tracker = gov_tracker_sheet.replace(to_replace=values,
                                            value='xxxxxxxxxxxx', 
regex=False)

這段代碼有效,但是它只是替換了包含TExlsm文件中的所有行,我只需要更新所需的行

我用另一種方式想像這樣,但效果不佳

updated_gov_tracker=re.sub(values,"xxxxxxxxx",gov_tracker_sheet)

第二件事我需要用舊的xlsm表替換新的Dataframe ,而又不丟失Excel中的macros

編輯

這是我要更新的現有excel文件,看起來像

在此處輸入圖片說明

這是我的csv Outlook收件箱excel看起來像這樣

在此處輸入圖片說明

現在,搜索后,我發現xlwings也可以幫助我,通過選擇該行的范圍,並寫入新的updatedvalue ,所以我現在需要采取的tuple變量,這個變量包含strings的列稱為站點代碼,最后我現在需要根據此元組中的值行更新excel xlsm第一張表

我有一個類似這樣的元組值LCAIN12345 LCAIN54632 LCAIN78965 blablabla

現在,此值已經存在於名為Gov_Tracker表中名為SiteCode列的xlsm表中,我想根據此值上的rows來更新一些列,例如我想在名為PendingPending Status和blablabla的列中進行更新

現在,我想修改此列的行值,例如更改PendingPending Status的舊值,blablabla equals新值TE ,Waiting TE Acceptance` blablabla

我希望這個信息足夠清楚

使用XlsxWriter創建xlsm的最簡單解決方案是手動更改文件結尾,然后在額外的步驟中包含宏(請參見此處 ):

import pandas as pd

df = pd.DataFrame({'First' : [5, 2, 0, 10, 4], 
                   'Second' : [9, 8, 21, 3, 8]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

df.to_excel(writer, sheet_name='Sheet1')

workbook  = writer.book
workbook.filename = 'test.xlsm'
workbook.add_vba_project('./vbaProject.bin')

writer.save()

看到這個答案 您可以使用XslxWriter軟件包隨附的vba_extract.py實用程序提取宏(vbaProject.bin)。

$ vba_extract.py macro_file.xlsm
Extracted: vbaProject.bin

暫無
暫無

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

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