Python进行Excel数据处理

前两天GF让用Python写个Excel表格处理脚本,在这里记录一下。某公司有个数据统计汇总表格,仅为初表,复制粘贴汇总而来。初表中,存在同一员工推荐多套商品以及各自金额,目标呢:合并同类项,并把推荐数量和金额进行累加。文字解释不太清楚,上图说话。
原始图片 original
原始图片
目标图片 final
在这里插入图片描述

思路

Step 1: 涉及excel文件的读写,在此使用openpyxl或者xlrd和xlwt组合,需要了解其中的方法和单元格操作。
Step 2: 需要进行人名和推荐数量配对,以及累计金额的累加,在此使用字典数据类型。此外由于存在推荐多套的情况,在此需要进行一键对多值的映射,对于字典中值的初始化,使用列表方便改变数量。
Step 3:在“累计认购金额”条目,需要注意单元格内的内容格式是数字类型还是文本类型,如果是数字类型,可以使用sum函数累加,如果是文本类型,需要使用int函数转化为数值在累加,也可使用map函数进行字符到数字的映射。

实现

1. 使用openpyxl

# By WDL 2020-3-31
from openpyxl import Workbook, load_workbook
wb= load_workbook("XXX公司推荐成交明细.xlsx")
ws=wb["Sheet1"]#也可以使用wb.get_sheet_by_name("Sheet1") 获取工作表
# 读取数据,把excel中的一个table按行读取出来,存入一个二维的list
total_list=[]
for row in ws.rows:
    row_list=[]
    for cell in row:
        row_list.append(cell.value)
    total_list.append(row_list)
# 利用字典进行数据统计
namedict={}
valuedict={}
for term in total_list:
    if term[1] == None or term[1] == "员工姓名":# 员工姓名列
        continue
    else:
        namedict[term[1]]=namedict.get(term[1],0)+1
        valuedict.setdefault(term[1],[]).append(term[-1]) #一键 对多值的字典

#保存写操作
newwb = Workbook()
newsheet=newwb.active
newsheet.title="Sheet1"
#表头
newsheet["A1"]=total_list[0][0]
newsheet.merge_cells("A1:C1") #合并单元格
newsheet["A2"]="员工姓名"
newsheet["B2"]="推荐数量"
newsheet["C2"]="累计认购金额"

#单元格
i=3
for name in namedict:
    newsheet.cell(row=i,column=1).value=name
    newsheet.cell(row=i, column=2).value=namedict[name]
    newsheet.cell(row=i, column=3).value =sum(valuedict[name])
    i=i+1
newwb.save("XXX公司推荐成交明细_final.xlsx")

2. 使用xlrd和xlwt

# By WDL 2020-3-31
import xlrd,xlwt
wb=xlrd.open_workbook("XXX公司推荐成交明细.xlsx")
ws=wb.sheet_by_index(0)
print(ws.row_values(2)) #每一行作为一个列表
total_list=[]
for row in range(ws.nrows):
    row_list=ws.row_values(row)
    total_list.append(row_list)
namedict={}
for items in total_list:
    if items[1]==None or items[1]=="员工姓名":
        continue
    else:
        if items[1] in namedict.keys():
            namedict[items[1]]["推荐数量"]  += 1
            namedict[items[1]]["累计认购金额"] +=items[-1]
        else:
            namedict.setdefault(items[1], {})
            namedict[items[1]].setdefault("推荐数量",1)
            namedict[items[1]].setdefault("累计认购金额", items[-1])
# 写操作
wb = xlwt.Workbook()
ws = wb.add_sheet("Sheet1")
ws.write(0,0,label ="test")
wb.save("测试.xls") #xlwt貌似只支持xls格式

xlrd和xlwt模式没有写全,本人太懒,有兴趣的朋友可以自己试着补全。需要注意,xlwt貌似只支持保存为.xls的表格。并且,在第二种方法中,使用了字典的嵌套,第一层字典的键为名字,值为字典。

总结

openpyxl和xlrd/xlwt中需要注意单元格的索引,openpyxl单元格行列编号从1开始,而xlrd/xlwt的编号从0开始。其他关于字体格式,以及自动化识别的操作,本人太懒没再研究。

[1]: openpyxl 的使用 - excel中数据转成列表/ 字典https://blog.csdn.net/GYK0812/article/details/104380629/
[2]: Python Openpyxl快速入门教程 https://blog.csdn.net/qq_33353186/article/details/79191069

  • 13
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值