xlsxwriter导出报表和制作图表

xlsxwriter 的图表和数据表还是很简单的,这个模块帮你做了很好用的封装。 

#coding: utf-8
import xlsxwriter
import random

def get_num():
    return random.randrange(0, 201, 2)   # 获取一个随机数,从0到201步长为2的数列中

workbook = xlsxwriter.Workbook('analyse_spider.xlsx')    #创建一个Excel文件及excel对象
worksheet = workbook.add_worksheet()    #创建一个工作表对象,即创建一个工作表及工作表对象
chart = workbook.add_chart({'type': 'column'})    #创建一个图表对象
#定义数据表头列表
title = [u'业务名称',u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期日',u'平均流量']
buname= [u'时光网',u'汽车之家',u'weixin.com',u'163.com',u'baidu.com']    #定义频道名称
#定义5频道一周7天流量数据列表
data = []
for i in range(5):
    tmp = []
    for j in range(7):
        tmp.append(get_num())
    data.append(tmp)
    
format=workbook.add_format()    #定义format格式对象
format.set_border(1)    #定义format对象单元格边框加粗(1像素)的格式
 
format_title=workbook.add_format()    #定义format_title格式对象
format_title.set_border(1)   #定义format_title对象单元格边框加粗(1像素)的格式
format_title.set_bg_color('#cccccc')   #定义format_title对象单元格背景颜色为
                                       #'#cccccc'的格式
format_title.set_align('center')    #定义format_title对象单元格居中对齐的格式
format_title.set_bold()    #定义format_title对象单元格内容加粗的格式
 
format_ave=workbook.add_format()    #定义format_ave格式对象
format_ave.set_border(1)    #定义format_ave对象单元格边框加粗(1像素)的格式
format_ave.set_num_format('0.00')   #定义format_ave对象单元格数字类别显示格式
 
#下面分别以行或列写入方式将标题、业务名称、流量数据写入起初单元格,同时引用不同格式对象
worksheet.write_row('A1',title,format_title)  
worksheet.write_column('A2', buname,format)
worksheet.write_row('B2', data[0],format)
worksheet.write_row('B3', data[1],format)
worksheet.write_row('B4', data[2],format)
worksheet.write_row('B5', data[3],format)
worksheet.write_row('B6', data[4],format)
 
#定义图表数据系列函数
def chart_series(cur_row):
    worksheet.write_formula('I'+cur_row, \
     '=AVERAGE(B'+cur_row+':H'+cur_row+')',format_ave)    #计算(AVERAGE函数)频
                                                          #道周平均流量
    chart.add_series({
        'categories': '=Sheet1!$B$1:$H$1',    #将“星期一至星期日”作为图表数据标签(X轴)
        'values':     '=Sheet1!$B$'+cur_row+':$H$'+cur_row,    #频道一周所有数据作
                                                               #为数据区域
        'line':       {'color': 'black'},    #线条颜色定义为black(黑色)
        'name': '=Sheet1!$A$'+cur_row,    #引用业务名称为图例项
    })
 
for row in range(2, 7):    #数据域以第2~6行进行图表数据系列函数调用
    chart_series(str(row))
 
chart.set_size({'width': 577, 'height': 287})    #设置图表大小
chart.set_title ({'name': u'爬虫分析'})    #设置图表(上方)大标题
chart.set_y_axis({'name': 'count'})    #设置y轴(左侧)小标题
 
worksheet.insert_chart('A8', chart)    #在A8单元格插入图表
workbook.close()    #关闭Excel文档

 write_formula(rowcolformula[, cell_formula[, value]])   向指定的工作表单元格写入公式或函数。

  • row(int) - 单元格所在的行(索引从0开始计数)。
  • col(int) - 单元格所在的列(索引从0开始计数)。
  • formula(string) - 写入单元格的公式。
  • cell_formatFormat) - 可选的格式对象。
  • value - 可选的结果。公式计算后的值。
    worksheet.write_formula(0, 0, '=B3 + B4')  
    worksheet.write_formula(1, 0, '=SIN(PI()/4)')  
    worksheet.write_formula(2, 0, '=SUM(B1:B5)')  
    worksheet.write_formula('A4', '=IF(A3>1,"Yes", "No")')  
    worksheet.write_formula('A5', '=AVERAGE(1, 2, 3, 4)')  
    worksheet.write_formula('A6', '=DATEVALUE("1-Jan-2013")')   

 

  

 

 

