python合并多个excel表格:openpyxl模块(三)

【Python编程你也行】 专栏收录该内容
28 篇文章 0 订阅

一、写入excel文件基础

>>> import openpyxl
>>> wb=openpyxl.Workbook()  #创建新的工作簿,也就是一个新的excel文件

>>> wb.get_sheet_names()
['Sheet']

>>> sheet = wb.get_active_sheet() #获取当前的sheet
>>> sheet.title
'Sheet'

>>> sheet.title='sales'           #修改当前sheet的名称为sales
>>> wb.save('e:\\sales.xlsx')     #保存新建的工作簿到e盘,文件名是sales

>>> wb.create_sheet(index=0,title='t1') #创建一个新的sheet,索引号是0,名称是t1
<Worksheet "t1">

>>> wb.create_sheet()             #创建一个sheet,名字默认是Sheet
<Worksheet "Sheet">

>>> wb.create_sheet()             #再创建一个
<Worksheet "Sheet1">

>>> wb.create_sheet()             #再创建一个
<Worksheet "Sheet2">

>>> wb.create_sheet(index=1,title='t2') #创建新的sheet,索引号是1,名称t2
<Worksheet "t2">

#返回所有sheet,按照索引号排序
#由于t1和t2创建时指定索引号是0、1,所以最早系统创建的sheet,名称改为sales的索引号就被变成了2,排第3
>>> wb.get_sheet_names()
['t1', 't2', 'sales', 'Sheet', 'Sheet1', 'Sheet2']

>>> wb.remove_sheet(wb.get_sheet_by_name('sales'))  #删除sales、Sheet

>>> wb.remove_sheet(wb.get_sheet_by_name('Sheet'))  

>>> wb.get_sheet_names()
['t1', 't2', 'Sheet1', 'Sheet2']


二、合并两个sheet的数据

excel文件:e盘下的t.xlsx,包含两个2sheet:sales和store。

具体的数据,参考:python读取excel文件中所有sheet表格:openpyxl模块(二) 直接复制粘贴到excel就可以。


下面的代码会把store 和 sales两个sheet合并成一个新的sheet:store_sales,包含store的所有字段、sales中的年月和销量字段,最后写入到一个新的excel文件中:tt.xlsx。

基本思路:先从2个sheet读取数据,存在2个字典中,然后创建sheet:store_sales,然后再把两个字典的数据存入store_sales中

一开始想把2个sheet存入一个字典,比如:{ xx客户编码 : {xx年月:xx销量,xx年月:xx销量,客户名称:xx,总公司:xx,电话:xx,门店经理:xx} },按这种结构存入数据,但是再取出来的时候就很不灵活,因为本来这2种数据结构就是不同的,特别是sales,同一个客户编码在不同的年月,会有多条数据。

最后还是考虑分别存为2个字典,在取数据时,因为store 和 sales的共同之处就是 客户编码,这个是唯一的,所以dic2[r] 就可以取出 store中的相应客户编码的所有数据。

代码如下:

#  -*- coding:gbk -*-

import openpyxl

wb=openpyxl.load_workbook('e:\\t.xlsx')

sales = wb.get_sheet_by_name('sales')

dic1 = {}
dic2 = {}

#两个sheet分别存储在两个字典中
for i in range(2,sales.max_row+1):    
    dic1.setdefault(sales.cell(row=i,column=1).value,{sales.cell(row=i,column=2).value:0})
    dic1[sales.cell(row=i,column=1).value][sales.cell(row=i,column=2).value] = sales.cell(row=i,column=3).value
    
#print(dic1)


store = wb.get_sheet_by_name('store')

for i in range(2,store.max_row+1):
    dic2.setdefault(store.cell(row=i,column=2).value,{'name':'','mgr':'','tel':'','corp':''})
    dic2[store.cell(row=i,column=2).value]['name']=store.cell(row=i,column=1).value
    dic2[store.cell(row=i,column=2).value]['mgr']=store.cell(row=i,column=3).value
    dic2[store.cell(row=i,column=2).value]['tel']=store.cell(row=i,column=4).value
    dic2[store.cell(row=i,column=2).value]['corp']=store.cell(row=i,column=5).value
    
#print(dic2)


#创建工作簿,新建一个sheet:store_sales,设置表头字段
newwb = openpyxl.Workbook()

newwb.create_sheet(index=0,title='store_sales')

store_sales = newwb.get_sheet_by_name('store_sales')

store_sales.cell(row=1,column=1).value='客户名称'
store_sales.cell(row=1,column=2).value='客户编码'
store_sales.cell(row=1,column=3).value='门店经理'
store_sales.cell(row=1,column=4).value='联系电话'
store_sales.cell(row=1,column=5).value='总公司'
store_sales.cell(row=1,column=6).value='年月'
store_sales.cell(row=1,column=7).value='销售额(万元)'

iRow = 1

#遍历dict1
for r in dic1.keys():
    for k in dic1[r].keys():
        iRow += 1
        store_sales.cell(row=iRow,column=1).value = dic2[r]['name']
        store_sales.cell(row=iRow,column=2).value = r
        store_sales.cell(row=iRow,column=3).value = dic2[r]['mgr']
        store_sales.cell(row=iRow,column=4).value = dic2[r]['tel']
        store_sales.cell(row=iRow,column=5).value = dic2[r]['corp']
        store_sales.cell(row=iRow,column=6).value = k
        store_sales.cell(row=iRow,column=7).value =dic1[r][k]
   


  • 2
    点赞
  • 1
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值