Python建立Map写Excel表实例解析


Posted in Python onJanuary 17, 2018

本文主要研究的是用Python语言建立Map写Excel表的相关代码,具体如下。

前言:我们已经能够很熟练的写Excel表相关的脚本了。大致的操作就是,从数据库中取数据,建立Excel模板,然后根据模板建立一个新的Excel表,把数据库中的数据写入。最后发送邮件。之前的一篇记录博客,写的很标准了。这里我们说点遇到的新问题。

我们之前写类似脚本的时候,有个问题没有考虑过,为什么要建立模板然后再写入数据呢?诶…其实也不算是没考虑过,只是懒没有深究罢了。只求快点完成任务。。。

这里对这个问题进行思考阐述!

【为什么要建立Excel表模板?】

建立Excel模板,是涉及到历史数据才要建立模板的,为什么呢?

如果,我们需要一份数据表,这个表中是本月的数据,每天跑一行出来。到了下个月,就需要新建下一个月的表。

这样以后进行数据统计的时候,我们只需要拿到每个月的最后一天的那份数据表就可以了,因为最后一天的数据表包含了当月的所有数据。

对于这样一个需求,脚本中的代码在月份改变时,肯定要新建一个表,不再将原来的表作为模板来写。

自然,下一个月的表肯定不能把上一个月的数据带进去,所以肯定需要新写表头。

这里往深了思考,就涉及到了另外一个问题。

【建立Excel模板的方法的本质】

def createTemplateExcel():
 '''创建Excel文件模板'''
 wb = xlwt.Workbook(encoding = "UTF-8", style_compression = True)
 sht0 = wb.add_sheet("线上", cell_overwrite_ok = True)
 sht0.col(0).width=4000
 sht0.write(0, 0, '游戏名称', style1)
 sht0.write(0, 1, '渠道', style1)
 sht0.write(0, 2, '成交量', style1)
 sht0.write(0, 3, '下单量', style1)
 sht0.write(0, 4, '失败量', style1)

 sht1 = wb.add_sheet("线下", cell_overwrite_ok = True)
 sht1.col(0).width=4000
 sht1.write(0, 0, '游戏名称', style1)
 sht1.write(0, 1, '成交量', style1)
 sht1.write(0, 2, '下单量', style1)
 sht1.write(0, 3, '失败量', style1)
 return wb
 或者
 wb.save(tempFileName)

这个所谓的建立模板的方法做了什么事情呢?
只是建立了自定义名字的sheet,然后将表头写进去了而已。所以建立模板的方法本质上实际上就是写表头。

我们可以return wb,也可以wb.save(tempFileName)

即,我们可以把写好的表头直接return,接着下面的写数据的方法用。

也可以,直接保存一个模板Excel表出来放在脚本后台用。每次需要写新表的时候就去调用生成的模板。

这里的问题还可以更加深。。。

【有了写表头的所谓建立模板方法,保存模板文件是否还有必要?】

其实又是个平衡问题。我们是每次调方法来写表头,消耗运行时间。还是直接调用已经写好的模板文件呢?直接调用虽然快,但是模板文件会占用脚本后台的空间。

怎么样划算呢?选时间还是空间?

而且有个问题,写一定就比调用慢吗?如果写比调用快,既省时间又省空间,只不过代码中多了个写表头的方法而已。

还方便后期维护。

说到这里,就有一个矛盾的地方了。我们既然已经有了写表头的操作了。还需要把它保存为模板文件放起来吗?

每次运行的时候直接写不就行了吗?为什么还要保存?

保存起来除了占空间,用于调用(实质上完全可以不调用直接写),还有什么用呢?

这是一个值得改进的地方。。。吧

【关于建立模板方法相关的个人暂处理办法】

目前我自己能够想到的方法是,以后不再额外保存模板文件出来。写表头就是写表头,直接return,和后面的方法串起来就可以了。

每次月份改变的时候,即到了该月第一天写该月的第一张表的时候,去调用这个写表头的方法就可以了。