有些数据是需要做平均值计算的,看了下官方实例对于AVERAGE的处理函数,还算可以。然后又从某个论坛那边,搜到了刘天斯发表的一段代码,然后改了改就直接用了。自己这是需要关心series值 。 excel是有很多计算的函数计算的,其实我是懒得在接口端做计算, 就直接调用xlsxwriter计算了。

嗯,还有一个中文的问题… ….  居然还犯这么初级的问题…   编码没有指明的问题,需要指明sys.setdefaultencoding,或则会是自己申明decode

self._xml_si_element(string, attributes)

  File "/Library/Python/2.7/site-packages/xlsxwriter/xmlwriter.py", line 122, in _xml_si_element

    self.fh.write("""<si><t%s>%s</t></si>""" % (attr, string))

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py", line 691, in write

    return self.writer.write(data)

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/codecs.py", line 351, in write

    data, consumed = self.encode(object, self.errors)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 7: ordinal not in range(128)

 

一定要把xlsxwriter对象给关闭了,不然会报错….

Exception Exception: Exception('Exception caught in workbook destructor. Explicit close() may be required for workbook.',) in <bound method Workbook.__del__ of <xlsxwriter.workbook.Workbook object at 0x10053d4d0>> ignored

 

 

 

 

 

 

从tornado 接口获取数据,到发邮件的逻辑给去掉了

#coding: utf-8
import xlsxwriter
import random

def get_num():
    return random.randrange(0, 201, 2)

