一、代碼
import xlwings as xw import pandas as pd xl_path=r'***' df_path=r'***' df=pd.read_excel(df_path) app=xw.App(visible=False,add_book=False) #不彈出提示窗 app.display_alerts=False load_wb=app.books.open(xl_path) load_ws=load_wb.sheets["sheetname"] #清除sheet內的所有數據 load_ws.clear() #將dataframe轉成列表寫入 load_ws.range('A1').expand('table').value = df.values.tolist() load_wb.save() load_wb.close() app.quit()
二、改進封裝代碼
import xlwings as xw import pandas as pd import numpy as np class PathError(BaseException): def __init__(self, error): self.error = error class WriteError(BaseException): def __init__(self, error): self.error = error # 判斷元素是否為數字 def is_number(s): try: if np.isnan(s) or s == False or s == True: return False except Exception: pass try: # 判斷是否為浮點數 float(s) return True except Exception: pass try: import unicodedata # 處理ASCii碼的包 # 把一個表示數字的字符串轉換為浮點數返回的函數 unicodedata.numeric(s) return True except (TypeError, ValueError): pass return False class ExcelMerge(object): def __init__(self): self.app = xw.App(visible=False, add_book=False) self.app.display_alerts = False self.load_wb = None self.load_ws = None self.data_list = [] def merge(self, master_path=None, retinue_path=None, sheet=0): if not master_path or not retinue_path: raise PathError("文件地址不能為空") self.data_list = self.read_df(master_path) self.data_list.extend(self.read_df(retinue_path)) self.data_list = pd.DataFrame(self.data_list) try: self.load_wb = self.app.books.open(master_path) self.load_ws = self.load_wb.sheets[sheet] self.load_ws.range('A2').expand('table').value = self.data_list except Exception as e: raise WriteError("excel寫入錯誤:{}".format(e)) finally: self.load_wb.save() self.load_wb.close() self.app.quit() def read_df(self, path): df = pd.read_excel(path) col_list = [] # 以下代碼是解決純數字過長導致寫入excel后幾位變0 for column in df: for v in df[column]: if is_number(v): if len(str(v)) > 12: col_list.append(column) break if col_list: for c in col_list: df[c] = df[c].map(lambda x: "'" + str(x) if not pd.isnull(x) else "") return df.values.tolist() em=ExcelMerge() if __name__ == '__main__': # 合並2個excel,一個主表,一個從表 master_path="****" retinue_path="****" em.merge()
