xlwings仅将新行写入现有excel文件

2024-09-30 02:23:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望得到一些关于如何完成一个项目的指导。首先,我有一个正在工作的pandas/python脚本,它完成了我需要的大部分工作。。。但是,我需要能够使用xlwings将新行患者信息添加到excel工作表中,因为此xlsx文件是共享的,由多人使用,并且需要在一天中更新几次,而不会丢失用户添加到其他列中的信息。我很难找到有关如何遍历源文件并只为当前文件中不存在的名称添加行的信息。。。 我有一个完整的病人名册文件每天都会更新, 我只把那些待决的病人拉出来, 然后,我将其与共享xlsx文件中已有的挂起列表合并,该文件现在还有两列注释、信息和彩色行

有没有一种方法可以遍历花名册的列表,获取新的姓名和信息,并使用xlwings将这些行发送到列表的末尾,将它们添加到xlsx文件中

下面是我当前用于将花名册中的数据与需要更新的xlsx文件合并的代码

import glob,os,csv
import pandas as pd
import shutil
import fuzzymatcher
from datetime import date 
from datetime import timedelta
from functools import reduce
from styleframe import StyleFrame, Styler, utils
import time
from datetime import datetime, timedelta


patientroster = pd.read_csv(r'C:\PatientRosterAll\PatientDemographics.csv')
patientroster_cols = ('MR Number', 'PATIENT NAME', 'DOB', 'SSN', 'Sex', 'STREET', 'CITY', 'STATE', 'ZIP', 'STATUS', 'REFERRAL DATE', 'Status Note', ' Benefit Period', 'INSURANCE', 'Insurance NO', 'HIC', 'Physician', 'PHONE')
patientroster.columns = patientroster_cols

pendingtracker = pd.read_excel(r'C:\Pending Tracker\Pending Tracker.xlsx')
pendingtracker_cols = ('PATIENT NAME', 'DOB', 'PHONE', 'STREET', 'CITY', 'STATE', 'ZIP', 'INSURANCE', 'REFERRAL DATE', 'STATUS', 'FOLLOW UP', 'NOTES')
pendingtracker.columns = pendingtracker_cols

## Drop Columns in Pending Tracker
pendingtracker.drop(pendingtracker.columns[[1, 2, 3, 4, 5, 6, 7, 8, 9]], axis=1, inplace=True)


##Drop un-needed columns in roster
patientroster.drop(patientroster.columns[[0, 3, 4, 11, 12, 14, 15, 16]], axis=1, inplace=True)
patientroster = patientroster.drop( patientroster[patientroster['STATUS'] == 'Discharged' ].index)
patientroster = patientroster.drop( patientroster[patientroster['STATUS'] == 'NonAdmit' ].index)
patientroster = patientroster.drop( patientroster[patientroster['STATUS'] == 'Admit' ].index)
##Capitalize All
pendingtracker['PATIENT NAME'] = pendingtracker['PATIENT NAME'].str.upper()
patientroster['PATIENT NAME'] = patientroster['PATIENT NAME'].str.upper()
patientroster['STREET'] = patientroster['STREET'].str.upper()
patientroster['CITY'] = patientroster['CITY'].str.upper()
patientroster['STATE'] = patientroster['STATE'].str.upper()
patientroster['INSURANCE'] = patientroster['INSURANCE'].str.upper()
patientroster['STATUS'] = patientroster['STATUS'].str.upper()
##Rearrange Columns
patientroster = patientroster[['PATIENT NAME', 'DOB', 'PHONE', 'STREET', 'CITY', 'STATE', 'ZIP', 'INSURANCE', 'REFERRAL DATE', 'STATUS']]
## Merge Dataframes
pendingtracker['PATIENT NAME'] = pendingtracker['PATIENT NAME'].str.strip()
patientroster['PATIENT NAME'] = patientroster['PATIENT NAME'].str.strip()


df_merge = pd.merge(pendingtracker, patientroster, on='PATIENT NAME', how='outer')
df_merge = df_merge[['PATIENT NAME', 'DOB', 'PHONE', 'STREET', 'CITY', 'STATE', 'ZIP', 'INSURANCE', 'REFERRAL DATE', 'STATUS', 'FOLLOW UP', 'NOTES']]
df_merge['REFERRAL DATE'] = pd.to_datetime(df_merge['REFERRAL DATE'])
df_merge = df_merge.sort_values(by='REFERRAL DATE', ascending=True)
df_merge['REFERRAL DATE'] = pd.to_datetime(df_merge['REFERRAL DATE'], errors='coerce').dt.strftime('%m/%d/%Y')
########################################################################
## STYLE FRAME MODS ##

default_style = Styler(font=utils.fonts.calibri, font_size=11)
sf1 = StyleFrame(df_merge)
sf1.set_column_width(columns=['PATIENT NAME','STREET'], width=28)
sf1.set_column_width(columns=['DOB','PHONE', 'INSURANCE', 'REFERRAL DATE', 'STATUS'], width=15)
sf1.set_column_width(columns=['CITY'], width=11)
sf1.set_column_width(columns=['STATE','ZIP'], width=10)
sf1.set_column_width(columns=['FOLLOW UP'], width=18)
sf1.set_column_width(columns=['NOTES'], width=140)
sf1.apply_headers_style(styler_obj=Styler(bg_color='9bbb59', font_color=utils.colors.white, bold=True))
sf1.apply_column_style(cols_to_style=sf1.columns, styler_obj=default_style)
sf1.apply_column_style(cols_to_style=['PATIENT NAME'], styler_obj=Styler(font=utils.fonts.calibri, font_size=11, horizontal_alignment='left'), style_header=False)
sf1.apply_column_style(cols_to_style=['NOTES'], styler_obj=Styler(font=utils.fonts.calibri, font_size=11, horizontal_alignment='left'), style_header=False)
sf1.to_excel('Pending Tracker.xlsx', columns_and_rows_to_freeze='B2').save()`

Tags: columnsnameimportdfdatestylestatusmerge

热门问题