Python处理Excel——汇总日报工具

平时组长统计日报时会用一段时间,我自己觉得重复的劳动是不必要的,所以给组长写了一个小工具,去统计组内所有人员的日报情况,并汇总成一份全组的Excel。

1. 挑选第三方库

本着不重复造轮子的选择,首先找找有没有现成Python处理Excel的库。我用的是openpyxl,它支持读/写Excel,并且支持.xlsx格式。
openpyxl文档
安装openpyxl用pip安装即可,如果用pycharm的话安装也很方便,就不详细说明了。

2. 日报的模板

日报内容
tab标题

3. 实现思路

1). 需要判断哪些人员没有交日报
2). 需要确定汇总星期几的日报
3). 依次逐个读取组员的Excel文件
4). 将读取的数据汇总到新的Excel中

4. 代码

import os
from openpyxl import load_workbook, Workbook
from openpyxl.styles import Border, Side, Font, Alignment, NamedStyle
import datetime
import sys

'''
文档:https://openpyxl.readthedocs.io/en/default/
功能:整理组内日报脚本
作者:bluedai180
时间:2016/12/23
'''


class Daily(object):
    name = []
    day_index = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
    file_path = '../Files/excel_files'
    file_name = '../Files/excel_files/应用一课日报.xlsx'
    excel_title = '应用一课日报'
    excel_file = []
    # 需要手动添加全部组员的名称
    excel_name = []

    # 初始化方法
    def __init__(self):
        self.wb_new = Workbook()
        self.ws_new = self.wb_new.active
        self.ws_new.title = self.excel_title
        if (os.path.exists(self.file_name)):
            os.remove(self.file_name)

    # 判断哪些人员没有交日报
    def check_file(self):
        self.excel_file = os.listdir(self.file_path)
        self.excel_name = []
        name = []
        for x in self.excel_file:
            self.excel_name.append(x.split('_')[1][0:-5])
        for x in self.name:
            if x not in self.excel_name:
                name.append(x)
        if len(name) is not 0:
            print("以下人员未交日报:\n")
            print(", ".join(name))
        else:
            print("全员日报已交齐!")

    # 处理Excel文件
    def do_files(self, commend):
        self.ws_new.append(['项目', '工作类别', 'Bug ID', '简要描述', '优先级', '是否reopen', 'reopen原因', '解决方案',
                            '原因', '责任人', '日期', '备注'])
        day = self.day_index[commend - 1]
        for x in self.excel_file:
            print("正在读取: %s" % x)
            wb = load_workbook('%s/%s' % (self.file_path, x), read_only=True)
            ws = wb.get_sheet_by_name(day)
            excel_cell = list(ws.rows)
            temp = []
            # 从第二行开始读取数据
            for x in excel_cell[1:]:
                if x[0].value is None:
                    break
                # 遍历当前行的所有单元格
                for y in x:
                    # 对时间数据进一步处理
                    if type(y.value) is datetime.datetime:
                        temp.append(y.value.strftime("%Y/%m/%d"))
                    else:
                        temp.append(y.value)
                # 将每一行的数据插入到新的Excel文件中
                self.ws_new.append(temp)
                temp.clear()

        self.format_file()
        self.check_name()
        self.wb_new.save(self.file_name)

    # 优化Excel表的样式
    def format_file(self):
        self.ws_new.column_dimensions['A'].width = 20
        self.ws_new.column_dimensions['B'].width = 14
        self.ws_new.column_dimensions['C'].width = 14
        self.ws_new.column_dimensions['D'].width = 70
        self.ws_new.column_dimensions['E'].width = 10
        self.ws_new.column_dimensions['F'].width = 14
        self.ws_new.column_dimensions['G'].width = 14
        self.ws_new.column_dimensions['H'].width = 14
        self.ws_new.column_dimensions['I'].width = 14
        self.ws_new.column_dimensions['J'].width = 14
        self.ws_new.column_dimensions['K'].width = 14
        self.ws_new.column_dimensions['L'].width = 25

        left, right, top, bottom = [Side(style='thin', color='000000')] * 4
        title = NamedStyle(name="title")
        title.font = Font(name=u'宋体', size=11, bold=True)
        title.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
        title.border = Border(left=left, right=right, top=top, bottom=bottom)
        content = NamedStyle(name="content")
        content.font = Font(name=u'宋体', size=11)
        content.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
        content.border = Border(left=left, right=right, top=top, bottom=bottom)
        content_long = NamedStyle(name="content_long")
        content_long.font = Font(name=u'宋体', size=11)
        content_long.border = Border(left=left, right=right, top=top, bottom=bottom)
        content_long.alignment = Alignment(horizontal='left', vertical='center', wrap_text=True)

        for i in range(self.ws_new.max_row):
            self.ws_new.row_dimensions[i + 1].height = 40

        for x in self.ws_new['A:C']:
            for y in x:
                y.style = content

        for x in self.ws_new['E:F']:
            for y in x:
                y.style = content

        for x in self.ws_new['H:K']:
            for y in x:
                y.style = content

        for x in self.ws_new[1]:
            x.style = title

        for x in self.ws_new['D'][1:]:
            x.style = content_long

        for x in self.ws_new['L'][1:]:
            x.style = content_long

        for x in self.ws_new['G'][1:]:
            x.style = content_long

    def check_name(self):
        content_name = []
        name = []
        for x in self.ws_new['J'][1:]:
            content_name.append(x.value)
        for x in self.excel_name:
            if x not in content_name:
                name.append(x)
        if len(name) is not 0:
            print("\n以下人员已提交日报,但工作表内容为空:\n")
            print(", ".join(name))

if __name__ == '__main__':
    daily = Daily()
    daily.check_file()
    # 根据选择星期几来确定汇总的tab表
    is_do = input("\n是否继续生成日报?[y/n]:")
    if is_do == 'y':
        commend = input("\n需要输出星期几的日报: \n1. 星期一\n2. 星期二\n3. 星期三\n4. 星期四\n5. 星期五\n6. 星期六\n"
                        "7. 星期日\n请输入序号: ")
        daily.do_files(int(commend))
        print("\n=======请查看生成的日报汇总。=======")
    elif is_do == 'n':
        sys.exit(0)
    else:
        print("请输入y或者n!")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,401评论 25 707
  • python学习笔记 声明:学习笔记主要是根据廖雪峰官方网站python学习学习的,另外根据自己平时的积累进行修正...
    renyangfar阅读 3,016评论 0 10
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,436评论 6 428
  • ----------------------------- https://zhuanlan.zhihu.com/...
    靖兰亭阅读 685评论 0 49
  • 今天有一位内观者结束为期六次的内观集中体验,又有一位新的内观者参加。 海皮家园内观集中体验会安排很多次,每周日。假...
    心行者阅读 346评论 0 1