五分钟学 | Excel 自动化之自动画图表

发布于 2020-12-29 10:58:42 1.3K0 举报 文章被收录于专栏:萝卜大杂烩 今天继续五分钟学系列,今天的主题是 Excel,相信大家都比较熟悉吧。而且我相信,大家在日常使用 Excel 都时候,肯定会遇到很多重复繁琐都工作,因为我也同样遇到过。这个时候我通常都会思考下,有没有办法让繁琐都事情变得简单些呢,毕竟我们是 Python 使用者嘛! 所以我个人在工作当中还是积累来一些 Excel 自动化相关都经验都,在后面都文章当中,我会陆续推出 Excel、PDF 等等相关软件都自动化内容,感兴趣都同学记得来看哦! 今天我们都主题就是为 Excel 自动添加图表,实现起来很简单,保证五分钟完事儿!

数据 图表 - 图1

基本原理

这里我们使用 xlsxwriter 这个库,简直不要太强大! 首先我们先来看下如何通过这个库来编辑 Excel 呢

代码语言:javascript

复制

  1. import xlsxwriter
  2. # 创建一个excel
  3. workbook = xlsxwriter.Workbook("chart.xlsx")
  4. # 创建一个sheet
  5. worksheet = workbook.add_worksheet()
对于创建 Excel 和新增 sheet 都没啥说的,基本套路搞定!

代码语言:javascript

复制

  1. # 自定义样式,加粗
  2. bold = workbook.add_format({'bold': 1})
  3. # excel中写入数据,建立图标时要用到
  4. headings = ['Number', 'testA', 'testB']
  5. data = [
  6. ['2020-9-1', '2020-9-2', '2020-9-3', '2020-9-4', '2020-9-5', '2020-9-6'],
  7. [10, 40, 50, 20, 10, 50],
  8. [30, 60, 70, 50, 40, 30],
  9. ]
  10. # 写入表头
  11. worksheet.write_row('A1', headings, bold)
  12. # 写入数据
  13. worksheet.write_column('A2', data[0])
  14. worksheet.write_column('B2', data[1])
  15. worksheet.write_column('C2', data[2])
这里,我们定义了一些测试数据,然后通过 write_row 函数写入表头,通过 write_column 函数来按列写入数据,此时我们得到都 Excel 应该是如下都

数据 图表 - 图2

画图开始

下面就是重点了,我们要看是根据测试数据来画图表了

代码语言:javascript

复制

  1. # 创建一个柱状图(line chart)
  2. chart_col = workbook.add_chart({'type': 'line'})
  3. # 配置第一个系列数据
  4. chart_col.add_series({
  5. # 这里的sheet1是默认的值,因为我们在新建sheet时没有指定sheet
  6. # 如果我们新建sheet时设置了sheet名,这里就要设置成相应的值
  7. 'name': '=Sheet1!$B$1',
  8. 'categories': '=Sheet1!$A$2:$A$7',
  9. 'values': '=Sheet1!$B$2:$B$7',
  10. 'line': {'color': 'red'},
  11. })
  12. # 配置第二个系列数据
  13. chart_col.add_series({
  14. 'name': '=Sheet1!$C$1',
  15. 'categories': '=Sheet1!$A$2:$A$7',
  16. 'values': '=Sheet1!$C$2:$C$7',
  17. 'line': {'color': 'yellow'},
  18. })
通过 add_chart 函数来新增一个图表,type 就是 图表都类型 而对于 add_series 就是具体都图表数据信息了,相信也是一目了然的! 最后再设置 X、Y 轴的信息,并设置下图表所在的位置就完成了

代码语言:javascript

复制

  1. # 设置图表的title xy轴信息
  2. chart_col.set_title({'name': 'The test Analysis'})
  3. chart_col.set_x_axis({'name': 'Test number'})
  4. chart_col.set_y_axis({'name': 'Sample length (mm)'})
  5. # 设置图表的风格
  6. chart_col.set_style(1)
  7. # 把图表插入到worksheet并设置偏移
  8. worksheet.insert_chart('A10', chart_col, {'x_offset': 25, 'y_offset': 10})
  9. workbook.close()

数据 图表 - 图3

当然的对于画柱状图,饼图等都是类似的,我们也就不再重复了。 下一次,我们就来实现根据已有的数据,如何自动生成我们需要的图表,而且如果我想自动发送给某些人呢,能不能全程自动化搞定呢! 好了,今天就分享到这里,原创不易,给个“在看”再走吧!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。

原始发表:2020-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

自动化

利用Python拒绝重复工作,每周的项目进度还是自动发送的好

发布于 2020-02-26 16:51:14 8560 举报 文章被收录于专栏:Bug生活2048 在家远程办公的第二周,各种汇报邮件满天飞 背景 由于远程办公的原因,很多口头汇报或者会议同步的事项都需要邮件或者书面的方式进行汇报了。 往往领导的要求是‘苛刻’的,要求每天要发送XXXX的报表,每周又要发送XXXX的周报,作为一位有理想的码农,我的内心是拒绝的。 所以每天的工作周报,每周的项目进度等等标准化的汇报事项,我都通过自动化脚本的方式进行处理。 想法 通常衡量一件事是否可以用脚本实现,主要看能否标准化和重复使用次数。也就是说,经常要重复要做的标准化的事项可以用自动化的脚本去代替,往往这样的操作可以提高自身的工作效率,这样你就可以有更多的时间去学习「浪」了。 像我目前遇到的,每天需要在群里汇报下今天的工作内容及进度,每周要发下项目的整体进度等等,完全可以使用自动化的脚本去处理。 一旦处理的好,对外的直观感受就是你比较专业和严谨,每天固定的时间汇报,时间一致,格式一致,从没有忘记过。是不是一举多得。 思路

