欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python建立Map寫(xiě)Excel表實(shí)例解析

 更新時(shí)間:2018年01月17日 14:37:05   作者:AKAK714  
這篇文章主要介紹了Python建立Map寫(xiě)Excel表實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文主要研究的是用Python語(yǔ)言建立Map寫(xiě)Excel表的相關(guān)代碼,具體如下。

前言:我們已經(jīng)能夠很熟練的寫(xiě)Excel表相關(guān)的腳本了。大致的操作就是,從數(shù)據(jù)庫(kù)中取數(shù)據(jù),建立Excel模板,然后根據(jù)模板建立一個(gè)新的Excel表,把數(shù)據(jù)庫(kù)中的數(shù)據(jù)寫(xiě)入。最后發(fā)送郵件。之前的一篇記錄博客,寫(xiě)的很標(biāo)準(zhǔn)了。這里我們說(shuō)點(diǎn)遇到的新問(wèn)題。

我們之前寫(xiě)類似腳本的時(shí)候,有個(gè)問(wèn)題沒(méi)有考慮過(guò),為什么要建立模板然后再寫(xiě)入數(shù)據(jù)呢?誒…其實(shí)也不算是沒(méi)考慮過(guò),只是懶沒(méi)有深究罷了。只求快點(diǎn)完成任務(wù)。。。

這里對(duì)這個(gè)問(wèn)題進(jìn)行思考闡述!

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

建立Excel模板,是涉及到歷史數(shù)據(jù)才要建立模板的,為什么呢?

如果,我們需要一份數(shù)據(jù)表,這個(gè)表中是本月的數(shù)據(jù),每天跑一行出來(lái)。到了下個(gè)月,就需要新建下一個(gè)月的表。

這樣以后進(jìn)行數(shù)據(jù)統(tǒng)計(jì)的時(shí)候,我們只需要拿到每個(gè)月的最后一天的那份數(shù)據(jù)表就可以了,因?yàn)樽詈笠惶斓臄?shù)據(jù)表包含了當(dāng)月的所有數(shù)據(jù)。

對(duì)于這樣一個(gè)需求,腳本中的代碼在月份改變時(shí),肯定要新建一個(gè)表,不再將原來(lái)的表作為模板來(lái)寫(xiě)。

自然,下一個(gè)月的表肯定不能把上一個(gè)月的數(shù)據(jù)帶進(jìn)去,所以肯定需要新寫(xiě)表頭。

這里往深了思考,就涉及到了另外一個(gè)問(wèn)題。

【建立Excel模板的方法的本質(zhì)】

