一、代碼
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()