好了,第一个问题过去。接下来阐述第二个问题?

【从数据库取数据,进行处理以后,再写入】

我们之前写Excel表的时候,大多数的情况是,直接将取到的数据写入Excel表对应位置。

取数据都是一样的方法模板。数据处理发生在写入的时候。遇到过的,需要处理的情况有两种:

1. 需要调用Excel相关函数,比如SUM等。需要用到这个

xlwt.Formula

2. 需要将数据进行除运算外的处理。我们处理本例的需求时遇到的就是这种情况。

【需求】

将数据库中每个游戏的成交量、下单量、失败量取出来。写一张如下的表出来:

Python建立Map写Excel表实例解析

关键需要处理的问题是:每个游戏的三项数据,每项数据是单独对应一个SQL取出来的,即,每项单独取,排序是不一样的。

如果直接写到Excel表中,是这样子的

Python建立Map写Excel表实例解析

可以看到,排序是乱的。我们需要把这些数据按名字进行一一对应的处理,生成一张第一个图所示的表出来。

这里就是数据处理需要用什么方法的问题?

【如何进行数据处理?】

之前想到的方法是:

def writeInfo0(sht, rs, length, rs2, length2, rs3, length3):
 '''写入线上具体数据'''
 for j in range(length2):
  sht.write(j+1, 0, str(rs2[j][0]).decode('utf-8'), style1)
  sht.write(j+1, 1, str(rs2[j][1]).decode('utf-8'), style1)
  sht.write(j+1, 3, rs2[j][2], style1)

 for j in range(length2):
  for i in range(length):
   if (str(rs[i][0])==str(rs2[j][0])) and (str(rs[i][1])==str(rs2[j][1])):
    sht.write(j+1, 2, rs[i][2], style1)

 for j in range(length2):
  for k in range(length3):
   if (str(rs3[k][0])==str(rs2[j][0])) and (str(rs3[k][1])==str(rs2[j][1])):
    sht.write(j+1, 4, rs3[k][2], style1)

直接进行写入。先写入最多的 ,然后写入较少的。而较少的两项写入时,根据名字的对应,放在对应的位置。
这样写可以,但是有两个问题:

1. 我们需要没有数据的地方显示为零。怎么判断并写入呢?是个问题,而且还挺麻烦的。

2. 我们需要数据完备,即,能够保证最多的那项数据中的游戏就是所有了吗?会不会每项数据对应的数据,都有自己独有的游戏。

如果,最多的游戏条目数据中确实是没有包含所有,这就是致命的错误了。数据缺失不是小事儿。

还不止这个,我们能够保证,这个时候最多的,明天还是最多吗?如果明天变成了最少,就会有很多数据因为名称匹配不到而没有写入。

还是数据缺失,很致命的问题。

所以,这种方法,是有很多漏洞和缺陷的。不可行!

【建立字典DICT处理数据】

比较理想的处理方法,也是我们最终采用的方法,是将所有数据取出来放入一个字典中。

在放入的过程中,进行数据的整理。即,如果有这个游戏,就直接赋值。如果没有,新建一个key,然后写入。

字典建立好了,包含了所有的数据了,再进行写入。是比较可靠的。

这种方法的关键点有两个:

1. 如何在写入的时候进行处理?

2. DICT建立好后,如何进行写入?

我们一个一个说。

【如何在写入的时候,建立DICT处理数据?】

先以比较简单的线下数据写入为例,进行说明。

def getInfo1(rs, rs2, rs3):
 dict={}
 for i in range(len(rs)):
  key=str(rs[i][0])
  value=rs[i][1]
  dict[key]=[value, 0, 0]

 dlist=list(dict.keys())
 for i in range(len(rs2)):
  key2=str(rs2[i][0])
  value2=rs2[i][1]
  if key2 in dlist:
   value=dict[key2][0]
  else:
   value=0
  dict[key2]=[value, value2, 0]

 dlist=list(dict.keys())
 for i in range(len(rs3)):
  key3=str(rs3[i][0])
  value3=rs3[i][1]
  if key3 in dlist:
   value=dict[key3][0]
   value2=dict[key3][1]
  else:
   value=0
   value2=0
  dict[key3]=[value, value2, value3]
 return dict

