版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yupeigu/article/details/53573231
一、写入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]