python利用xlrd模块提取公司机房资源使用情况excel

如题,表格情况类似这样。


image.png

我做一个简要说明:

  1. 每一行都是一个费用记录。
  2. 一个部门(department)有多个项目(project),一个项目有多个资源实例(instance),每个实例有若干个按月结算的账单(bill),其计费时长不规律。

大家也看到了,这张表格有5000+行。手工统计保守估计一整天,其机械重复简直不能忍。谁让咱们是码农呢,虽然python是第三职业语言了,该挽起袖子上就上。

Talk is cheap, show everyone the code!

# -*- coding: utf-8 -*-#

# -------------------------------------------------------------------------------
# Name:         ${NAME}
# Description:
# Author:       ${USER}
# Date:         ${DATE}
# -------------------------------------------------------------------------------
import xlrd
import decimal
# 项目类:一个项目包含N个不同类型的资源实例,一个实例包含N个月的账单。
class Project:
    def __init__(self, department_name="", project_name=""):
        self.__department_name = department_name
        self.__project = project_name
        self.__instances = []

    def set_project(self, project_name=""):
        self.__project = project_name

    def add_source_instance(self, instance):
        if instance is not None:
            self.__instances.append(instance)
        else:
            print("添加了一个空的INSTANCE")

    def get_instance_by_id(self, id):
        for instance in self.__instances:
            if instance.get_instance_id() == id:
                return instance
        return None

    def is_instance_added(self, instance_id):
        for instance in self.__instances:
            if instance.get_instance_id() == instance_id:
                return True
        return False

    def __str__(self):
        # 1.分类计算各种资源实例用量
        instance_type_dict = dict()
        for i in self.__instances:
            type = i.get_type()
            if type not in instance_type_dict:
                instance_type_dict[type] = 1
            else:
                instance_type_dict[type] += 1
        instance_count_str = "用到资源情况-->"
        for k in instance_type_dict:
            instance_count_str += (k+":" + str(instance_type_dict[k]) + ",")

        # 2.计算所有资源实例的花费
        total_bill = 0
        max_bill_time = 1
        for i in self.__instances:
            total_bill += i.get_total_bill()
            if i.get_bill_time() > max_bill_time:
                max_bill_time = i.get_bill_time()
        return r"部门:{0}, 项目{1}。{2}。总共计费:{3}, 最长资源使用{4}个月,月均费用:{5}".format(self.__department_name,
                                                                          self.__project, instance_count_str, total_bill, max_bill_time,
                                                                          decimal.Decimal(str(total_bill/max_bill_time)).quantize(decimal.Decimal('0.00'))
                                                                          )

# 资源实例
class Instance:
    def __init__(self, instanc_id="", instance_name="", instance_region="", instance_type="", instance_inuse_time=""):
        self.__instance_id = instanc_id
        self.__instance_name = instance_name
        self.__instance_type = instance_type
        self.__instance_region = instance_region
        self.__instance_inuse_time = instance_inuse_time
        self.__instance_bills = []

    def get_instance_id(self):
        return self.__instance_id

    def get_type(self):
        return self.__instance_type

    def get_total_bill(self):
        total_bill = 0
        for b in self.__instance_bills:
            total_bill += b.get_price()
        return total_bill

    # 计费持续了几个月
    def get_bill_time(self):
        return len(self.__instance_bills)

    def add_bill(self, bill):
        if bill is not None:
            self.__instance_bills.append(bill)
        else:
            print("添加了一个空的BILL")

# 资源账单
class Bill:
    def __init__(self, date="", price=0):
        self.__date = date
        self.__price = price

    def get_price(self):
        return self.__price

    def get_date(self):
        return self.__price

    def __str__(self):
        return r"{0}的账单为{1}".format(self.__date, self.__price)


def main():
    excel_path = r"C:\Users\XXX\PycharmProjects\excelOperations\resouce\计费账单.xls"
    work_book = xlrd.open_workbook(excel_path)
    work_sheet = work_book.sheets()[0]
    print(work_sheet.nrows)

    project_dict = dict()

    row = work_sheet.nrows
    for i in range(row):
        # 跳过表头
        if i <= 1:
            continue
        rowdate = work_sheet.row_values(i)  # i行的list
        # print(rowdate)
        # id    部门    项目名称            实例id                实例名称             实例位于区域         产品类型   开通时间         计费月份      资源来源   单月总价    核对状态
        #  0     1        2                 3                    4                   5                 6          7             8            9        10         11

        # 判断资源实例属于哪个项目,如果在就直接追加实例,否则先创建项目再追加项目。
        instance_id = rowdate[3]
        instance = Instance(rowdate[3], rowdate[4], rowdate[5], rowdate[6], rowdate[7])
        # 由于有的项目没有项目名称,所以这里采用“部门+项目”的方式来唯一确定一个项目。
        department_name = rowdate[1]
        project_name = rowdate[2]
        key_in_project_dict = r"{0}+{1}".format(department_name, project_name)
        # step1: 判断项目是否已经存在于项目字典,没有就加进去。
        if key_in_project_dict not in project_dict:
            temp_project = Project(rowdate[1], rowdate[2])
            project_dict[key_in_project_dict] = temp_project
        else:
            temp_project = project_dict[key_in_project_dict]
        # step2:判断资源实例还没有被添加到其对应的项目中,没有就添加。否则就什么都不做
        if not temp_project.is_instance_added(instance_id):
            project_dict[key_in_project_dict].add_source_instance(instance)
        # step3:追加账单到对应的资源实例
        bill = Bill(rowdate[8], rowdate[10])
        temp_instance = temp_project.get_instance_by_id(instance_id)
        if temp_instance is None:
            print("debug")
        else:
            temp_instance.add_bill(bill)

    for temp_project_name in project_dict:
        print(project_dict[temp_project_name])


if __name__ == '__main__':
    main()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容