何为python高效办公
???????什么叫高效办公?????那就是高效率!!!如今是智能时代还不会高效办公怎么办???? ???????不会高效办公: ??????????????无法具有竞争力 ??????????????难于升职加薪 ??????????????无法解放双手陪对象(滑稽) ???????于是今天我开始陪着大家一起学习如何通过Python这门语言高效办公,由于本人知识也有限,若有好的建议或者有问题地方欢迎找我!!!) 友情提示,不管有没有基础,咋们就按照格式,思路来就好,不会的百度一下就好啦! 注:有代码的地方一定要敲打,重在基础,打好基础很重要不要忽视!!!不然嗯,脑子会了,手不会,或者哪天忘了
前言
废话不多说,我们知道高效办公”的三大敌人是—>Excel、Email、Word 我们将通过python语言来干掉这三个大坏蛋!解放双手!!!迎娶白富美 注意:第二部分主要为了熟悉第一部分知识并做基础案例,否则拆开会了,综合做就不会了!编程重在综合练习!讲的很基础,保证你能学会!!!
Python高效办公
二、openpyxl操作excel-Part2
2.1表格读写案例分析
2.1.1案例一:获取个人工资信息
任务要求: 在11月的员工绩效表中找到漂亮妹妹1的薪资信息,然后呢需要将这部分信息写入到漂亮妹妹的工资信息表中!嗯,就这么简单 思路: 1??what? ????????找到【11月员工绩效表】、【plmm1工资信息表】 2??where? -->“查看相关数据”,打开【11月员工绩效表】,找到漂亮妹妹1的薪资信息。 ???????????????????????继续“查看相关数据”,打开【plmm1工资信息表】,找到需写入数据的单元格 3??run!!! ?????????关闭工作簿,运行代码,打开【plmm1工资信息表】,查看写入的效果 plmm1的工资信息表中还没数据,需要将总表中数据写入进来才可以!不然plmm1就没钱了哦! 思路有了,代码会写了嘛??很简单的! 参考代码:
from openpyxl import load_workbook
performance_wb = load_workbook('./11月员工绩效表.xlsx')
performance_ws = performance_wb.active
info_wb = load_workbook('./plmm1工资信息表.xlsx')
info_ws = info_wb.active
performance = performance_ws['D14'].value
bonus = performance_ws['E14'].value
base = performance_ws['F14'].value
info_ws['E12'].value = performance
info_ws['F12'].value = bonus
info_ws['G12'].value = base
info_wb.save('./plmm1工资信息表.xlsx')
代码运行后: 总结一下案例一:读取单元格的数据,原样写入其他已有的工作簿,属于“单元格读写”模式。
2.1.2案例二:生成前十行绩效信息表
任务要求: 在11月的员工绩效表将前11行数据提取并写入另一个文件中,嗯,就这么简单(与案例一区别就是一个是对单元格操作,这是对多行进行操作) 思路: 1??what? ????????找到【11月员工绩效表】 2??where? -->“查看相关数据”,打开【11月员工绩效表】,提取前11行信息。 ???????????????????????新建工作薄,将提取的信息写入即可 3??run!!! ?????????关闭工作簿,运行代码,打开新建的工作薄,查看写入的效果 参考代码:
from openpyxl import load_workbook, Workbook
performance_wb = load_workbook('./11月员工绩效表.xlsx')
performance_ws = performance_wb.active
new_wb = Workbook()
new_ws = new_wb.active
for row in performance_ws.iter_rows(max_row=11, values_only=True):
new_ws.append(row)
new_wb.save('员工绩效表-模板.xlsx')
????????总结案例二其实就是简单的多行读取和写入,先获取前十一行的数据,再按行操作,每行原样使用,最后写入到新建的工作簿中。关键在于对表对象的方法使用,以及注意细节(保存等) ???????案例一和案例二,最大的不同点是所取的数据不一样。案例一获取三个单个单元格的数据,案例二则是取出前十行的数据范围。 ???????同时呢,也有两个相同点,都是原样使用数据,而且输出的结果都是写入其他工作表中。也就是说“获取数据–>如何使用数据–>输出什么结果”的基本结构中,“挥舞”着各自不同的“招式”。
2.1.3Excel文件读写”问题分解
????????我们可以根据“需要获取哪些数据范围”,“如何使用数据”,“如何输出结果”的步骤过程来分析“Excel文件读写类”的问题。 ????????但是这三大步骤问题的“答案”可以有多种变体,从而衍生出不同的功能效果,解决不同的实际需求。
1. 获取哪些数据范围
????????常常与Excel表格打交道的话,你肯定知道,即使是对于同一个工作簿,同一个工作表,人们想要获取的数据就可能千差万别。 ????????比如【10月薪资绩效表】,可能需要江宇的个人数据,也可能需要前十行数据作为模版,还可能需要所有员工的数据进行汇总等等。 根据要获取什么数据范围内的单元格来划分,大致可以分为三类: 1、已知坐标的个别单元格 2、单行或单列范围内的单元格 3、多行多列组成的矩形范围内的单元格
这三种范围内的单元格,获取的语法可不相同 ????????所以当遇到Excel文件读写问题,我们首先确认,需要处理的数据是来自哪几个工作簿、哪几个工作表、哪些数据范围的单元格。 ????????确认好这个问题,我们就可以选择对应的语法,去获取数据啦。
2. 如何使用数据
????????取出数据后,就可以使用数据了。 ????????虽然上面两个案例“使用数据”的方式比较简单,但是如果我说出其他的一些操作方式,你也一定能够理解。毕竟它们就源于日常的Excel使用。 ????????那么除了原样的写入数据,我们还可以从行数据中抽取数据,进行计算(数学计算、字符串拼接等),比如通过“提成”与“绩效”之和,得到本月所有奖金的金额。 ????????另外,还可以抽取数据,形成新的数据行,比如抽取出每行第1个和最后1个单元格的内容,得到一行新的数据。 ????????当然还可以将获得的数据,存储为Python中的数据类型,以便后续使用。比如把每行数据存为字典类型等等。
3. 如何输出结果
????????数据处理和使用后,肯定会输出一定的数据结果。那么使用完数据,一般会得到什么样新的数据结果呢? ????????前面我们看到的主要是写入到其他工作表,输出新的工作簿内容。其实“写入到工作表”这种方式下也会有不少细分:
????????除了你已经知道的,案例一和案例二中的“写入单元格数据”或“写入行数据”。 还可以“指定”从哪一行写起,“指定”写到具体坐标位置等;还可以写到不同的工作表对象中,比如原工作表、其他已有工作表、或者新建工作簿的工作表等。 另外,如果加上“循环”,还可以同时写到多个不同的工作表中,或者多个不同的坐标位置上。 ????????那还会不会还有其他输出结果呢?还可以将处理后的数据直接输出,打印到终端。
总体而言,我们可以将问题分解划分为三个步骤:获取数据,使用数据,数据输出,各步骤中又蕴含着不同的具体表现。 ????????像案例一这种,获取的数据是单个单元格;然后将所取数据原样写入到另外的表格。属于典型的单元格读写模式。 ????????像案例二这种,获取的数据是矩形区域的,一般要按行取出;然后将所取数据原样写入到另外的表格中。属于典型的按行读写模式
2.1.4案例三:计算并打印奖金信息
任务要求: ????????依然是从【11月员工绩效表】提取所有员工的工资信息,然后根据每行中员工的“绩效”与“提成”的数值之和,计算出奖金总额,最后按照固定格式输出每位员工的奖金信息。 思路: 基于上面的要求,我们可以将程序分为三步来实现: 1)取出所有员工信息的数据范围:打开【11月员工绩效表】工作表,取出数据范围。 2)提取并计算出新数据:提取出【绩效】和【提成】,计算出“奖金”数据。 3)拼接并打印:拼接员工名、工号、奖金,打印出固定格式的信息。
参考代码:
from openpyxl import load_workbook, Workbook
performance_wb = load_workbook('./11月员工绩效表.xlsx')
performance_ws = performance_wb.active
for row in performance_ws.iter_rows(min_row=2, values_only=True):
staff_id = row[0]
staff_name = row[1]
performance = row[3]
bonus = row[4]
award = performance + bonus
print('工号:{},姓名:{},本月奖金为:{}'.format(staff_id, staff_name, award))
小细节: 使用iter_rows()时,要注意values_only参数,其参数值不同,后面获取单元格的代码就会不同 还要注意缩进!
2.1.4案例四:创建薪资信息字典
任务要求: ????????依然是【11月薪资绩效表】,要从这个总的薪资表中,读取所需数据范围的行数据,然后取出部分信息,将其对应存储在字典中。 思路: ????????事情是这样的,【11月薪资绩效表】中的员工信息比较多,如果要找到某位同事(比如找到漂亮妹妹1的绩效、基本工资等)得按行整个查找一遍 ????????如果用Python的话,有没有类似Excel软件中的查找功能,能根据人名或者工号等有代表性的关键字,找到这个人所在的行,得到这行的信息呢? ????????还记得Python中的字典类型吗?字典元素为键值对,根据唯一的键,可以找到对应的值 所以啊,咱们可以“以工号为键,以每位员工的行数据作为值”,存储成一个“薪资信息字典”。 这样就能让“员工的工号”与“该员工的各项薪资信息”形成映射关系,找到工号就能对应关联到员工信息。而且利用字典提取键和值的方式,也可以很方便地进行数据查询。 参考代码:
from openpyxl import load_workbook
performance_wb = load_workbook('./11月员工绩效表.xlsx')
performance_ws = performance_wb.active
staff_info = {}
for row in performance_ws.iter_rows(min_row=2, values_only=True):
member_number = row[0]
staff_info[member_number] = {
'姓名': row[1],
'部门': row[2],
'绩效': row[3],
'奖金': row[4],
'基本工资': row[5],
'是否确认': row[6]
}
print(staff_info)
其实,此时是形成了,“字典的值”也都是一个字典的情况,也就是字典嵌套 除了把每行员工的信息存为字典,我们还可以把每行员工的信息整个存储为元组类型,比如下图: ???????存为元组后,也可以根据索引查找对应的信息,比如通过staff_info[member_number][1]得到员工姓名 ???????不过呢,你可能会费解,为什么在使用数据时要将其存储为字典,仅仅是为了打印输出吗? ???????其实不然,还记得本案例想解决的问题吗?我们想要根据工号,找到该员工对应的信息。 ???????我根据得到的字典,写了一个稍复杂的程序。下面就体验一下“查询员工信息字典”的好用之处。
staff_info = {
'S1001': {'姓名': '漂亮妹妹1', '部门': '销售部', '绩效': 100, '提成': 2250, '基本工资': 7500, '是否确认': '是'},
'S1002': {'姓名': '漂亮妹妹2', '部门': '后勤部', '绩效': 100, '提成': 4250, '基本工资': 7500, '是否确认': '是'},
'S1003': {'姓名': '漂亮妹妹3', '部门': '后勤部', '绩效': 300, '提成': 3500, '基本工资': 6500, '是否确认': '是'},
'S1004': {'姓名': '漂亮妹妹4', '部门': '开发部', '绩效': 100, '提成': 2750, '基本工资': 7500, '是否确认': '否'},
'S1005': {'姓名': '漂亮妹妹5', '部门': '开发部', '绩效': 100, '提成': 1750, '基本工资': 6000, '是否确认': '是'},
'S1006': {'姓名': '漂亮妹妹6', '部门': '销售部', '绩效': 300, '提成': 4250, '基本工资': 7000, '是否确认': '是'},
'S1007': {'姓名': '漂亮妹妹7', '部门': '运营部', '绩效': 200, '提成': 1500, '基本工资': 7000, '是否确认': '是'},
'S1008': {'姓名': '漂亮妹妹8', '部门': '后勤部', '绩效': 300, '提成': 1500, '基本工资': 9500, '是否确认': '是'}
}
staff_id = input('请输出你所查询员工的工号(如:S1001):')
dict_staff = staff_info.get(staff_id)
if dict_staff:
search_info = input('请输出你想查询的信息(如:姓名/部门/绩效/提成/是否确认):')
if dict_staff.get(search_info):
print('经查询,该员工' + search_info + '为:')
print(dict_staff[search_info])
else:
print('所输信息类型错误,只能查询姓名、部门、绩效、提成、是否确认')
else:
print('所输工号错误')
你可以复制这些代码去试试,就知道字典格式有多方便使用了,前提是你需要学会从表中提取关键信息! ???????另外,当我们有多个表格需要进行对比筛选或者分类时,将数据存为字典也是不错的选择。 因为,当把多个表格中相同的数据,比如【11月薪资绩效表】和【10月薪资绩效表】中的工号,用它作为“暗号”,查出各自的表格信息后,再进行对比或分类 三部曲总结: 加油!共勉!
后续更加精彩!
????????????????????????????????????????未完待续!!!!持续更新中 作者联系方式: QQ:747498947 wx:SuperMan-Gyd
|