笔者在工作中时常遇到以下的问题:

  • 作为文档汇总人,需要合并其他同事发来的内容。虽然有同样的文档模板,但由于不同人协作编写,所以在格式和内容编写风格上都千差万别,汇总工作耗时耗力。
  • 时常编写内容差别不大的数据分析报告(基于简单统计、对比分析),每次都根据数据变化情况进行内容修改,重复繁杂。
  • 嫌文档格式、模板调整工作无聊、枯燥无味,但又不得不做。

相信很多朋友也一样经历过类似的麻烦事情,但从现在开始,上诉问题都将慢慢的不复存在。因为,今天我要分享的内容就是:使用Python自动生成报告。让机器为人干活,是人类今后发展的方向。

首先,介绍下要用的工具:python的docx库。

安装方法很简单:

(1)pip安装

pip install python-docx

(2)easy_install安装

easy_install python-docx

(3)下载安装包,进行手动安装

tar xvzf python-docx-{version}.tar.gzcd python-docx-{version}python setup.py install

以下是官方示例:

from docx import Documentfrom docx.shared import Inchesdocument = Document()document.add_heading('Document Title', 0)p = document.add_paragraph('A plain paragraph having some ')p.add_run('bold').bold = Truep.add_run(' and some ')p.add_run('italic.').italic = Truedocument.add_heading('Heading, level 1', level=1)document.add_paragraph('Intense quote', style='Intense Quote')document.add_paragraph(    'first item in unordered list', style='List Bullet')document.add_paragraph(    'first item in ordered list', style='List Number')document.add_picture('monty-truth.png', width=Inches(1.25))records = (    (3, '101', 'Spam'),    (7, '422', 'Eggs'),    (4, '631', 'Spam, spam, eggs, and spam'))table = document.add_table(rows=1, cols=3)hdr_cells = table.rows[0].cellshdr_cells[0].text = 'Qty'hdr_cells[1].text = 'Id'hdr_cells[2].text = 'Desc'for qty, id, desc in records:    row_cells = table.add_row().cells    row_cells[0].text = str(qty)    row_cells[1].text = id    row_cells[2].text = descdocument.add_page_break()document.save('demo.docx')

运行完就可以看到效果了。(大家可以自行尝试)

看完了docx库基本功能介绍,接下来开始讲解文档自动生成的全过程。我们以系统运维人员每日编写的简报自动生成场景为例。

第一步:运维数据统计表设计

运维基础数据统计表设计

从图中可以看到,我们的基础数据统计表由几个核心字段组成:系统名称主机IP主机用途CPU使用情况内存使用情况磁盘使用情况告警次数故障次数已处理故障次数告警详细描述故障详细描述处置结果描述拟采取措施等。这些字段基本上可以记录系统当日运行情况,后面的报告也是基于这些基本信息进行生成。

先读入数据。

#读入运维数据统计表data_path = 'report_tmp-模板.csv' #基础模板数据df_tmp = pd.read_csv(data_path,encoding='gbk')#中文cols = list(df_tmp.columns)df_tmp = df_tmp.fillna('无')

第二步:进行数据分析逻辑描述

先想象一下报告由自己人工来编写,需要从哪些方面去分析数据呢?先按一套系统维度来看,首先是有没有发生故障?故障是不是已经处置?如何处置的?其次,是看有没有告警?是否有风险?最后,是资源使用情况,是否正常?

理清思路之后,就可以按顺序将描述过程用Python代码进行翻译,拼接成报告的模板(报告的负责程度全由您自己掌控)。

(1)统计各项数据

system_cnt = len(df_tmp['系统名称'].unique())alarm_cnt = int(df_tmp['告警次数'].sum())fault_cnt = int(df_tmp['故障次数'].sum())fault_handled_cunt = int(df_tmp['已处理故障次数'].sum())sys_names = df_tmp[cols[1]].unique()host_cnt = len(df_tmp['主机IP'].unique())

(2)按分析逻辑拼接报告模板

总体概述:

#初始化报告document = Document()#标题title = '核心系统运维监控简报'header = add_head_title(document,title)#总体概述sub_title1 = '一、总体概述'add_head_level_1(document,sub_title1)total_desc = '{0},运维团队持续对{1}套核心系统进行运维监测,共涉及核心服务器{2}台,今日发生故障{3}次,系统告警共计{4}次'    .format(date_str,system_cnt,host_cnt,fault_cnt,alarm_cnt)if fault_cnt > 0:    if fault_cnt == fault_handled_cunt:        total_desc += ',所有故障均已完成处置。'    else:        total_desc += ',已完成{}项故障处置,剩{}项暂未处理,具体原因见后详情。'.format(fault_handled_cunt,(fault_cnt-fault_handled_cunt))else:    total_desc += ',所有系统均正常运行。'total_desc += '具体情况如下。'

故障方面分析:

# 故障方面    sys_fault_ct = sysdata[cols[8]].sum()    sys_fault_hd_ct = sysdata[cols[9]].sum()    sys_fault_descs = sysdata[['主机IP','故障详细描述','处置结果描述','拟采取措施','主机用途']]    sys_fault_list = sys_fault_descs[sys_fault_descs['故障详细描述']!='无'].values    if sys_fault_ct == 0:        add_paragraph(document,'故障方面,{}系统未发生故障,全天正常运行。'.format(v))    else:        para = add_paragraph(document, '故障方面,{0}系统今日共发生{1}次故障,已经完成处理{2}项。'.format(v,sys_fault_ct,sys_fault_hd_ct))        run = para.add_run('具体故障主要为:')        run.font.name = '仿宋'        run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')        for j,faults in enumerate(sys_fault_list):            para1 = add_paragraph(document,'({0})主机[{2}]({1})'.format(j+1,faults[0],faults[4]))            run1 = para1.add_run('{0}。'.format(faults[1]))            run1.font.color.rgb = RGBColor(255, 0, 0)            run1.font.name = '仿宋'            run1._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')            if faults[2] != '无':                run1 = para1.add_run('目前{}。'.format(faults[2]))                run1.font.name = '仿宋'                run1._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')            if faults[3] != '无':                run1 = para1.add_run('{0}。'.format(faults[3]))                run1.font.name = '仿宋'                run1._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')