接收来的rs数据是list,一个游戏对应一个数据的那种。

我们这样处理,将游戏名赋给key,将数据赋给value。循环遍历,建立一个DICT出来。

接下来是关键的逻辑:如果有,直接赋值;如果没有,新建一个key,再写入。

而这个关键逻辑中更为关键的逻辑是,如何判断原来的key中有没有。

处理方法是这样的

dlist=list(dict.keys())
for i in range(len(rs2)):

if key2 in dlist: value=dict[key2][0] else: value=0 dict[key2]=[value, value2, 0] 如果有的话,第一个value的值,从当前状态的DICT中取。

如果没有的话,value直接取0。

最后,直接

dict[key2]=[value, value2, 0]

即,key都是当下建立的。我们只需要在乎value的值就可以了。

【疑问】

这就有个疑问了,不会出现重复建立key的情况吗?

不会。因为

dict[key2]=[value, value2, 0]

这句代码,这个=的符号。本来就有赋值和新建两重用法。如果没有!就是新建,如果有了!就是改变。

只是改变的时候,我们需要把原来的值也带进去罢了。这个原来的值是从已经有DICT中取到的。。。罢了。

接下来,更为复杂的代码也就可以理解了。

dlist=list(dict.keys())
for i in range(len(rs3)):
 key3=str(rs3[i][0])
 value3=rs3[i][1]
 if key3 in dlist:
  value=dict[key3][0]
  value2=dict[key3][1]
 else:
  value=0
  value2=0
 dict[key3]=[value, value2, value3]
return dict

第三项数据出现时建立DICT的情况如上所示。

需要顾及到两项已经写好的数据,而已。

【如何将DICT写入Excel表】

def writeInfo1(sht, dict):
 '''写入线下具体数据'''
 dlist=list(dict.keys())
 for i in range(len(dlist)):
  sht.write(i+1, 0, str(dlist[i]).decode('utf-8'), style1)
  sht.write(i+1, 1, dict[dlist[i]][0], style1)
  sht.write(i+1, 2, dict[dlist[i]][1], style1)
  sht.write(i+1, 3, dict[dlist[i]][2], style1)

其实就是字典的层层剥取的方法。

关键就是拿到数据而已,拿到了直接写入!

再稍复杂的DICT,处理线上数据时,我们的键有两个,值有三个。

我们知道,字典这种数据类型,值可以为包含了多个数据的数组,但是键只能够有一个,且不能为数组。

该怎么处理呢?我们只能将多个键合并为一个键,然后在写入的时候拆开。

关键问题,就是合并和拆分。

【键的合并】

key=str(rs[i][0])+'--'+str(rs[i][1])

对,仅此而已。把两个数据连到一起。合并为一个字符串。

【写入时键的拆分】

sht.write(i+1, 0, str(dlist[i]).decode('utf-8').split('--')[0], style1)
sht.write(i+1, 1, str(dlist[i]).decode('utf-8').split('--')[1], style1)

用split函数。

split函数对字符串的拆分,拆分结果是数组。按数组编号来取分开的数据就可以了。

至此,这个需求的关键问题都已经说明完毕。

最后贴一份完整代码如下。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

__author__ = "$Author: wangxin.xie$"
__version__ = "$Revision: 1.0 $"
__date__ = "$Date: 2018$"

###############################################################
#功能: 订单情况相关报表
###############################################################
import sys
import datetime
import xlwt
from myyutil.DBUtil import DBUtil
reload(sys)
sys.setdefaultencoding('utf8')
#######################全局变量####################################

orderDBUtil = DBUtil('moyoyo_order')

fileDir = 'D://'
fileName = fileDir+'order_message_test2.xls'