def createTemplateExcel():
 '''創(chuàng)建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)

這個(gè)所謂的建立模板的方法做了什么事情呢?
只是建立了自定義名字的sheet,然后將表頭寫(xiě)進(jìn)去了而已。所以建立模板的方法本質(zhì)上實(shí)際上就是寫(xiě)表頭。

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

即,我們可以把寫(xiě)好的表頭直接return,接著下面的寫(xiě)數(shù)據(jù)的方法用。

也可以,直接保存一個(gè)模板Excel表出來(lái)放在腳本后臺(tái)用。每次需要寫(xiě)新表的時(shí)候就去調(diào)用生成的模板。

這里的問(wèn)題還可以更加深。。。

【有了寫(xiě)表頭的所謂建立模板方法,保存模板文件是否還有必要?】

其實(shí)又是個(gè)平衡問(wèn)題。我們是每次調(diào)方法來(lái)寫(xiě)表頭,消耗運(yùn)行時(shí)間。還是直接調(diào)用已經(jīng)寫(xiě)好的模板文件呢?直接調(diào)用雖然快,但是模板文件會(huì)占用腳本后臺(tái)的空間。

怎么樣劃算呢?選時(shí)間還是空間?

而且有個(gè)問(wèn)題,寫(xiě)一定就比調(diào)用慢嗎?如果寫(xiě)比調(diào)用快,既省時(shí)間又省空間,只不過(guò)代碼中多了個(gè)寫(xiě)表頭的方法而已。

還方便后期維護(hù)。

說(shuō)到這里,就有一個(gè)矛盾的地方了。我們既然已經(jīng)有了寫(xiě)表頭的操作了。還需要把它保存為模板文件放起來(lái)嗎?

每次運(yùn)行的時(shí)候直接寫(xiě)不就行了嗎?為什么還要保存?

保存起來(lái)除了占空間,用于調(diào)用(實(shí)質(zhì)上完全可以不調(diào)用直接寫(xiě)),還有什么用呢?

這是一個(gè)值得改進(jìn)的地方。。。吧

【關(guān)于建立模板方法相關(guān)的個(gè)人暫處理辦法】

目前我自己能夠想到的方法是,以后不再額外保存模板文件出來(lái)。寫(xiě)表頭就是寫(xiě)表頭,直接return,和后面的方法串起來(lái)就可以了。

每次月份改變的時(shí)候,即到了該月第一天寫(xiě)該月的第一張表的時(shí)候,去調(diào)用這個(gè)寫(xiě)表頭的方法就可以了。

好了,第一個(gè)問(wèn)題過(guò)去。接下來(lái)闡述第二個(gè)問(wèn)題?

【從數(shù)據(jù)庫(kù)取數(shù)據(jù),進(jìn)行處理以后,再寫(xiě)入】

我們之前寫(xiě)Excel表的時(shí)候,大多數(shù)的情況是,直接將取到的數(shù)據(jù)寫(xiě)入Excel表對(duì)應(yīng)位置。

取數(shù)據(jù)都是一樣的方法模板。數(shù)據(jù)處理發(fā)生在寫(xiě)入的時(shí)候。遇到過(guò)的,需要處理的情況有兩種:

1. 需要調(diào)用Excel相關(guān)函數(shù),比如SUM等。需要用到這個(gè)

xlwt.Formula

2. 需要將數(shù)據(jù)進(jìn)行除運(yùn)算外的處理。我們處理本例的需求時(shí)遇到的就是這種情況。

【需求】

將數(shù)據(jù)庫(kù)中每個(gè)游戲的成交量、下單量、失敗量取出來(lái)。寫(xiě)一張如下的表出來(lái):

關(guān)鍵需要處理的問(wèn)題是:每個(gè)游戲的三項(xiàng)數(shù)據(jù),每項(xiàng)數(shù)據(jù)是單獨(dú)對(duì)應(yīng)一個(gè)SQL取出來(lái)的,即,每項(xiàng)單獨(dú)取,排序是不一樣的。

如果直接寫(xiě)到Excel表中,是這樣子的

可以看到,排序是亂的。我們需要把這些數(shù)據(jù)按名字進(jìn)行一一對(duì)應(yīng)的處理,生成一張第一個(gè)圖所示的表出來(lái)。

這里就是數(shù)據(jù)處理需要用什么方法的問(wèn)題?

【如何進(jìn)行數(shù)據(jù)處理?】

之前想到的方法是:

def writeInfo0(sht, rs, length, rs2, length2, rs3, length3):
 '''寫(xiě)入線上具體數(shù)據(jù)'''
 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)

直接進(jìn)行寫(xiě)入。先寫(xiě)入最多的 ,然后寫(xiě)入較少的。而較少的兩項(xiàng)寫(xiě)入時(shí),根據(jù)名字的對(duì)應(yīng),放在對(duì)應(yīng)的位置。
這樣寫(xiě)可以,但是有兩個(gè)問(wèn)題:

1. 我們需要沒(méi)有數(shù)據(jù)的地方顯示為零。怎么判斷并寫(xiě)入呢?是個(gè)問(wèn)題,而且還挺麻煩的。

2. 我們需要數(shù)據(jù)完備,即,能夠保證最多的那項(xiàng)數(shù)據(jù)中的游戲就是所有了嗎?會(huì)不會(huì)每項(xiàng)數(shù)據(jù)對(duì)應(yīng)的數(shù)據(jù),都有自己獨(dú)有的游戲。

如果,最多的游戲條目數(shù)據(jù)中確實(shí)是沒(méi)有包含所有,這就是致命的錯(cuò)誤了。數(shù)據(jù)缺失不是小事兒。

還不止這個(gè),我們能夠保證,這個(gè)時(shí)候最多的,明天還是最多嗎?如果明天變成了最少,就會(huì)有很多數(shù)據(jù)因?yàn)槊Q匹配不到而沒(méi)有寫(xiě)入。

還是數(shù)據(jù)缺失,很致命的問(wèn)題。

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

【建立字典DICT處理數(shù)據(jù)】

比較理想的處理方法,也是我們最終采用的方法,是將所有數(shù)據(jù)取出來(lái)放入一個(gè)字典中。

在放入的過(guò)程中,進(jìn)行數(shù)據(jù)的整理。即,如果有這個(gè)游戲,就直接賦值。如果沒(méi)有,新建一個(gè)key,然后寫(xiě)入。

字典建立好了,包含了所有的數(shù)據(jù)了,再進(jìn)行寫(xiě)入。是比較可靠的。

這種方法的關(guān)鍵點(diǎn)有兩個(gè):

1. 如何在寫(xiě)入的時(shí)候進(jìn)行處理?

2. DICT建立好后,如何進(jìn)行寫(xiě)入?

我們一個(gè)一個(gè)說(shuō)。

【如何在寫(xiě)入的時(shí)候,建立DICT處理數(shù)據(jù)?】

先以比較簡(jiǎn)單的線下數(shù)據(jù)寫(xiě)入為例,進(jìn)行說(shuō)明。

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

接收來(lái)的rs數(shù)據(jù)是list,一個(gè)游戲?qū)?yīng)一個(gè)數(shù)據(jù)的那種。

我們這樣處理,將游戲名賦給key,將數(shù)據(jù)賦給value。循環(huán)遍歷,建立一個(gè)DICT出來(lái)。

接下來(lái)是關(guān)鍵的邏輯:如果有,直接賦值;如果沒(méi)有,新建一個(gè)key,再寫(xiě)入。

而這個(gè)關(guān)鍵邏輯中更為關(guān)鍵的邏輯是,如何判斷原來(lái)的key中有沒(méi)有。

處理方法是這樣的

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] 如果有的話,第一個(gè)value的值,從當(dāng)前狀態(tài)的DICT中取。

如果沒(méi)有的話,value直接取0。

最后,直接

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

即,key都是當(dāng)下建立的。我們只需要在乎value的值就可以了。

【疑問(wèn)】

這就有個(gè)疑問(wèn)了,不會(huì)出現(xiàn)重復(fù)建立key的情況嗎?

不會(huì)。因?yàn)?/p>

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

這句代碼,這個(gè)=的符號(hào)。本來(lái)就有賦值和新建兩重用法。如果沒(méi)有!就是新建,如果有了!就是改變。

只是改變的時(shí)候,我們需要把原來(lái)的值也帶進(jìn)去罷了。這個(gè)原來(lái)的值是從已經(jīng)有DICT中取到的。。。罷了。

接下來(lái),更為復(fù)雜的代碼也就可以理解了。

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

第三項(xiàng)數(shù)據(jù)出現(xiàn)時(shí)建立DICT的情況如上所示。

需要顧及到兩項(xiàng)已經(jīng)寫(xiě)好的數(shù)據(jù),而已。

【如何將DICT寫(xiě)入Excel表】

def writeInfo1(sht, dict):
 '''寫(xiě)入線下具體數(shù)據(jù)'''
 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)

其實(shí)就是字典的層層剝?nèi)〉姆椒ā?br />

關(guān)鍵就是拿到數(shù)據(jù)而已,拿到了直接寫(xiě)入!

再稍復(fù)雜的DICT,處理線上數(shù)據(jù)時(shí),我們的鍵有兩個(gè),值有三個(gè)。

我們知道,字典這種數(shù)據(jù)類型,值可以為包含了多個(gè)數(shù)據(jù)的數(shù)組,但是鍵只能夠有一個(gè),且不能為數(shù)組。

該怎么處理呢?我們只能將多個(gè)鍵合并為一個(gè)鍵,然后在寫(xiě)入的時(shí)候拆開(kāi)。

關(guān)鍵問(wèn)題,就是合并和拆分。

【鍵的合并】

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

對(duì),僅此而已。把兩個(gè)數(shù)據(jù)連到一起。合并為一個(gè)字符串。

【寫(xiě)入時(shí)鍵的拆分】

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函數(shù)。

split函數(shù)對(duì)字符串的拆分,拆分結(jié)果是數(shù)組。按數(shù)組編號(hào)來(lái)取分開(kāi)的數(shù)據(jù)就可以了。

至此,這個(gè)需求的關(guān)鍵問(wèn)題都已經(jīng)說(shuō)明完畢。

最后貼一份完整代碼如下。

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

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

###############################################################
#功能: 訂單情況相關(guān)報(bào)表
###############################################################
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():
 '''創(chuàng)建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):
 '''寫(xiě)入線上具體數(shù)據(jù)'''
 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):
 '''拿到線下具體數(shù)據(jù)'''
 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):
 '''寫(xiě)入線下具體數(shù)據(jù)'''
 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():
 '''寫(xiě)報(bào)表'''
 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()

