Python使用xlwt构建Excel报表:模板策略与字典数据聚合实战

Evan
Evan
发布时间:2026-10-13| 2人浏览过
原创

本文深入解析Python使用xlwt库生成Excel报表的两种核心策略:动态创建模板与预存模板文件的性能权衡。重点阐述如何通过Python字典(Dict)结构,将来自不同SQL查询的成交量、下单量及失败量等多源数据,按游戏名称进行键值聚合与对齐。通过示例代码展示如何处理数据缺失、排序不一致及多字段键合并拆分问题,实现高效且准确的数据写入。

本文主要探讨利用Python语言结合Map(字典)结构生成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页,并写入表头。因此,其本质即为写入表头。

我们可以选择返回Workbook对象(return wb),或者直接保存为文件(wb.save(tempFileName))。

这意味着,我们可以将写好表头的Workbook对象直接返回,供后续的写入数据方法调用。

另一种做法是,直接保存为一个模板Excel文件存储在脚本后台。每次需要生成新表时,直接调用该模板文件。

此处的问题还可以进一步深入探讨。

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

这实际上是一个平衡问题:是每次调用方法动态写表头以消耗运行时间,还是直接调用已生成的模板文件?直接调用虽快,但模板文件会占用脚本后台的存储空间。

如何权衡?是选择时间效率还是空间占用?

此外,存在一个疑问:动态写入一定比调用文件慢吗?如果动态写入的速度快于文件I/O,则既节省时间又节省空间,仅需在代码中增加写表头的方法即可。

这种做法还便于后期的代码维护。

由此产生一个矛盾点:既然已有写表头的操作,是否还需要将其保存为模板文件?

每次运行时直接写入表头不就行了吗?为何还要额外保存?

保存文件除了占用空间外,主要用于后续调用(实际上完全可以直接写入而不必调用),其额外价值何在?

这是一个值得改进的环节。

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

目前我的处理策略是:不再额外保存模板文件。写表头即写表头,直接返回Workbook对象,并与后续写入方法串联即可。

仅在月份更替、即该月第一天生成首张表时,调用该写表头方法。

第一个问题已解决,接下来阐述第二个问题。

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

以往生成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处理数据】

较为理想且最终采用的方法,是将所有提取的数据存入一个字典(Dict)中。

在存入过程中进行数据整理:若该游戏已存在,则直接赋值;若不存在,则新建Key并写入。

字典构建完成后,包含所有数据,再进行写入,这种方法更为可靠。

此方法的关键点有两个:

1. 如何在写入过程中处理数据?

2. 字典构建完成后,如何将其写入Excel?

我们逐一分析。

【如何在写入的时候,建立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。通过循环遍历,构建字典。

接下来是核心逻辑:若Key存在,直接赋值;若不存在,新建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] 若Key存在,则从当前状态的字典中获取第一个Value的值。

若Key不存在,则Value直接取0。

最后,直接

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

即,Key均为动态建立。我们只需关注Value的值即可。

【疑问】

这里有一个疑问:是否会出现重复建立Key的情况?

不会。因为

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

该赋值语句中的等号(=)符号,兼具赋值和新建的双重用途。若Key不存在,则新建;若Key已存在,则修改。

仅在修改时,我们需要将原值一并带入。该原值从已存在的字典中获取即可。

接下来,更复杂的代码逻辑也可据此理解。

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写入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)

这实质上是字典层层解包的过程。

关键在于获取数据,获取后直接写入即可!

对于稍复杂的字典,处理线上数据时,我们的键有两个,值有三个。

我们知道,字典的数据类型中,Value可以是包含多个数据的数组,但Key只能有一个,且不能为数组。

如何处理?我们只能将多个Key合并为一个Key,然后在写入时再拆分。

关键问题在于合并与拆分。

【键的合并】

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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。