workbook = xlsxwriter.Workbook('analyse_spider.xlsx')    #创建一个Excel文件
worksheet = workbook.add_worksheet()    #创建一个工作表对象
chart = workbook.add_chart({'type': 'column'})    #创建一个图表对象
#定义数据表头列表
title = [u'业务名称',u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期日',u'平均流量']
buname= [u'时光网',u'汽车之家',u'weixin.com',u'163.com',u'baidu.com']    #定义频道名称
#定义5频道一周7天流量数据列表
data = []
for i in range(5):
    tmp = []
    for j in range(7):
        tmp.append(get_num())
    data.append(tmp)
    
format=workbook.add_format()    #定义format格式对象
format.set_border(1)    #定义format对象单元格边框加粗(1像素)的格式
 
format_title=workbook.add_format()    #定义format_title格式对象
format_title.set_border(1)   #定义format_title对象单元格边框加粗(1像素)的格式
format_title.set_bg_color('#cccccc')   #定义format_title对象单元格背景颜色为
                                       #'#cccccc'的格式
format_title.set_align('center')    #定义format_title对象单元格居中对齐的格式
format_title.set_bold()    #定义format_title对象单元格内容加粗的格式
 
format_ave=workbook.add_format()    #定义format_ave格式对象
format_ave.set_border(1)    #定义format_ave对象单元格边框加粗(1像素)的格式
format_ave.set_num_format('0.00')   #定义format_ave对象单元格数字类别显示格式
 
#下面分别以行或列写入方式将标题、业务名称、流量数据写入起初单元格,同时引用不同格式对象
worksheet.write_row('A1',title,format_title)  
worksheet.write_column('A2', buname,format)
worksheet.write_row('B2', data[0],format)
worksheet.write_row('B3', data[1],format)
worksheet.write_row('B4', data[2],format)
worksheet.write_row('B5', data[3],format)
worksheet.write_row('B6', data[4],format)
 
#定义图表数据系列函数
def chart_series(cur_row):
    worksheet.write_formula('I'+cur_row, \
     '=AVERAGE(B'+cur_row+':H'+cur_row+')',format_ave)    #计算(AVERAGE函数)频
                                                          #道周平均流量
    chart.add_series({
        'categories': '=Sheet1!$B$1:$H$1',    #将“星期一至星期日”作为图表数据标签(X轴)
        'values':     '=Sheet1!$B$'+cur_row+':$H$'+cur_row,    #频道一周所有数据作
                                                               #为数据区域
        'line':       {'color': 'black'},    #线条颜色定义为black(黑色)
        'name': '=Sheet1!$A$'+cur_row,    #引用业务名称为图例项
    })
 
for row in range(2, 7):    #数据域以第2~6行进行图表数据系列函数调用
    chart_series(str(row))
 
chart.set_size({'width': 577, 'height': 287})    #设置图表大小
chart.set_title ({'name': u'爬虫分析'})    #设置图表(上方)大标题
chart.set_y_axis({'name': 'count'})    #设置y轴(左侧)小标题
 
worksheet.insert_chart('A8', chart)    #在A8单元格插入图表
workbook.close()    #关闭Excel文档



 #coding: utf-8
import xlsxwriter
import random
 
def get_num():
    return random.randrange(0, 201, 2)
 
workbook = xlsxwriter.Workbook('analyse_spider.xlsx')    #创建一个Excel文件
worksheet = workbook.add_worksheet()    #创建一个工作表对象
chart = workbook.add_chart({'type': 'column'})    #创建一个图表对象
#定义数据表头列表
title = [u'业务名称',u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期日',u'平均流量']
buname= [u'时光网',u'汽车之家',u'weixin.com',u'163.com',u'baidu.com']    #定义频道名称
#定义5频道一周7天流量数据列表
data = []
for i in range(5):
    tmp = []
    for j in range(7):
        tmp.append(get_num())
    data.append(tmp)
    
format=workbook.add_format()    #定义format格式对象
format.set_border(1)    #定义format对象单元格边框加粗(1像素)的格式
 
format_title=workbook.add_format()    #定义format_title格式对象
format_title.set_border(1)   #定义format_title对象单元格边框加粗(1像素)的格式
format_title.set_bg_color('#cccccc')   #定义format_title对象单元格背景颜色为
                                       #'#cccccc'的格式
format_title.set_align('center')    #定义format_title对象单元格居中对齐的格式
format_title.set_bold()    #定义format_title对象单元格内容加粗的格式
 
format_ave=workbook.add_format()    #定义format_ave格式对象
format_ave.set_border(1)    #定义format_ave对象单元格边框加粗(1像素)的格式
format_ave.set_num_format('0.00')   #定义format_ave对象单元格数字类别显示格式
 
#下面分别以行或列写入方式将标题、业务名称、流量数据写入起初单元格,同时引用不同格式对象
worksheet.write_row('A1',title,format_title)  
worksheet.write_column('A2', buname,format)
worksheet.write_row('B2', data[0],format)
worksheet.write_row('B3', data[1],format)
worksheet.write_row('B4', data[2],format)
worksheet.write_row('B5', data[3],format)
worksheet.write_row('B6', data[4],format)
 
#定义图表数据系列函数
def chart_series(cur_row):
    worksheet.write_formula('I'+cur_row, \
     '=AVERAGE(B'+cur_row+':H'+cur_row+')',format_ave)    #计算(AVERAGE函数)频
                                                          #道周平均流量
    chart.add_series({
        'categories': '=Sheet1!$B$1:$H$1',    #将“星期一至星期日”作为图表数据标签(X轴)
        'values':     '=Sheet1!$B$'+cur_row+':$H$'+cur_row,    #频道一周所有数据作
                                                               #为数据区域
        'line':       {'color': 'black'},    #线条颜色定义为black(黑色)
        'name': '=Sheet1!$A$'+cur_row,    #引用业务名称为图例项
    })
 
for row in range(2, 7):    #数据域以第2~6行进行图表数据系列函数调用
    chart_series(str(row))
 
chart.set_size({'width': 577, 'height': 287})    #设置图表大小
chart.set_title ({'name': u'爬虫分析'})    #设置图表(上方)大标题
chart.set_y_axis({'name': 'count'})    #设置y轴(左侧)小标题
 
worksheet.insert_chart('A8', chart)    #在A8单元格插入图表
workbook.close()    #关闭Excel文档

 

 

posted on 2017-09-05 23:36  myworldworld  阅读(368)  评论(0)    收藏  举报

导航