其他内容可按需定制。

第三步:生成报告并保存

模板拼接好后,可将内容进行持久化保存(文件名用日期区分)。

#保存文件document.save('{0}-{1}.docx'.format(title,date_str))print('报告自动生成完成!')

经过上述三个步骤,我们的运维日简报就已经自动生成完成了。以下是效果图。

自动生成的运维简报

有了这样的工具,后续的工作就简单了,只需要修改数据统计表中的内容,然后运行一次程序,每天的报告就自动完成了。:)

结束语

今天的分享就到这里,感谢大家的阅读。由于篇幅原因,未能将所有代码贴出,需要完整源代码的朋友,可以通过评论给我留言,或私信联系我。同时,请大家在评论区给我一些反馈和指导,以帮助我提升文章内容质量,谢谢大家。

bootstrap table中文文档_用Python完成一件小事:自动生成文档报告相关推荐

  1. java接口废弃注释_Spring Boot如何让Web API自动生成文档,并解决swagger-annotations的API注解description属性废弃的问题...

    前后端分离的系统架构中,前端开发人员需要查看后端WEB API的文档来进行开发.采用后端API文档自动生成的方式,可以大幅提高开发效率.swagger是一个被广泛使用的文档自动生成工具,可以与多种编程 ...

  2. java前端目录_[Java教程]前端那点事儿——Tocify自动生成文档目录

    [Java教程]前端那点事儿--Tocify自动生成文档目录 0 2016-06-29 22:00:07 今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目 ...

  3. python使用sphinx自动生成文档

    python代码注释风格有很多,比较主流的有reStructuredText风格.numpy风格.google风格,pycharm默认提示reStructuredText风格 reStructured ...

  4. python 自动生成文档

    python 自动生成文档 python 自动生成文档 一.配置文档 二.protobuf 三.代码 python 自动生成文档 一.配置文档 register.temeprate # Datetim ...

  5. docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档

    为什么用 TypeScript? TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any ...

  6. Matlab联合wps的API生成文档,让API自动生成文档

    原标题:让API自动生成文档 程序员最苦恼的事情莫过于写文档.由于业务口径频繁变更,因此很多接口也会频繁变更,频繁变更导致文档的维护是一件相当费时的事情,当优先级更高的事情袭来,更新文档反到成了次要工 ...

  7. django集成Sphinx,为项目自动生成文档

    Sphinx是一个工具,可以轻松创建智能和漂亮的文档,他与Python自带的pydoc是同一类产品,但比pydoc更加优秀,还有很多主题可以选择,平时在开发过程中,我们看到的第三方包的文档,基本上都是 ...

  8. Objective-C自动生成文档工具:appledoc

    作者 iOS_小松哥 关注 2016.12.13 15:47* 字数 919 阅读 727评论 10喜欢 35 由于最近琐事比较多,所以好久没有写文章了.今天我们聊一聊Objective-C自动生成文 ...

  9. Objective-C 自动生成文档工具:appledoc

    来源:iOS_小松哥 www.jianshu.com/p/fd4d8d6b6177 如有好文章投稿,请点击 → 这里了解详情 由于最近琐事比较多,所以好久没有写文章了.今天我们聊一聊Objective ...

最新文章

  1. 【Git】Git 基础命令 ( Git 版本库概念 | 创建版本库 git init | 克隆版本库 git clone )
  2. 10.4-全栈Java笔记:常用流详解(二)
  3. .Net中删除数据前进行外键冲突检测
  4. 以太坊智能合约编程之带菜鸟入门教程
  5. Linq中的group by多表多字段,Sum求和
  6. MySQL笔记(六)视图 view
  7. 《团队-爬取豆瓣电影TOP250-设计文档》
  8. 混合编程:如何用pybind11调用C++
  9. linux子网掩码和ip计算,子网掩码的计算 - winglok的个人页面 - OSCHINA - 中文开源技术交流社区...
  10. uni-app 跨端开发注意事项
  11. 安装python缺少dll_解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
  12. 局域网sip服务器搭建:opensips
  13. 连点脚本java,按键精灵如何设置自动连续点击 自动连点脚本设置教程
  14. 如何打开高清语音VOLTE
  15. NuGet是什么?为什么.NET项目中会有NuGet?如何使用NuGet程序包?
  16. CSU 1598 KMP
  17. python 正态分布图_用python制作正态分布图
  18. 循环神经网络之LSTM、GRU
  19. MemoryCache缓存
  20. 上海:IPTV进入三屏融合时代

热门文章

  1. JZOJ 3490. 旅游(travel)
  2. cmake安装配置及入门指南
  3. 【转】前端进阶之路:如何高质量完成产品需求开发
  4. Matplotlib安装感想
  5. 在运行时切换 WinForm 程序的界面语言 System.ComponentModel.ComponentResourceManager .ApplyResources...
  6. Django- UnicodeDecodeError:‘utf-8‘ codec can‘t decode 问题解决
  7. VS2012解决方案的设置
  8. Nginx解决前端调用后端接口跨域问题
  9. mysql 1053错误,无法启动的解决方法
  10. 本地主机作服务器解决AJAX跨域请求访问数据的方法