Python建立Map写Excel表实例解析
本文主要研究的是用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. 需要将数据进行除运算外的处理。我们处理本例的需求时遇到的就是这种情况。
【需求】
将数据库中每个游戏的成交量、下单量、失败量取出来。写一张如下的表出来:
关键需要处理的问题是:每个游戏的三项数据,每项数据是单独对应一个SQL取出来的,即,每项单独取,排序是不一样的。
如果直接写到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表实例解析的全部内容,希望对大家有所帮助。
数据分析咨询请扫描二维码
在准备数据分析师面试时,掌握高频考题及其解答是应对面试的关键。为了帮助大家轻松上岸,以下是10个高频考题及其详细解析,外加 ...
2024-12-20互联网数据分析师是一个热门且综合性的职业,他们通过数据挖掘和分析,为企业的业务决策和运营优化提供强有力的支持。尤其在如今 ...
2024-12-20在现代商业环境中,数据分析师是不可或缺的角色。他们的工作不仅仅是对数据进行深入分析,更是协助企业从复杂的数据信息中提炼出 ...
2024-12-20随着大数据时代的到来,数据驱动的决策方式开始受到越来越多企业的青睐。近年来,数据分析在人力资源管理中正在扮演着至关重要的 ...
2024-12-20在数据分析的世界里,表面上的技术操作只是“入门票”,而真正的高手则需要打破一些“看不见的墙”。这些“隐形天花板”限制了数 ...
2024-12-19在数据分析领域,尽管行业前景广阔、岗位需求旺盛,但实际的工作难度却远超很多人的想象。很多新手初入数据分析岗位时,常常被各 ...
2024-12-19入门数据分析,许多人都会感到“难”,但这“难”究竟难在哪儿?对于新手而言,往往不是技术不行,而是思维方式、业务理解和实践 ...
2024-12-19在如今的行业动荡背景下,数据分析师的职业前景虽然面临一些挑战,但也充满了许多新的机会。随着技术的不断发展和多领域需求的提 ...
2024-12-19在信息爆炸的时代,数据分析师如同探险家,在浩瀚的数据海洋中寻觅有价值的宝藏。这不仅需要技术上的过硬实力,还需要一种艺术家 ...
2024-12-19在当今信息化社会,大数据已成为各行各业不可或缺的宝贵资源。大数据专业应运而生,旨在培养具备扎实理论基础和实践能力,能够应 ...
2024-12-19阿里P8、P9失业都找不到工作?是我们孤陋寡闻还是世界真的已经“癫”成这样了? 案例一:本硕都是 985,所学的专业也是当红专业 ...
2024-12-19CDA持证人Louis CDA持证人基本情况 我大学是在一个二线城市的一所普通二本院校读的,专业是旅游管理,非计算机非统计学。毕业之 ...
2024-12-18最近,知乎上有个很火的话题:“一个人为何会陷入社会底层”? 有人说,这个世界上只有一个分水岭,就是“羊水”;还有人说,一 ...
2024-12-18在这个数据驱动的时代,数据分析师的技能需求快速增长。掌握适当的编程语言不仅能增强分析能力,还能帮助分析师从海量数据中提取 ...
2024-12-17在当今信息爆炸的时代,数据分析已经成为许多行业中不可或缺的一部分。想要在这个领域脱颖而出,除了热情和毅力外,你还需要掌握 ...
2024-12-17数据分析,是一项通过科学方法处理数据以获取洞察并支持决策的艺术。无论是在商业环境中提升业绩,还是在科研领域推动创新,数据 ...
2024-12-17在数据分析领域,图表是我们表达数据故事的重要工具。它们不仅让数据变得更加直观,也帮助我们更好地理解数据中的趋势和模式。相 ...
2024-12-16在当今社会,我们身处着一个飞速发展、变化迅猛的时代。不同行业在科技进步、市场需求和政策支持的推动下蓬勃发展,呈现出令人瞩 ...
2024-12-16在现代商业世界中,数据分析师扮演着至关重要的角色。他们通过解析海量数据,为企业战略决策提供有力支持。要有效完成这项任务, ...
2024-12-16在当今数据爆炸的时代,数据分析师是组织中不可或缺的导航者。他们通过从大量数据中提取可操作的洞察力,帮助企业在竞争激烈的市 ...
2024-12-16