数据 图表 - 图4

既然有了想法,就要去实现,首先推荐<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">Python</font>,简单且搞笑,有点开发基础的基本很快上手,很快实现。 然后确定数据源,拿我的例子举例,目前我们公司用的腾讯的<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">tapd</font>,很多工作相关的需求,项目进度,BUG情况都能在<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">tapd</font>体现。 但领导往往很少看这些散列的数据,往往需要你定时整理一份指定格式的汇总报表,以邮件的方式发送给他,相信这样的需求大家经常碰到。 既然需求出现了,那就让代码解决吧。 这里以我每周要发送一份项目进度为例,目标Excel如下格式:

数据 图表 - 图5

截图1 数据源是在<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">tapd</font>中,目标产物也有了,剩下的无非就是获取数据源的数据,然后转换成对应的目标产物,最后通过邮件的方式发送给目标用户。 python实现

数据 图表 - 图6

主要用了下面三个核心库,分别用来获取数据,生成Excel,发送邮件。

代码语言:javascript

复制

  1. #用于调用API获取数据源
  2. import requests
  3. #用于生成Excel
  4. import xlsxwriter
  5. #用于调用exchange发送邮件
  6. from exchangelib import Credentials, Account
几个核心库的基础用法这里就不多说了,官方文档和网上的教程也一大堆。 基本上这类需求都是三个步骤,首先通过<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">requests</font>来获取你的目前数据,不管是有官方API,还是通过爬虫爬取的方式,当然后API是最好的,比较简单,像tapd就提供了相应的API,简单调用就能获取到数据。

代码语言:javascript

复制

  1. '''
  2. 调用API获取tapd需求内容
  3. '''
  4. def getTapdStories(ids):
  5. url='{0}?limit=200&workspace_id={1}&id={2}'.format(TAPD_API,WORKSPACE_ID,ids)
  6. request=requests.get(url,headers = HEADERS)
  7. response = request.json()['data']
  8. return response
接着就是将目标数据转换成你需要的数据,这里tapd的任务会无限嵌套,所以搞了个递归获取到最小粒度的任务信息:

代码语言:javascript

复制

  1. '''
  2. 递归获取最小粒度的任务信息
  3. '''
  4. def getTaskData(id,programName,moduleName,moduleId):
  5. taskData=[]
  6. response=getTapdStories(id)
  7. if isinstance(response,list)==False:
  8. story=response['Story']
  9. strChildrenId=story['children_id']
  10. if strChildrenId =='|':
  11. taskData.append(buildData(story,programName,moduleName,moduleId))
  12. else:
  13. strChildrenId=strChildrenId[2:].replace('|',',')
  14. taskData.extend(getTaskData(strChildrenId,programName,moduleName,moduleId))
  15. else:
  16. for story in response:
  17. story=story['Story']
  18. strChildrenId=story['children_id']
  19. if strChildrenId =='|':
  20. taskData.append(buildData(story,programName,moduleName,moduleId))
  21. else:
  22. strChildrenId=strChildrenId[2:].replace('|',',')
  23. taskData.extend(getTaskData(strChildrenId,programName,moduleName,moduleId))
  24. return taskData
然后利用<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">xlsxwriter</font>将目标数据生成Excel:

代码语言:javascript

复制

  1. workbook = xlsxwriter.Workbook('test.xlsx')
  2. worksheet = workbook.add_worksheet('sheet1')
  3. #写入表头
  4. worksheet.write_row('A1',EXCEL_TABLE_HEADER_NAME,titleStyle)
  5. #设置列宽
  6. for index in range(len(EXCEL_TABLE_HEADER_WIDTH)):
  7. worksheet.set_column(index,index,EXCEL_TABLE_HEADER_WIDTH[index])
  8. #填充数据
  9. for index in range(len(excelData)):
  10. worksheet.write_row(index+1,0,excelData[index],defaultStyle)
  11. #合并单元格
  12. for index in range(len(merageData)):
  13. worksheet.merge_range(i, 1, merageData[index]['merageCount']+i-1,1,merageData[index]['moduleId'][-7:], cell_format=defaultStyle)
  14. i+=merageData[index]['merageCount']
  15. workbook.close()
最后通过<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">exchangelib</font>发送邮件:

代码语言:javascript

复制

  1. def sendMail(htmlBody, day, account):
  2. m = Message(
  3. account=account,
  4. subject=SUBJECT.format(day),
  5. body=HTMLBody(htmlBody),
  6. to_recipients=TO
  7. )
  8. m.send_and_save()
总结

数据 图表 - 图7

由于涉及到公司内部的一些敏感信息,所以不能贴完整的代码,但整体思路基本如上面所说,熟练使用上面的几个组件,相信大部分类似的需求都能轻松搞定。 最后还是想说,还是要学会偷懒,重复的事情千万不能将就,也许发个周报每天只要几分钟,但一天天积累下来,所花的时间还是不少的,不如花点时间,搞点创新,把时间花在更有的意义的事情上。