style1 = xlwt.XFStyle()
font1 = xlwt.Font()
font1.height = 220
font1.name = 'SimSun'
style1.font = font1

##################################################################
def createTemplateExcel():
 '''创建Excel文件模板'''
 wb = xlwt.Workbook(encoding = "UTF-8", style_compression = True)
 sht0 = wb.add_sheet("线上", cell_overwrite_ok = True)
 sht0.col(0).width=4000
 sht0.write(0, 0, '游戏名称', style1)
 sht0.write(0, 1, '渠道', style1)
 sht0.write(0, 2, '成交量', style1)
 sht0.write(0, 3, '下单量', style1)
 sht0.write(0, 4, '失败量', style1)

 sht1 = wb.add_sheet("线下", cell_overwrite_ok = True)
 sht1.col(0).width=4000
 sht1.write(0, 0, '游戏名称', style1)
 sht1.write(0, 1, '成交量', style1)
 sht1.write(0, 2, '下单量', style1)
 sht1.write(0, 3, '失败量', style1)
 return wb

def genSuccessOrderOnline():
 sql = '''
  SELECT A.GAME_NAME,
  A.GOODS_NAME,
  COUNT(B.ORDER_ID)
  FROM moyoyo_order.BASE_INFO B
  INNER JOIN moyoyo_order.ACCOUNT_INFO A ON B.ORDER_ID = A.ORDER_ID
  INNER JOIN netgame_trade.GOODS G ON A.GOODS_ID = G.ID
  LEFT JOIN moyoyo_order.RELATION_INFO R ON B.ORDER_ID = R.PARENT_ORDER_ID
  WHERE B.COMPLETE_DATE >= DATE_SUB(NOW(), INTERVAL 7 DAY)
  AND B.COMPLETE_DATE < NOW()
  AND A.CS_ADMIN_ID != 241
  AND A.GOODS_ID != 1213
  AND G.GOODS_TYPE_ID != 6
  AND A.GOODS_IS_OFFLINE = 0
  AND A.IS_B2C IS NULL
  AND (
   (
    A.GOODS_ID IN (1240, 1241, 1608)
    AND B.SELLER_ID IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   ) OR (
    B.SELLER_ID NOT IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   )
  )
  AND R.PARENT_ORDER_ID IS NULL
  AND B.SELLER_ID NOT IN (693356, 14791127)
  AND B.STATUS = 1
  AND B.TRADE_STATUS = 4
  AND B.TYPE = 1
  GROUP BY A.GAME_ID, G.GOODS_CHANNEL_ID
  ORDER BY COUNT(B.ORDER_ID) DESC;
 '''
 rs = orderDBUtil.queryList(sql, ())
 if not rs: return None
 return rs

def genGenerateOrderOnline():
 sql = '''
  SELECT A.GAME_NAME,
  A.GOODS_NAME,
  COUNT(B.ORDER_ID)
  FROM moyoyo_order.BASE_INFO B
  INNER JOIN moyoyo_order.ACCOUNT_INFO A ON B.ORDER_ID = A.ORDER_ID
  INNER JOIN netgame_trade.GOODS G ON A.GOODS_ID = G.ID
  LEFT JOIN moyoyo_order.RELATION_INFO R ON B.ORDER_ID = R.PARENT_ORDER_ID
  WHERE B.CREATED_DATE >= DATE_SUB(NOW(), INTERVAL 7 DAY)
  AND B.CREATED_DATE < NOW()
  AND A.CS_ADMIN_ID != 241
  AND A.GOODS_ID != 1213
  AND G.GOODS_TYPE_ID != 6
  AND A.GOODS_IS_OFFLINE = 0
  AND A.IS_B2C IS NULL
  AND (
   (
    A.GOODS_ID IN (1240, 1241, 1608)
    AND B.SELLER_ID IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   ) OR (
    B.SELLER_ID NOT IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   )
  )
  AND R.PARENT_ORDER_ID IS NULL
  AND B.SELLER_ID NOT IN (693356, 14791127)
  AND B.STATUS = 1
  AND B.TYPE = 1
  GROUP BY A.GAME_ID, G.GOODS_CHANNEL_ID
  ORDER BY COUNT(B.ORDER_ID) DESC;
 '''
 rs = orderDBUtil.queryList(sql, ())
 if not rs: return None
 return rs