總結(jié)

以上就是本文關(guān)于Python建立Map寫(xiě)Excel表實(shí)例解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • Python寫(xiě)入數(shù)據(jù)到MP3文件中的方法

    Python寫(xiě)入數(shù)據(jù)到MP3文件中的方法

    這篇文章主要介紹了Python寫(xiě)入數(shù)據(jù)到MP3文件中的方法,可實(shí)現(xiàn)將MP3文件相關(guān)信息寫(xiě)入MP3文件的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • python中unittest框架應(yīng)用詳解

    python中unittest框架應(yīng)用詳解

    這篇文章主要介紹了Python中Unittest框架的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • Python中的裝飾器用法詳解

    Python中的裝飾器用法詳解

    這篇文章主要介紹了Python中的裝飾器用法,以實(shí)例形式詳細(xì)的分析了Python中的裝飾器的使用技巧及相關(guān)注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • 詳解Python中的文件操作

    詳解Python中的文件操作

    今天這篇文章給大家介紹Python中的文件操作,文章內(nèi)容介紹的很詳細(xì),有需要的可以參考借鑒。
    2016-08-08
  • Python 日期區(qū)間處理 (本周本月上周上月...)

    Python 日期區(qū)間處理 (本周本月上周上月...)

    這篇文章主要介紹了Python 日期區(qū)間處理 (本周本月上周上月...),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • sklearn中make_blobs的用法詳情

    sklearn中make_blobs的用法詳情

    這篇文章主要介紹了sklearn中make_blobs的用法詳情,sklearn中的make_blobs函數(shù)主要是為了生成數(shù)據(jù)集的,下面文章的學(xué)習(xí)內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)

    K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)

    這篇文章主要介紹了K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn),幫助大家更好的利用python實(shí)現(xiàn)機(jī)器學(xué)習(xí),感興趣的朋友可以了解下
    2021-01-01
  • tensorflow 報(bào)錯(cuò)unitialized value的解決方法

    tensorflow 報(bào)錯(cuò)unitialized value的解決方法

    今天小編就為大家分享一篇tensorflow 報(bào)錯(cuò)unitialized value的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • pytorch?膨脹算法實(shí)現(xiàn)大眼效果

    pytorch?膨脹算法實(shí)現(xiàn)大眼效果

    在PS中,我們可以利用液化工具對(duì)人像進(jìn)行瘦臉、放大眼睛等系列的常規(guī)操作。今天我們來(lái)了解一下這些操作的算法原理,并用pytorch?膨脹算法來(lái)實(shí)現(xiàn)大眼效果,感興趣的可以了解一下
    2021-11-11
  • python實(shí)現(xiàn)煙花小程序

    python實(shí)現(xiàn)煙花小程序

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)煙花小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評(píng)論