使用python去处理excel文件实战案例
之后的文章会陆续出关于python和MySQL数据库的实战小案例
一、读取原始数据,整理之后写入专门的python文件
1、第一步一定是要导入模块了,那么这个例子用的是openpyxl的模块,实际上也有其他的模块用来处理excel文件
import openpyxl
import pprint
from openpyxl.utils import column_index_from_string
openpyxl主要操作数据库,pprint用于写入文件,column_index_from_string顾名思义,用来处理excel文件当中列的内容
2、因为从软件生成的数据文档中有一定的格式,我们可以直接按照生成的数据文档中的格式进行代码的编写
openpyxl.load_workbook() # 该方法用来加载工作簿,括号里面的参数是文件名称
3、加载好excel文件之后,选择要处理的sheet,选择好要读取的信息,从哪列到哪列(或从哪行到哪行)
ws = wb['月度汇总'] # 我以月度汇总的sheet为例
col_range = ws['H:AG']
4、选择好了区域之后,准备开始按行读取,简单点就用for循环就可以,但是时间复杂度是在O(n^2)的,后期文章再做优化。获取文档中的姓名、各种类型的假,上班迟到早退情况
# 在遍历的时候要注意range函数的stop含义,因此到最后一行的时候要+1.
#附上python的解释
'''
class range(object)
| range(stop) -> range object
| range(start, stop[, step]) -> range object
|
| Return an object that produces a sequence of integers from start (inclusive)
| to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
| start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
| These are exactly the valid indices for a list of 4 elements.
| When step is given, it specifies the increment (or decrement).
'''
5、在该sheet下,通过表单名字[‘单元格索引’].value的格式获取相应单元格内的数据
for row in range(5, ws.max_row + 1): # 按行遍历
name = ws['A' + str(row)].value
shi_data = ws['Q' + str(row)].value
chan_data = ws['R' + str(row)].value
chanjian_data = ws['S' + str(row)].value
si_data = ws['T' + str(row)].value
year = ws['U' + str(row)].value
teshugongzuo = ws['V' + str(row)].value
bing_data = ws['W' + str(row)].value
tiaoxiu = ws['X' + str(row)].value
peichan = ws['Y' + str(row)].value
gong = ws['Z' + str(row)].value
xiu = ws['AA' + str(row)].value
jie = ws['AB' + str(row)].value
chidao = ws['H'+str(row)].value
yanzhong = ws['I'+str(row)].value
kuanggong_c = ws['J'+str(row)].value
zaotui = ws['K'+str(row)].value
shangban = ws['L'+str(row)].value
xiaban = ws['M'+str(row)].value
kuanggong = ws['N'+str(row)].value
6、行数范围确定好之后,确定列数范围,数据还是存储到字典当中方便读取。
每个人都不只有一种假,所以不能用多重分支
使用column_index_from_string()方法将列数转换为具体数字
使用setdefault方法创建字典并存储,原理相同,因此展示一部分代码
为了方便数据的整理,可以适当进行强转
resdata = {}
for col in col_range: # 每列遍历
if ws.cell(column=column_index_from_string('H'), row=row).value != 0:
resdata.setdefault(name, {})
resdata[name].setdefault('键名1', chidao)
if ws.cell(column=column_index_from_string('I'), row=row).value != 0:
resdata.setdefault(name, {})
resdata[name].setdefault('键名2', yanzhong)
if ws.cell(column=column_index_from_string('J'), row=row).value != 0:
resdata.setdefault(name, {})
resdata[name].setdefault('键名3', kuanggong_c)
if ws.cell(column=column_index_from_string('K'), row=row).value != 0:
resdata.setdefault(name, {})
resdata[name].setdefault('键名4', zaotui)
if ws.cell(column=column_index_from_string('L'), row=row).value != 0:
resdata.setdefault(name, {})
resdata[name].setdefault('键名5', shangban)
if ws.cell(column=column_index_from_string('M'), row=row).value != 0:
resdata.setdefault(name, {})
resdata[name].setdefault('键名6', xiaban)
if ws.cell(column=column_index_from_string('N'), row=row).value != 0:
resdata.setdefault(name, {})
resdata[name].setdefault('键名7', kuanggong)
if ws.cell(column=column_index_from_string('R'), row=row).value is not None:
resdata.setdefault(name, {})
resdata[name].setdefault('键名8', float(shi_data))
另外补充一下关于字典的setdefault方法:
setdefault()方法体当中有两个参数,第一个参数key是设置字典的键名,第二个参数用来设置默认值
# 举个例子
data = {}
data.setdefault('name', 'abc')
print(data)
data.setdefault('age', 10)
print(data)
如果想要某一个键的值依旧被设置为字典,可以参考如下例子:
直接将对应键的值设置成空字典
data.setdefault('info', {})
data['info'].setdefault('gender', 'male')
print(data)
这样的话,可以不断的丰富字典结构,程序也能适应更多类型的数据存储
数据内容存放搞定之后,就可以写入文件了,如果使用open方法打开文件,那记得要close掉,建议使用with open
print('读取结束,开始写入...')
response = open(r'绝对路径\res.py', 'w', encoding='utf-8')
response.write('allData=' + pprint.pformat(resdata))
print('写入结束')
response.close()
在指定位置产生存放数据的python文件
二、从存放数据的python文件当中获取数据直接写入excel文档
1、因为用使用单独python文件,所以一定要提前导入,两个文件放在同一路径下
import res
import openpyxl
from openpyxl.utils import column_index_from_string
2、如果有要求的格式文件,可以使用openpyxl的load_workbook方法打开,并指定操作的sheet
写入文件之前可以先用pycharm的插件分析分析结构,帮助我们更好捋清楚思路
wb = openpyxl.load_workbook(r'绝对路径\文件名称.xlsx')
ws = wb['Sheet1'] # 取出表单
for rowNum in range(5, ws.max_row + 1):
name = ws.cell(row=rowNum, column=column_index_from_string('E')).value
for k, v in res.allData.items(): # 一级字典
if name == k:
for k1, v1 in v.items(): # 二级字典
if k1 == '请假1' :
ws.cell(row=rowNum, column=column_index_from_string('S')).value = v1
if k1 == '请假2' :
ws.cell(row=rowNum, column=column_index_from_string('T')).value = v1
if k1 == '请假3':
ws.cell(row=rowNum, column=column_index_from_string('AF')).value = v1
if k1 == '请假4' :
ws.cell(row=rowNum, column=column_index_from_string('AK')).value = v1
if k1 == '请假5':
ws.cell(row=rowNum, column=column_index_from_string('AE')).value = v1
3、写入文件之后记得保存,可以结合自己的实际情况,写一写提示信息,这样用户的友好性就会更好
wb.save(filename=r'存放路径\导出结果.xlsx')
有数据的,直接会写入相对应的单元格,没有数据则为空
之后再需要整理数据的时候,点点鼠标运行一下程序直接搞定!
该文章仅用于学习交流,转载请注明出处,谢谢!