def genFailOrderOnline():
 sql = '''
  SELECT A.GAME_NAME,
  A.GOODS_NAME,
  COUNT(B.ORDER_ID)
  FROM moyoyo_order.BASE_INFO B
  INNER JOIN moyoyo_order.ACCOUNT_INFO A ON B.ORDER_ID = A.ORDER_ID
  INNER JOIN netgame_trade.GOODS G ON A.GOODS_ID = G.ID
  LEFT JOIN moyoyo_order.RELATION_INFO R ON B.ORDER_ID = R.PARENT_ORDER_ID
  WHERE B.COMPLETE_DATE >= DATE_SUB(NOW(), INTERVAL 7 DAY)
  AND B.COMPLETE_DATE < NOW()
  AND A.CS_ADMIN_ID != 241
  AND A.GOODS_ID != 1213
  AND G.GOODS_TYPE_ID != 6
  AND A.GOODS_IS_OFFLINE = 0
  AND A.IS_B2C IS NULL
  AND (
   (
    A.GOODS_ID IN (1240, 1241, 1608)
    AND B.SELLER_ID IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   ) OR (
    B.SELLER_ID NOT IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   )
  )
  AND R.PARENT_ORDER_ID IS NULL
  AND B.SELLER_ID NOT IN (693356, 14791127)
  AND B.STATUS = 1
  AND B.TRADE_STATUS = 5
  AND B.TYPE = 1
  GROUP BY A.GAME_ID, G.GOODS_CHANNEL_ID
  ORDER BY COUNT(B.ORDER_ID) DESC;
 '''
 rs = orderDBUtil.queryList(sql, ())
 if not rs: return None
 return rs

def genSuccessOrderOffline():
 sql = '''
  SELECT A.GAME_NAME,
  COUNT(B.ORDER_ID)
  FROM moyoyo_order.BASE_INFO B
  INNER JOIN moyoyo_order.ACCOUNT_INFO A ON B.ORDER_ID = A.ORDER_ID
  INNER JOIN netgame_trade.GOODS G ON A.GOODS_ID = G.ID
  LEFT JOIN moyoyo_order.RELATION_INFO R ON B.ORDER_ID = R.PARENT_ORDER_ID
  WHERE B.COMPLETE_DATE >= DATE_SUB(NOW(), INTERVAL 7 DAY)
  AND B.COMPLETE_DATE < NOW()
  AND A.CS_ADMIN_ID != 241
  AND A.GOODS_ID != 1213
  AND G.GOODS_TYPE_ID != 6
  AND A.GOODS_IS_OFFLINE = 1
  AND A.IS_B2C IS NULL
  AND (
   (
    A.GOODS_ID IN (1240, 1241, 1608)
    AND B.SELLER_ID IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   ) OR (
    B.SELLER_ID NOT IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   )
  )
  AND R.PARENT_ORDER_ID IS NULL
  AND B.SELLER_ID NOT IN (693356, 14791127)
  AND B.STATUS = 1
  AND B.TRADE_STATUS = 4
  AND B.TYPE = 1
  GROUP BY A.GAME_ID
  ORDER BY COUNT(B.ORDER_ID) DESC;
  '''
 rs = orderDBUtil.queryList(sql, ())
 if not rs: return None
 return rs

