分享

从中秋节福利说起,如何应用 Python

 heii2 2018-09-23

 现有的表格长这样: 



最后一栏的备注中的数字就是该员工应得的福利的档次。



这张表格说明了每个档次的福利所包含的东西,1档福利是500元标准,2档福利是300元标准……以此类推。最后单位领导想要的表格就是下面这样的,这是我最后做出的成果的截图,显示了每个部门分别要买多少东西:  



那么我是如何做到的呢?听媳妇描述完情况之后,我第一反应就是可以用Python来做这件事。事实证明,Python并没有让我失望。在这个过程中,我用到了两个Python的模块,一个是用来读Excel文件的xlrd,另一个是用来向Excel文件中写入数据的xlsxwriter。

import xlrd
import xlsxwriter

首先获取两个Excel文件对象: 

workbook1 = xlrd.open_workbook(r'details.xlsx') #这是第一张表
workbook2 = xlrd.open_workbook(r'plan.xlsx') #这是第二张表

sheet3 = workbook1.sheet_by_name('Sheet3') #第一张表的sheet
sheet1 = workbook2.sheet_by_name('Sheet1') #第二张表的sheet

然后读入第一个表中的部门和备注信息,每一条员工的所属部门和备注组成一个元组。

cols_bumen = sheet3.col_values(2)
cols_beizhu = sheet3.col_values(7)

res = list(zip(cols_bumen, cols_beizhu))

res = res[2:len(res)] #前两行是表头,我们所需信息从第三行开始

读入第二个表中的礼品信息。

lipin = [[],
        ['喜盛隆月饼','胡姬花花生油','黄河口大闸蟹','大米','后腿老腊肉','五花老腊肉','酱醋精装组合'],
        ['怡青源月饼8*100g','大米','酱醋精装组合','胡姬花花生油','后腿老腊肉','茶叶','五花老腊肉'],
        ['怡青源月饼8*100g','大米','猕猴桃','龙大花生油','面粉'],
        ['怡青源月饼8*100g','大米','后腿老腊肉']]

lipin_list = ['五花老腊肉', '龙大花生油', '酱醋精装组合', '大米', '猕猴桃', '怡青源月饼8*100g',
             '喜盛隆月饼', '后腿老腊肉', '黄河口大闸蟹', '茶叶', '胡姬花花生油', '面粉']

创建一个字典huizong,key是部门名,值是一个列表,列表中包含该部门所需的全部商品,假设需要两袋大米,那么列表中就会有两个“大米”。最终字典的内容应该类似这样:

{'高层管理':['大米', '大米', '喜盛隆月饼'], '文化产业部':['茶叶', '茶叶', '五花老腊肉', '五花老腊肉']}

要做到这一点,我们需要遍历res 

for i in res:
   bumen = i[0] #获取部门名
   lipin_level = int(i[1]) #获取该员工的福利档次
   if huizong.get(bumen) == None: #如果字典中不存在这个键值对,就创建一个
       huizong[bumen] = []
   huizong[bumen].extend(lipin[lipin_level]) #在列表中添加对应的礼品名

最后遍历这个字典,把每个部门中的不同的商品数量通过list的count方法计算出来,将数据写到Excel表中,就大功告成了。


 完整代码如下:

import xlrd
import xlwt
import xlsxwriter

workbook1 = xlrd.open_workbook(r'details.xlsx')
workbook2 = xlrd.open_workbook(r'plan.xlsx')

sheet3 = workbook1.sheet_by_name('Sheet3')
sheet1 = workbook2.sheet_by_name('Sheet1')

linpin = sheet1.col_values(1)
lipin = [[],
        ['喜盛隆月饼','胡姬花花生油','黄河口大闸蟹','大米','后腿老腊肉','五花老腊肉','酱醋精装组合'],
        ['怡青源月饼8*100g','大米','酱醋精装组合','胡姬花花生油','后腿老腊肉','茶叶','五花老腊肉'],
        ['怡青源月饼8*100g','大米','猕猴桃','龙大花生油','面粉'],
        ['怡青源月饼8*100g','大米','后腿老腊肉']]

lipin_list = ['五花老腊肉', '龙大花生油', '酱醋精装组合', '大米', '猕猴桃', '怡青源月饼8*100g',
             '喜盛隆月饼', '后腿老腊肉', '黄河口大闸蟹', '茶叶', '胡姬花花生油', '面粉']

cols_bumen = sheet3.col_values(2)
cols_beizhu = sheet3.col_values(7)

res = list(zip(cols_bumen, cols_beizhu))

res = res[2:len(res)]

huizong = {'高层管理':[]}    

for i in res:
   bumen = i[0]
   lipin_level = int(i[1])
   if huizong.get(bumen) == None:
       huizong[bumen] = []
   huizong[bumen].extend(lipin[lipin_level])

result = xlsxwriter.Workbook('result.xlsx')
worksheet = result.add_worksheet()
for i in range(0, len(lipin_list)):
   worksheet.write(chr(66 + i) + '1', str(lipin_list[i]))

bumen = []
for i in res:
   if bumen.count(i[0]) == 0:
      bumen.append(i[0])

for i in range(0, len(bumen)):
   worksheet.write('A{0}'.format(2+i), str(bumen[i]))

alphaBet = 66
number = 2
j = 0
for key in huizong:
   count = 0
   for i in range(0, len(lipin_list)):
       count = huizong[key].count(lipin_list[i])
       worksheet.write('{0}{1}'.format(chr(alphaBet+i), number+j), count)
   j += 1

result.close()

(完)


看完本文有收获?请转发分享给更多人

关注「Python那些事」,做全栈开发工程师

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约