1.引言
昨天家人給我發消息,問我有沒有辦法用excel根據部門的名稱將一個表拆分成若干個表,我首先就想到用excel自帶的宏來實現,結果發現自己并不會,哈哈,只好放棄,轉而用python去實現,實現的功能很簡單,但是因為沒有接觸過python自動化辦公方面,所以花了點時間去搜索,去找方法。
我剛開始的想法是先將整張表讀到數據庫里,然后用group by去分類提取到數組,然后根據名稱去數據庫匹配,最后輸出到excel表。但是這個方法貌似有點蠢了。
經過了解,我把目光聚集到pandas這個庫上,實現上簡單方便。
2.pandas簡介
- Pandas是Python的一個數據分析包,該工具為解決數據分析任務而創建。它納入大量庫和標準數據模型,不僅提供高效的操作數據集所需的工具,還提供大量能使我們快速便捷地處理數據的函數和方法。
- Pandas是字典形式,基于NumPy創建,讓NumPy為中心的應用變得更加簡單。
具體的方法在這里不介紹(網上都可以查到),主要介紹一下我的方法和思路
3.實現思路
- 因為用pandas實現所以必須首先導入
import pandas as pd
- 考慮到讀取excel表需要具體路徑,所以為了適用性,選擇用python自帶的os模塊
import os
data_path = os.path.join(os.getcwd(),"原表.xlsx") # 獲取以‘原表.xlsx’為名字的文件路徑
- 接著讀取excel表
data = pd.read_excel(data_path)
rows = data.shape[0] #獲取行數
#shape[1]獲取列數
department_list = [] #創建個空列表用來存放分類標準,即部門名稱
- 使用循環將部門名稱添加到空列表
for i in range(rows):
temp = data["部門名稱"][i]
if temp not in department_list:
department_list.append(temp) #將部門的分類存在一個列表中
- 接著再使用循環獲取每一行的數據,并且進行用部門名稱列表匹配原表,提取數據
for department in department_list:
new_df = pd.DataFrame()
for i in range (0, rows):
if data["部門名稱"][i] == department:
new_df = pd.concat([new_df, data.iloc[[i],:]], axis = 0, ignore_index = True)
- 最后將每個部門存成一個新的表格
new_df.to_excel(str(department)+".xlsx", sheet_name=str(department), index = False)
4.注意:
有幾點bug:
(1)要處理的表必須以“原表.xlsx”為名字和格式。(當然這個可以自行修改)
(2)需要分類的標準應該以“部門名稱”為名字的那一列。(也可以修改)
(3)拆分完的表格命名為各部門名稱。ps:因為家人電腦里并沒有python環境,所以我選擇用pyinstaller將腳本打包成exe文件,所以產生上述bug,自家使用,隨用隨改,哈哈哈