def genGenerateOrderOffline():
 sql = '''
  SELECT A.GAME_NAME,
  COUNT(B.ORDER_ID)
  FROM moyoyo_order.BASE_INFO B
  INNER JOIN moyoyo_order.ACCOUNT_INFO A ON B.ORDER_ID = A.ORDER_ID
  INNER JOIN netgame_trade.GOODS G ON A.GOODS_ID = G.ID
  LEFT JOIN moyoyo_order.RELATION_INFO R ON B.ORDER_ID = R.PARENT_ORDER_ID
  WHERE B.CREATED_DATE >= DATE_SUB(NOW(), INTERVAL 7 DAY)
  AND B.CREATED_DATE < NOW()
  AND A.CS_ADMIN_ID != 241
  AND A.GOODS_ID != 1213
  AND G.GOODS_TYPE_ID != 6
  AND A.GOODS_IS_OFFLINE = 1
  AND A.IS_B2C IS NULL
  AND (
   (
    A.GOODS_ID IN (1240, 1241, 1608)
    AND B.SELLER_ID IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   ) OR (
    B.SELLER_ID NOT IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   )
  )
  AND R.PARENT_ORDER_ID IS NULL
  AND B.SELLER_ID NOT IN (693356, 14791127)
  AND B.STATUS = 1
  AND B.TYPE = 1
  GROUP BY A.GAME_ID
  ORDER BY COUNT(B.ORDER_ID) DESC;
 '''
 rs = orderDBUtil.queryList(sql, ())
 if not rs: return None
 return rs

def genFailOrderOffline():
 sql = '''
  SELECT A.GAME_NAME,
  COUNT(B.ORDER_ID)
  FROM moyoyo_order.BASE_INFO B
  INNER JOIN moyoyo_order.ACCOUNT_INFO A ON B.ORDER_ID = A.ORDER_ID
  INNER JOIN netgame_trade.GOODS G ON A.GOODS_ID = G.ID
  LEFT JOIN moyoyo_order.RELATION_INFO R ON B.ORDER_ID = R.PARENT_ORDER_ID
  WHERE B.COMPLETE_DATE >= DATE_SUB(NOW(), INTERVAL 7 DAY)
  AND B.COMPLETE_DATE < NOW()
  AND A.CS_ADMIN_ID != 241
  AND A.GOODS_ID != 1213
  AND G.GOODS_TYPE_ID != 6
  AND A.GOODS_IS_OFFLINE = 1
  AND A.IS_B2C IS NULL
  AND (
   (
    A.GOODS_ID IN (1240, 1241, 1608)
    AND B.SELLER_ID IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   ) OR (
    B.SELLER_ID NOT IN (
     SELECT MEMBER_ID
     FROM netgame_trade.B2C_MEMBER
    )
   )
  )
  AND R.PARENT_ORDER_ID IS NULL
  AND B.SELLER_ID NOT IN (693356, 14791127)
  AND B.STATUS = 1
  AND B.TRADE_STATUS = 5
  AND B.TYPE = 1
  GROUP BY A.GAME_ID
  ORDER BY COUNT(B.ORDER_ID) DESC;
 '''
 rs = orderDBUtil.queryList(sql, ())
 if not rs: return None
 return rs

def getInfo0(rs, rs2, rs3):
 dict={}
 for i in range(len(rs)):
  key=str(rs[i][0])+'--'+str(rs[i][1])
  value=rs[i][2]
  dict[key]=[value, 0, 0]

 dlist=list(dict.keys())
 for i in range(len(rs2)):
  key2=str(rs2[i][0])+'--'+str(rs2[i][1])
  value2=rs2[i][2]
  if key2 in dlist:
   value=dict[key2][0]
  else:
   value=0
  dict[key2]=[value, value2, 0]

 dlist=list(dict.keys())
 for i in range(len(rs3)):
  key3=str(rs3[i][0])+'--'+str(rs3[i][1])
  value3=rs3[i][2]
  if key3 in dlist:
   value=dict[key3][0]
   value2=dict[key3][1]
  else:
   value=0
   value2=0
  dict[key3]=[value, value2, value3]
 return dict

