python操作EXCEL代码分享交流
以下代码实现将开通.xlsx、更换.xlsx两份表的部分内容汇总到通报.xlsx。过程中也会有一些数据格式的变换和匹配其他信息,代码如下。
写代码不难,难在优化代码效率,所以,欢迎各位破友拍砖、指教,欢迎交流。
import datetime
import time
from openpyxl import load_workbook
print("打开通报表")
toXlsx = load_workbook(filename='通报.xlsx')
toSheet = toXlsx['开通']
print("从通报表获得人员数据(用于匹配)")
toPersonnelSheet = toXlsx['个人统计']
toPersonnelSheetMaxRow = toPersonnelSheet.max_row
tupToColumnABC = toPersonnelSheet['A2':'C' + str(toPersonnelSheetMaxRow)]
# ### 第1份表 ###
print("打开开通源数据表")
formXlsx = load_workbook(filename='开通.xlsx', read_only=True)
formSheet = formXlsx['开通归档']
formSheetMaxRow = formSheet.max_row
print("获得开通源数据")
# 把要复制的列创建为元组
tupFormColumnD = formSheet['D2':'D' + str(formSheetMaxRow)]
tupFormColumnH = formSheet['H2':'H' + str(formSheetMaxRow)]
tupFormColumnI = formSheet['I2':'I' + str(formSheetMaxRow)]
tupFormColumnAU = formSheet['AU2':'AU' + str(formSheetMaxRow)]
tupFormColumnBB = formSheet['BB2':'BB' + str(formSheetMaxRow)]
print("写入开通数据")
for i in range(0, formSheetMaxRow - 1):
# 格式日期(把原来的日期yyyy/m/d H:M:S转换为yyyy-m-d)
thisDate = tupFormColumnAU.value.strftime('%Y-%m-%d')
# 判断业务类型
thisType = tupFormColumnH.value
thisTypeFormat = ""
if thisType == "手机宽带" or thisType == "手机宽带基础产品" or thisType == "宽带":
thisTypeFormat = "宽带"
elif thisType == "宽带电视基础产品":
thisTypeFormat = "电视"
elif thisType == "智能组网及增值收费服务基础产品":
thisTypeFormat = "组网"
elif thisType == "智慧管家基础安装服务":
thisTypeFormat = "安防"
elif thisType == "手机多媒体家庭电话属性产品":
thisTypeFormat = "电话"
elif thisType == "千兆":
thisTypeFormat = "千兆提速"
# 获得人员属性,根据人员名字,循环人员元组(toPersonnelSheetMaxRow),匹配出人员的区域(strRange)、来源(strAscription)
strName = tupFormColumnBB.value
strAscription = ""
strRange = ""
for row in range(0, toPersonnelSheetMaxRow - 1):
if tupToColumnABC.value == strName:
strAscription = tupToColumnABC.value
strRange = tupToColumnABC.value
break
# 并装
tupAddend = (tupFormColumnD.value, tupFormColumnH.value, tupFormColumnI.value,
tupFormColumnAU.value, tupFormColumnBB.value, thisDate, thisTypeFormat, strRange,
strAscription)
# 写入
toSheet.append(tupAddend)
print("开通数据写入完成,释放资源")
del tupFormColumnD, tupFormColumnH, tupFormColumnI, tupFormColumnAU, tupFormColumnBB
# 关闭开通源数据EXCEL表
formXlsx.close()
# ### 第2份表 ###
print("打开更换源数据表")
formXlsx = load_workbook(filename='更换.xlsx', read_only=True)
formSheet = formXlsx['历史工单']
formSheetMaxRow = formSheet.max_row
print("获得更换源数据")
# 把要复制的列创建为元组
tupFormColumnA = formSheet['A2':'A' + str(formSheetMaxRow)]
tupFormColumnBC = formSheet['BC2':'BC' + str(formSheetMaxRow)]
tupFormColumnDC = formSheet['DC2':'DC' + str(formSheetMaxRow)]
tupFormColumnEF = formSheet['EF2':'EF' + str(formSheetMaxRow)]
tupFormColumnHU = formSheet['HU2':'HU' + str(formSheetMaxRow)]
# 删除(清空)原有数据
toSheet = toXlsx['速率整改']
toSheetMaxRow = toSheet.max_row
toSheet.delete_rows(2, toSheet.max_row)
print("写入更换数据")
# 获得现在日期
strNow = time.localtime(time.time())
for i in range(0, formSheetMaxRow - 1):
# 如果tupFormColumnEF不为空
if tupFormColumnEF.value is not None:
# 如果tupFormColumnHU为是,且tupFormColumnEF(日期)的月份等于本月
if tupFormColumnHU.value == "是" and int(tupFormColumnEF.value.strftime('%m')) == strNow:
# 格式日期(把原来的日期yyyy/m/d H:M:S转换为yyyy-m-d)
thisDate = tupFormColumnEF.value.strftime('%Y-%m-%d')
# 获得人员属性,根据人员名字,循环人员元组(toPersonnelSheetMaxRow),匹配出人员的区域(strRange)、来源(strAscription)
strName = tupFormColumnDC.value
strAscription = ""
strRange = ""
for row in range(0, toPersonnelSheetMaxRow - 1):
if tupToColumnABC.value == strName:
strAscription = tupToColumnABC.value
strRange = tupToColumnABC.value
break
# 并装
tupAddend = (tupFormColumnA.value, tupFormColumnBC.value, tupFormColumnDC.value,
tupFormColumnEF.value, thisDate, strRange, strAscription)
# 写入
toSheet.append(tupAddend)
# 更新报表日期
toNotificationSheet = toXlsx['通报统计']
localtime = yesterday = datetime.date.today() + datetime.timedelta(-1)
toNotificationSheet['C1'] = yesterday
# 保存目标EXCEL表
toXlsx.save('通报.xlsx')
# 关闭两个EXCEL表
formXlsx.close()
toXlsx.close()
本帖最后由 无闻无问 于 2020-11-27 13:17 编辑
木木小白 发表于 2020-11-27 13:14
pthon较VBA有什么优势吗?目前在学习VBA中,python没接触过。
vba和office是微软自家的,你认为哪种处理自家的东西好?别问好不好,问多了让自己晕,工具而已,合适,顺手就好… 无闻无问 发表于 2020-11-27 13:16
vba和office是微软自家的,你认为哪种处理自家的东西好?别问好不好,问多了让自己晕,工具而已,合适, ...
感谢指教。 数据量级没有到需要优化效率的地步吧。到了的话,直接更换数据库存放数据不是更方便。 没看到源文件,不太清楚楼主的需求。单从编码效率来说,使用Pandas库应该更方便 使用环境决定是否有需要优化 这个意思是把.xlsx文件当作源数据了,那如果文件被打开或者被占用,文件在读取时更改数据了。那是不是会有其他影响发生? pthon较VBA有什么优势吗?目前在学习VBA中,python没接触过。 分享的源码注释很详细,很适合新手的小白学习 学习一下,谢谢楼主分享
页:
[1]
2