Python 實(shí)現(xiàn)自動(dòng)化Excel報(bào)表的步驟
好幾個(gè)月沒(méi)有寫(xiě)筆記了, 并非沒(méi)有積累, 而是有點(diǎn)懶了. 想想還是要續(xù)上, 作為工作成長(zhǎng)的一部分哦.
最近有做一些報(bào)表, 但一直找不到一個(gè)合適的報(bào)表工具, 又實(shí)在不想寫(xiě)前端, 后端... 思來(lái)想去, 感覺(jué) Excel 就一定程度上能做可視化的, 除了不能動(dòng)態(tài)交互外, 其他都挺好. 今天分享的就是一個(gè)關(guān)于如何用 Py 來(lái)自動(dòng)化Excel 報(bào)表, 解放雙手, 提高工作效率哦.
總體解決方案當(dāng)然是測(cè)試用的假數(shù)據(jù)啦.
基本思路: 1. 準(zhǔn)備模板數(shù)據(jù)需要的 SQL 2. 用 Pandas 連接 數(shù)據(jù)庫(kù) 并執(zhí)行 SQL, 返回 DataFrame 3. 用 Xlwings 直接打開(kāi) Excel, 并將這些 DataFrame 填充到 寫(xiě)死的 單元格4. 保存并退出
具體代碼如下哦:
import pandas as pd import xlwings as xwimport pymssql# 各品類(lèi)月同期 def get_last_year_sale(start_date, end_date): '''各品類(lèi)同期銷(xiāo)量, 對(duì)比19年''' sql_01 = f''' SELECT 品類(lèi) , SUM(數(shù)量) AS QTY FROM XXX WHERE 是否電商 = 1 AND 銷(xiāo)售時(shí)間 BETWEEN DATEADD(YEAR, -2, ’{start_date}’) AND DATEADD(YEAR, -2, ’{end_date}’) GROUP BY 品類(lèi) ''' df = pd.read_sql(sql_01, con=con) df_xtc = df[df[’品類(lèi)’] == ’A品類(lèi)’][[’品類(lèi)’, ’QTY’]] df_bbk = df[df[’品類(lèi)’] == ’B品類(lèi)’][[’品類(lèi)’, ’QTY’]] return df_xtc, df_bbk def get_anget_sale(start_date, end_date): '''返回各品類(lèi), 各區(qū)域的時(shí)間段銷(xiāo)量''' sql = f''' SELECT 品類(lèi) , AGENT , SUM(數(shù)量) AS QTY , ROW_NUMBER()OVER(PARTITION BY 品類(lèi) ORDER BY SUM(數(shù)量) DESC) MY_RANK FROM XXX WHERE 是否電商 = 1 AND 銷(xiāo)售時(shí)間 BETWEEN ’{start_date}’ AND ’{end_date}’ GROUP BY AGENT, 品類(lèi) ''' df = pd.read_sql(sql, con=con) df_xtc = df[df[’品類(lèi)’] == ’A品類(lèi)’][[’AGENT’, ’QTY’]] df_bbk = df[df[’品類(lèi)’] == ’B品類(lèi)’][[’AGENT’, ’QTY’]] df_pad = df[df[’品類(lèi)’] == ’C品類(lèi)’][[’AGENT’, ’QTY’]] return df_xtc, df_bbk, df_pad def get_machine_sale(start_date, end_date): '''返回各品類(lèi), 各區(qū)域的時(shí)間段銷(xiāo)量''' sql = f''' SELECT 品類(lèi) , 機(jī)型 , SUM(數(shù)量) AS QTY , ROW_NUMBER()OVER(PARTITION BY 品類(lèi) ORDER BY SUM(數(shù)量) DESC) MY_RANK FROM V_REALSALE WHERE 是否電商 = 1 AND 銷(xiāo)售時(shí)間 BETWEEN ’{start_date}’ AND ’{end_date}’ GROUP BY 機(jī)型, 品類(lèi) ''' df = pd.read_sql(sql, con=con) df_xtc = df[df[’品類(lèi)’] == ’A品類(lèi)’][[’機(jī)型’, ’QTY’]] df_bbk = df[df[’品類(lèi)’] == ’B品類(lèi)’][[’機(jī)型’, ’QTY’]] return df_xtc, df_bbk # main con = pymssql.connect(’xxxxx’, ’sxxx’, ’xxxxxx’, ’xxxxx’)# 基礎(chǔ)配置: 根據(jù)用戶(hù)輸入當(dāng)前日期, 輸出當(dāng)月, 當(dāng)季度第一天 print('歡迎哦, 此小程序?qū)iT(mén)為XX看板做數(shù)據(jù)自動(dòng)更新呢~')print()today = input('請(qǐng)輸入截止日期(昨天), 形如: 2021/5/20 按回車(chē)結(jié)束: ')if len(today.split(’/’)) != 3: raise '日期格式輸入錯(cuò)誤!!, 請(qǐng)按照形如 ’2021/5/20’的格式重新輸入'else: m_cur = today.split(’/’)[1] m_first_day = ’2021/’ + m_cur + ’/1’# 季度第一天 if m_cur in (’1’, ’01’, ’2’, ’02’, ’3’, ’03’): q_time_start = ’2021/1/1’ elif m_cur in (’4’, ’04’, ’5’, ’05’, ’6’, ’06’): q_time_start = ’2021/4/1’ elif m_cur in (’7’, ’07’, ’8’, ’08’, ’9’, ’09’): q_time_start = ’2021/7/1’else: q_time_start = ’2021/10/1’print()print('正在開(kāi)始更新....')print('提示, 接下看到閃退, 是正?,F(xiàn)象, 就程序模擬人去打開(kāi)文件, 填充數(shù)據(jù), 不要緊張哦~~~')# 去年月, 季度同期 df_mm_xtc, df_mm_bbk = get_last_year_sale(m_first_day, today)df_qq_xtc, df_qq_bbk = get_last_year_sale(q_time_start, today)# 當(dāng)月各地區(qū)累積銷(xiāo)量df_m_xtc, df_m_bbk, df_m_pad = get_anget_sale(m_first_day, today)# 各地區(qū)當(dāng)季度銷(xiāo)量 df_q_xtc, df_q_bbk, df_q_pad = get_anget_sale(q_time_start, today)# 各機(jī)型當(dāng)季度銷(xiāo)量 df_q_type_xtc, df_q_type_bbk = get_machine_sale(q_time_start, today) # 過(guò)濾掉 銷(xiāo)量為0的型號(hào) df_q_type_xtc = df_q_type_xtc[df_q_type_xtc.QTY > 0]df_q_type_xtc.replace(’Z6áÛ·å°æ’, ’Z6巔峰版’, inplace=True)df_q_type_bbk = df_q_type_bbk[df_q_type_bbk.QTY > 0]# 打開(kāi)excel 模板 等待數(shù)據(jù)填充 app = xw.App(visible=True, add_book=False)app.display_alerts = False # 關(guān)閉一些提示信息,可以加快運(yùn)行速度。 默認(rèn)為 True。app.screen_updating = Truewb = app.books.open('XXX_全品類(lèi)_看板.xlsx')data_sht = wb.sheets[’數(shù)據(jù)’]# 19年當(dāng)月同期銷(xiāo)量data_sht.range(’B9’).value = df_mm_xtc.valuesdata_sht.range(’G9’).value = df_mm_bbk.values# 當(dāng)季度同比data_sht.range(’B10’).value = df_qq_xtc.valuesdata_sht.range(’G10’).value = df_qq_bbk.values# 填充各品類(lèi)當(dāng)月銷(xiāo)量, 注意單元格是寫(xiě)死的哦data_sht.range(’I72’).value = df_m_xtc.valuesdata_sht.range(’T72’).value = df_m_bbk.valuesdata_sht.range(’AE72’).value = df_m_pad.values# 填充當(dāng)季度銷(xiāo)量, 同理是寫(xiě)死的data_sht.range(’A54’).value = df_q_xtc.valuesdata_sht.range(’F54’).value = df_q_bbk.valuesdata_sht.range(’K54’).value = df_q_pad.values# 填充當(dāng)季度各型號(hào), 同理是寫(xiě)死的data_sht.range(’A21’).value = df_q_type_xtc.valuesdata_sht.range(’F21’).value = df_q_type_bbk.valueswb.save()app.quit()print()print('~~更新結(jié)束了哦~~')print()input('請(qǐng)按任意鍵退出~~')print()print(’BYE~~ 人生若只如初見(jiàn)呢~~’)打包 EXE 桌面小程序
最好用一個(gè)純凈的 虛擬環(huán)境打包.
終端命令: python -m venv 虛擬環(huán)境名稱(chēng)
然后進(jìn)入腳本目錄下, 進(jìn)行打包哦.
pyinstaller main.py -F
打包成功后的樣子.
雙擊運(yùn)行即可哦.
這時(shí)候再重新打開(kāi)該目錄下的 Excel 模板, 發(fā)現(xiàn)數(shù)據(jù)已經(jīng)自動(dòng)更新了.
我現(xiàn)在真的感受到, 用開(kāi)發(fā)的思維做一些腳本工具, 真的會(huì)極大提高我現(xiàn)在當(dāng)文員的很多重復(fù)性工作哦!
以上就是Python 實(shí)現(xiàn)自動(dòng)化Excel報(bào)表的步驟的詳細(xì)內(nèi)容,更多關(guān)于python 自動(dòng)化Excel報(bào)表的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. JavaWeb Servlet中url-pattern的使用2. jsp中sitemesh修改tagRule技術(shù)分享3. asp(vbscript)中自定義函數(shù)的默認(rèn)參數(shù)實(shí)現(xiàn)代碼4. React優(yōu)雅的封裝SvgIcon組件示例5. 輕松學(xué)習(xí)XML教程6. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究7. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)8. JSP servlet實(shí)現(xiàn)文件上傳下載和刪除9. ASP基礎(chǔ)知識(shí)VBScript基本元素講解10. 詳解瀏覽器的緩存機(jī)制
