[英]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)
這段代碼有效,但是它只是替換了包含TE
的xlsm
文件中的所有行,我只需要更新所需的行
我用另一種方式想像這樣,但效果不佳
updated_gov_tracker=re.sub(values,"xxxxxxxxx",gov_tracker_sheet)
第二件事我需要用舊的xlsm
表替換新的Dataframe
,而又不丟失Excel中的macros
csv
Outlook收件箱excel看起來像這樣 xlwings
也可以幫助我,通過選擇該行的范圍,並寫入新的updatedvalue
,所以我現在需要采取的tuple
變量,這個變量包含strings
的列稱為站點代碼,最后我現在需要根據此元組中的值行更新excel xlsm第一張表 我有一個類似這樣的元組值LCAIN12345 LCAIN54632 LCAIN78965 blablabla
現在,此值已經存在於名為Gov_Tracker
表中名為SiteCode
列的xlsm
表中,我想根據此值上的rows
來更新一些列,例如我想在名為Pending
, Pending Status
和blablabla的列中進行更新
現在,我想修改此列的行值,例如更改Pending
, Pending 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.