以下裝飾器將輸出帶有樣式的excel文件。
import os
import pandas as pd
from xlsxwriter.utility import xl_range
def decoratorToExcel(excel_name: str = "test", excel_title: str = "test", excel_dir: str = None):
"""
輸出文件裝飾器,作用於類方法
:param excel_dir: 輸出的文件夾
:param excel_title: 文件名
:param excel_name: 文件表頭
:return:
"""
def midFunc(cls_func):
def inner(self, *args, **kwargs):
data: pd.DataFrame = cls_func(self, *args, **kwargs)
try:
if excel_dir:
os.makedirs(excel_dir)
except BaseException:
pass
writer = pd.ExcelWriter(
'%s%s.xlsx' % (
excel_dir + "/" if excel_dir else "", excel_name,), datetime_format='yyyy/mm/dd')
data.to_excel(
writer,
engine='xlsxwriter',
sheet_name='sheet',
startrow=2,
header=False,
float_format="%.2f")
workbook = writer.book
worksheet = writer.sheets['sheet']
worksheet.set_row(0, 20)
worksheet.set_row(1, 30)
header_format = workbook.add_format({
'bold': True,
'font_color': 'black',
'text_wrap': True,
'align': 'center',
'fg_color': '#6BA81E',
'border': 1})
rl = data.columns.tolist()
rl.insert(0, '序號')
cell_range = xl_range(0, 0, 0, len(rl) - 1)
merge_format = workbook.add_format(
{'align': 'center', 'bold': True, 'fg_color': '#009688', 'font_color': "#000000"})
worksheet.merge_range(cell_range, excel_title, merge_format)
for col_num, value in enumerate(rl):
worksheet.write(1, col_num, value, header_format)
writer.save()
return
return inner
return midFunc
class Test:
@decoratorToExcel(excel_name="測試表格", excel_title="測試sheet")
def setExcelData(self) -> pd.DataFrame:
"""
生成excel數據
:return: DataFrame
"""
data: pd.DataFrame = pd.DataFrame({"name": "張三 李四 王五".split(), "age": "12 13 15".split()})
return data
if __name__ == '__main__':
Test().setExcelData()