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中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python随机读取文件实现实例
May 25 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
May 04 Python
mac使用python识别图形验证码功能
Jan 10 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
Python 如何对文件目录操作
Jul 10 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 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
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
js计算页面刷新的次数
2009/07/20 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
Python实现图片转字符画的示例
2017/08/22 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
python已协程方式处理任务实现过程
2019/12/27 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
进修护士自我鉴定
2013/10/14 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
公司开业主持词
2015/07/02 职场文书
小学毕业感言200字
2015/07/30 职场文书
敬业奉献模范事迹材料(2016精选版)
2016/02/26 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python