def writeInfo0(sht, dict):
 '''写入线上具体数据'''
 dlist=list(dict.keys())
 for i in range(len(dlist)):
  sht.write(i+1, 0, str(dlist[i]).decode('utf-8').split('--')[0], style1)
  sht.write(i+1, 1, str(dlist[i]).decode('utf-8').split('--')[1], style1)
  sht.write(i+1, 2, dict[dlist[i]][0], style1)
  sht.write(i+1, 3, dict[dlist[i]][1], style1)
  sht.write(i+1, 4, dict[dlist[i]][2], style1)

def getInfo1(rs, rs2, rs3):
 '''拿到线下具体数据'''
 dict={}
 for i in range(len(rs)):
  key=str(rs[i][0])
  value=rs[i][1]
  dict[key]=[value, 0, 0]

 dlist=list(dict.keys())
 for i in range(len(rs2)):
  key2=str(rs2[i][0])
  value2=rs2[i][1]
  if key2 in dlist:
   value=dict[key2][0]
  else:
   value=0
  dict[key2]=[value, value2, 0]

 dlist=list(dict.keys())
 for i in range(len(rs3)):
  key3=str(rs3[i][0])
  value3=rs3[i][1]
  if key3 in dlist:
   value=dict[key3][0]
   value2=dict[key3][1]
  else:
   value=0
   value2=0
  dict[key3]=[value, value2, value3]
 return dict

def writeInfo1(sht, dict):
 '''写入线下具体数据'''
 dlist=list(dict.keys())
 for i in range(len(dlist)):
  sht.write(i+1, 0, str(dlist[i]).decode('utf-8'), style1)
  sht.write(i+1, 1, dict[dlist[i]][0], style1)
  sht.write(i+1, 2, dict[dlist[i]][1], style1)
  sht.write(i+1, 3, dict[dlist[i]][2], style1)


def writeExcel():
 '''写报表'''
 wb = createTemplateExcel()

 rs=genSuccessOrderOnline()
 rs2=genGenerateOrderOnline()
 rs3=genFailOrderOnline()

 sheet0 = wb.get_sheet(0)
 dict0=getInfo0(rs, rs2, rs3)
 writeInfo0(sheet0, dict0)

 rs4=genSuccessOrderOffline()
 rs5=genGenerateOrderOffline()
 rs6=genFailOrderOffline()

 sheet1 = wb.get_sheet(1)
 dict1=getInfo1(rs4, rs5, rs6)
 writeInfo1(sheet1, dict1)

 wb.save(fileName)

def main():
 print "===%s start===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))
 writeExcel()
 print "===%s end===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))

if __name__ == '__main__':
 try:
  main()
 finally:
  if orderDBUtil: orderDBUtil.close()

总结

以上就是本文关于Python建立Map写Excel表实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
理解Python垃圾回收机制
Feb 12 Python
Python 类的继承实例详解
Mar 25 Python
python之pandas用法大全
Mar 13 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
May 08 Python
Python中Proxypool库的安装与配置
Oct 19 Python
python设置随机种子实例讲解
Sep 12 Python
解决pyshp UnicodeDecodeError的问题
Dec 06 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
python3 字符串知识点学习笔记
Feb 08 Python
Python logging日志模块 配置文件方式
Jul 12 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 21 Python
Python冲顶大会 快来答题!
Jan 17 #Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
Jan 17 #Python
python thrift搭建服务端和客户端测试程序
Jan 17 #Python
Python元字符的用法实例解析
Jan 17 #Python
Python工程师面试必备25条知识点
Jan 17 #Python
python根据unicode判断语言类型实例代码
Jan 17 #Python
Python线性方程组求解运算示例
Jan 17 #Python
You might like
解析crontab php自动运行的方法
2013/06/24 PHP
简单的php文件上传(实例)
2013/10/27 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
jquery replace方法去空格
2017/05/08 jQuery
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
pytorch标签转onehot形式实例
2020/01/02 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
《九色鹿》教学反思
2014/02/27 职场文书
公司管理建议书范文
2014/03/12 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
instantclient客户端 连接oracle数据库
2022/04/26 Oracle