#安装openpyxl  pip install openpyxl

import openpyxl

class ExcelAuto:
    """自动化处理excel程序,需提前安装openpyxl"""
    def __init__(self):
        """初始化信息"""
        # 读取文件的路径
        self.path_name = ""
        # 存储excel中的信息
        self.student_list = []
        # 用于设置列名
        self.letter="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        # 参数 :sheet_index 默认第一行是放的表头
        # 参数 :sheet_row 默认数据是从第二开始
        self.sheet_index = 1
        self.sheet_row = 2
        

    def _get_workbook_allsheets(self):
        """获取文件对象和所有工作表名称"""
        self.wb = openpyxl.load_workbook(self.path_name)
        self.allsheets = self.wb.get_sheet_names()


    def get_all_data(self,path_name,index=1,row=2):
        """获取当前excel中的所有数据
        参数1: 文件路径
        参数2: index 默认第一行是放的表头
        参数3: row 默认数据是从第二开始
        返回值:以[{}, {}, {}]格式返回数据
        """
        self.sheet_index = index
        self.sheet_row = row
        self.path_name = path_name
        self._get_workbook_allsheets()
        for i in self.allsheets:
            self.student_list+=self._get_data(i)
        return self.student_list


    def get_specified_sheet_data(self,path_name,sheet_name="",index=1,row=2):
        """获取excel中指定的所有sheet中的数据
        参数1: 文件路径
        参数2: 指定sheet的名字,默认是第一个表
        参数3: index 默认第一行是放的标题
        参数4: row 默认数据是从第二开始
        返回值:以[{}, {}, {}]格式返回数据
        """
        self.sheet_index = index
        self.sheet_row = row
        self.path_name = path_name
        self._get_workbook_allsheets()
        if sheet_name == "":
            self.student_list = self._get_data(self.allsheets[0])
            return self.student_list
        else:
            if sheet_name not in self.allsheets:
                print("输入的表名有误")
                return False
            else:
                self.student_list = self._get_data(sheet_name)
                return self.student_list


    def _get_data(self,sheetname):
        """获取当前sheet中的所有数据
        参数1:sheetname 表名
        """
        index = self.sheet_index
        row = self.sheet_row
        ws = self.wb.get_sheet_by_name(sheetname)
        student_list=[]   
        for i in range(row,ws.max_row+1):
            if ws.max_column>=26:
                pass
            else:
                dict_tmp = {}
                for j in range(ws.max_column):
                    key_name=ws[self.letter[j]+str(index)].value
                    item_name=self.letter[j]+str(i)
                    dict_tmp[key_name] = ws[item_name].value
                student_list.append(dict_tmp)
        return student_list
        
    
    def save_to_excel(self,inputData,outPutFile,sheet_name="Sheet1"):
        """把字典写入excel中 
        参数1: inputData格式是 [{}, {}, {}] 
        参数2: inputData是输出文件名字
        参数3: sheet名,默认Sheet1
        """
        wb = openpyxl.Workbook()
        sheet = wb.active
        sheet.title =sheet_name
        i = 0
        for name in inputData[0].keys():
            sheet[self.letter[i]+str(1)].value = name
            i=i+1
        j=1
        for item in inputData:
            k = 0
            for key in item:
                sheet[self.letter[k]+str(j+1)].value = item[key]
                k = k+1
            j = j+1
        wb.save(outPutFile)
        print(f"{outPutFile}:数据填写完毕!")


    def split_excel(self,path_name,specified_header):
        """按指定表头拆分excel
        参数1: path_name 原excel文件路径
        参数2: 指定表头
        """
        self.get_all_data(path_name)
        list_key = []
        dict_tmp = {}

        for i in self.student_list:
            if i[specified_header] not in list_key:
                list_key.append(i[specified_header])
                dict_tmp[i[specified_header]]=[]
            dict_tmp[i[specified_header]].append(i)
        
        for key,value in dict_tmp.items():
            key = key +".xlsx"
            self.save_to_excel(value,key)



if __name__ == "__main__":
    fn_a = r"a.xlsx"
    ExcelAuto().split_excel(fn_a,"班级")
posted on 2021-05-09 14:26  问题在哪里  阅读(78)  评论(0编辑  收藏  举报