本文授权自AI科技大本营(ID:rgznai100)

本文约2400字,建议阅读5分钟

Python 实现自动化 word 生成程序。

继我们上次用Python实现Excel排版程序之后,我们这次通过使用Python建立Word自动排版程序。其中涉及的知识包括Word表格,字体大小粗细,布局,图表自动生成和计算等一件生成。通过程序一键计算Excel中的数据生成我们需要的标准Word文件,可以极大程度的减少我们的日常工作量,同时可以节省我们的时间。而我们相对于多使用Python去编程的原因,也正是因为Python相对简单容易上手,可以极大的节省我们的时间。

故这次我们将利用Python的一些基本绘图库、计算库、操作Word库等库去实现我们这次的自动化Word生成程序。最终生产的Word效果如下:

1、实验前的准备

首先我们使用的Python版本是3.6.5所用到的模块如下:

  • xlrd库,Python操作Excel主要用到xlrd和xlwt这两个库,即xlrd是读Excel,xlwt是写Excel的库。

  • math模块用来调用常见的运算函数。

  • matplotlib模块是 Python的绘图库。它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。它也可以和图形工具包一起使用,如PyQt 和wxPython。

  • Docx库即为Python-docx包,这是一个很强大的包,可以用来创建docx文档,包含段落、分页符、表格、图片、标题、样式等几乎所有的Word文档中能常用的功能都包含了,这个包的主要功能便是用来创建文档。

下面我们需要将需要处理的数据文件放到同一目录下,部分文件数据如下图:

其中需要用到的三个文件分别是2019年期中成绩.xlsx、2019上机械制图平时成绩.xlsx和2019上机械制图期末成绩.xlsx。

2、数值计算

(1)处理2019上机械制图平时成绩.xlsx表格数据:

首先我们需要读取Excel中的数据,分别读取第一列等数据。代码如下:

'''计算平时成绩'''excel_address="2019上机械制图平时成绩.xlsx"workbook = xlrd.open_workbook(excel_address)sheet1 = workbook.sheet_by_name("Sheet1")col0 = sheet1.col_values(0) # 获取第1列内容,学号那一列col1 = sheet1.col_values(1) # 获取第2列内容col2 = sheet1.col_values(2) # 获取第3列内容col3 = sheet1.col_values(3) # 获取第4列内容col4 = sheet1.col_values(4) # 获取第5列内容col5 = sheet1.col_values(5) # 获取第6列内容col6 = sheet1.col_values(6)col7 = sheet1.col_values(7)col8 = sheet1.col_values(8)col9 = sheet1.col_values(9)col10 = sheet1.col_values(10)col11 = sheet1.col_values(11)col12 = sheet1.col_values(12)

然后通过叠加,计算1-5周的成绩总和、6-8周成绩总和和第9周、10-12周成绩总和,然后求取平均,分别保存为A1、A2、A3、A4变量,代码如下:

'''叠加,1-5周成绩总和,然后平均'''sum1=0for i in col1[1:]:    sum1+=ifor i in col2[1:]:    sum1+=ifor i in col3[1:]:    sum1+=ifor i in col4[1:]:    sum1+=ifor i in col5[1:]:    sum1+=iA1=round((sum1/(len(col1[1:])*5))*41.7/100,1)'''叠加,6-8周成绩总和,然后平均'''sum2=0for i in col6[1:]:    sum2+=ifor i in col7[1:]:    sum2+=ifor i in col8[1:]:    sum2+=iA2=round((sum2/(len(col6[1:])*3))*25/100,1)'''叠加,9周成绩总和,然后平均'''sum3=0for i in col9[1:]:    sum3+=iA3=round((sum3/(len(col9[1:])*1))*8.3/100,1)'''叠加,10-12周成绩总和,然后平均'''sum4=0for i in col10[1:]:    sum4+=ifor i in col11[1:]:    sum4+=ifor i in col12[1:]:    sum4+=iA4=round((sum4/(len(col10[1:])*3))*25/100,1)

(2)处理2019年期中成绩.xlsx表格数据

同样是读取2019年期中成绩.xlsx表格中的数据,然后求平均,作为需要记录的期中成绩:

'''计算期中成绩'''excel_address="2019年期中成绩.xlsx"workbook = xlrd.open_workbook(excel_address)sheet2 = workbook.sheet_by_name("Sheet1")col21 = sheet2.col_values(13) # 获取第1列内容,学号那一列sumqi=0for i in col21[1:]:    sumqi+=iB = round((sumqi / (len(col21[1:]) * 1)) * 100 / 100, 1)

(3)处理2019上机械制图期末成绩.xlsx数据

通过处理2019上机械制图期末成绩.xlsx中数据,计算期末成绩,流程和第一步相似,下面直接给出代码:

'''计算期末成绩'''excel_address = "2019上机械制图期末成绩.xlsx"workbook = xlrd.open_workbook(excel_address)sheet3 = workbook.sheet_by_name("Sheet1")col30 = sheet3.col_values(0)  # 获取第1列内容,学号那一列col31 = sheet3.col_values(1)  # 获取第2列内容col32 = sheet3.col_values(2)  # 获取第3列内容col33 = sheet3.col_values(3)  # 获取第4列内容col34 = sheet3.col_values(4)  # 获取第5列内容col35 = sheet3.col_values(5)  # 获取第6列内容col36 = sheet3.col_values(6)col37 = sheet3.col_values(7)col38 = sheet3.col_values(8)col39 = sheet3.col_values(9)col310 = sheet3.col_values(10)col311 = sheet3.col_values(11)col312 = sheet3.col_values(12)col313 = sheet3.col_values(13)'''叠加,计算内容1(1~3,11题,23分),然后平均'''sum31 = 0for i in col31[1:62]:    sum31 += ifor i in col32[1:62]:    sum31 += ifor i in col33[1:62]:    sum31 += ifor i in col311[1:62]:    sum31 += iC1 = round(sum31 / (len(col31[1:62])), 1)'''叠加,内容2(4~8,12题,48分)),然后平均'''sum32 = 0for i in col34[1:62]:    sum32 += ifor i in col35[1:62]:    sum32 += ifor i in col36[1:62]:    sum32 += ifor i in col37[1:62]:    sum32 += ifor i in col38[1:62]:    sum32 += ifor i in col312[1:62]:    sum32 += iC2 = round(sum32 / (len(col32[1:62])), 1)'''叠加,内容3(9~10题,10分),然后平均'''sum33 = 0for i in col39[1:62]:    sum33 += ifor i in col310[1:62]:    sum33 += iC3 = round(sum33 / (len(col32[1:62])), 1)'''叠加,内容4(第13题,19分),然后平均'''sum34 = 0for i in col313[1:62]:    sum34 += iC4 = round(sum34 / (len(col32[1:62])), 1)zongping=round(0.25*(A1+A2+A3+A4)+0.05*B+0.7*(C1+C2+C3+C4),1)(4)计算A2值,即为计算平时成绩,部分代码如下'''计算平时成绩'''excel_address="2019上机械制图期末成绩.xlsx"workbook = xlrd.open_workbook(excel_address)sheet1 = workbook.sheet_by_name("Sheet1")jun=[]sum1=0for i in col1[1:62]:    sum1+=ijun1=round(sum1/(len(col1[1:62])*col1[63]),2)jun.append(jun1)sum2 = 0sum11 = 0for i in col11[1:62]:    sum11 += ijun11 = round(sum11 / (len(col11[1:62]) * col11[63]), 2)jun.append(jun11)sum12 = 0for i in col12[1:62]:    sum12 += ijun12 = round(sum12 / (len(col12[1:62]) * col12[63]), 2)jun.append(jun12)sum13 = 0for i in col13[1:62]:    sum13 += ijun13 = round(sum13 / (len(col13[1:62]) * col13[63]), 2)jun.append(jun13)score=jun1*4+jun2*8+jun3*5+jun4*8+jun5*8+jun6*10+jun7*8+jun8*5+jun9*6+jun10*4+jun11*6+jun12*9+jun13*19score=round(score,1            )

如下图可见,其为计算出的数据:

3、Word自动排版生成

(1)表格绘制:

在计算好数据之后,需要将数据建立表格放到其中,其中同时也涉及到了字体加粗、行高布局等设置,具体代码有注释,部分代码如下图可见:

#第一个表的绘制
def table1():# 背景色设计def tabBgColor(table, cols, colorStr):shading_list = locals()for i in range(cols):# shading_list['shading_elm_'+str(i)]= parse_xml(r'<w:shd {}w:fill="{bgColor}"/>'.format(nsdecls('w'),bgColor = colorStr))table.rows[0].cells[i]._tc.get_or_add_tcPr().append(parse_xml(r'<w:shd {} w:fill="{bgColor}"/>'.format(nsdecls('w'), bgColor=colorStr)))table.rows[1].cells[i]._tc.get_or_add_tcPr().append(parse_xml(r'<w:shd {} w:fill="{bgColor}"/>'.format(nsdecls('w'), bgColor=colorStr)))document = Document()document.styles['Normal'].font.name = u'等线 (中文正文)'# 背景色,根据需要调整,可参考站长之家选色http://tool.chinaz.com/Tools/PageColor.aspxcolorStr = '#D3D3D3    'paragraph =document.add_paragraph()paragraph.paragraph_format.alignment= WD_ALIGN_PARAGRAPH.CENTERdocument.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'等线 (中文正文)')run = paragraph.add_run('表1 课程评价考核基本信息表 ')# 加粗run.font.bold = Truerun.font.size =Pt(10.5)table = document.add_table(rows=4, cols=11, style='Table Grid')table.alignment =WD_TABLE_ALIGNMENT.CENTER  # 设置表格为居中对齐table.autofit = False# 背景颜色设计tabBgColor(table, 11, colorStr)# 行高table.rows[0].height = Cm(0.82)table.rows[1].height = Cm(0.82)table.rows[2].height = Cm(0.82)table.rows[3].height = Cm(2)'''填写单元格'''table.cell(0, 0).merge(table.cell(1, 0))  # 合并单元格table.cell(0, 0).width = Cm(1.8)table.cell(0, 0).text = "课程目标评价内容"table.cell(0, 0).paragraphs[0].runs[0].font.bold = True # 加粗table.cell(0, 0).paragraphs[0].runs[0].font.size = Pt(9)  # 字号大小table.cell(0, 0).vertical_alignment = WD_ALIGN_VERTICAL.CENTER  # 垂直居中

生成的表格如下图可见:

(2)可视化图形插入:

我们需要分别绘制柱状图和饼状图等插入到word中,部分代码如下:

import matplotlib.pyplot as pltfrom matplotlib.font_manager import FontPropertiesimport numpy as npfont = FontProperties(fname=r"C:\Windows\Fonts\simhei.ttf", size=14)jun,score=dels2()x=[1, 2,3,4,5,6,7,8,9,10,11,12,13]y=jun# 定义函数来显示柱状上的数值def autolabel(rects):    for rect in rects:        height = rect.get_height()        plt.text(rect.get_x() + rect.get_width() / 2. - 0.25, 1.01 * height, '%s' % float(height))plt.xticks(np.arange(len(x)), x)color=[]for i in jun:    if i*100<score:       color.append('cornflowerblue')    else:        color.append('olivedrab')color[jun.index(min(jun))]='r'a = plt.bar(np.arange(len(x)), y, color=color)autolabel(a)plt.hlines(score/100, 0, 13, linestyles='--', colors='#4472C4')plt.legend()plt.xlabel('题号',FontProperties=font)plt.ylabel('得分率',FontProperties=font)plt.savefig("1.jpg")plt.show()document = Document('test.docx')document.styles['Normal'].font.name = u'宋体'document.add_picture('1.jpg', width=Inches(6.0), height=Inches(4.0))paragraph = document.add_paragraph()paragraph.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')run = paragraph.add_run('图1 各试题得分率情况\n从上面图和表可以看出,有4道题低于平均分,分别是第6、9、10、12和13题。')run.font.size = Pt(11)run.font.color.rgb = red  # 数字部分标红document.save('test.docx')

源码地址:

https://pan.baidu.com/s/1wIRBRCEsFilmQl2KO3fOrA

提取码:h4iw

作者简介

李秋键,CSDN 博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap安卓武侠游戏一部,vip视频解析,文意转换工具,写作机器人等项目,发表论文若干,多次高数竞赛获奖等等。

编辑:于腾凯

校对:汪雨晴

Word自动化排版画图,Python还能这么玩?相关推荐

  1. 【原来python还可以这么玩】python逆向爬取网易云评论进行情感分析

    遥遥微光,与我同行 好久不见,各位小伙伴们!嗐,春节真滴快啊!祝大家新年快乐! 书山有路勤为径,学海无涯苦作舟!又得开始愉快滴学习了! 小夜斗今天给大家伙分享一期干货,芜湖起飞! JS逆向网易云爬取评 ...

  2. Python还能这么玩?Turtle一个上帝的指纹!(斐波那契螺旋线)

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...

  3. python turtle画海绵宝宝,python还能这么玩?帅呆了

    漫威还是DC? 超人或者蝙蝠侠? 火影忍者亦或死神? 当然,所有这些讲的都是漫画!!! 当我们还是孩子的时候,总是迷恋漫画书,当翻到我们的英雄们开始行动时会激动不已. 大家总是争论谁是最厉害的超级英雄 ...

  4. 海绵宝宝python代码_Python那些事——python还能这么玩?帅呆了

    当我们还是孩子的时候,总是迷恋漫画书,当翻到我们的英雄们开始行动时会激动不已. 大家总是争论谁是最厉害的超级英雄,认真地讨论他们的家族历史,或者梦想自己拯救高谭市.我们很多人用自己的童年创造了这样的难 ...

  5. Python还能这样玩?让你轻松实现配色自由

    嗨嗨,你们好 好几天没更新了,最近有点点无聊,就琢磨出一个一个有趣的东西 教你们用python快速获取图片配色,做个可视化配色方案出来 这期分享一个Python快速提取任何图片配色方案的工具:Hais ...

  6. wps word文档生成目录的时候显示断裂会生成大纲怎么办_自从学会了Word自动排版,我的秀发浓密多了...

    文/金金 首发于一周进步 每到期末,都是大作业和报告的高发季,一个"死线"刚过,另一堆"死线"接踵而至. 作为一名在报告的海洋里中挣扎,妄图顺利存活的同学,我自 ...

  7. 用Python把QQ聊天记录文件转成WORD并排版

    和女票在一起五年了,保留了几年的QQ聊天记录,偶然翻到,感觉很温暖,就想把这些文字做成一本属于我们的书,应该会很有纪念意义.然而qq备份的聊天记录是txt格式,网上找了半天也没有合适的排版工具,上百页 ...

  8. 自动化办公-3.python自动化之word操作

    一.课前准备 python 处理 Word 需要用到 python-docx 库,终端执行如下安装命令: pip3 install python-docx 备注:可能word用的少,这块并没认真,但是 ...

  9. python如何自动缩进_python word 自动排版写码时应该缩进使用 tab 还是空格?

    对于程序员来说,其实Tab和空格远远不只是"立场"问题那么简单. 在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了.空格 ...

最新文章

  1. 黑客提交漏洞先获感谢后被举报 网络安全行业或现标志性事件
  2. 怎么用python处理excel文件-用python处理excel文件有多轻松?工作从未如此简单
  3. Windows上创建文件夹链接
  4. OpenResty中使用反向代理
  5. oracle domnode释放,关于释放引用DOM对象内存的问题
  6. Python字典的操作与使用
  7. Exchange邮箱数据库事务日志引起磁盘暴涨
  8. Codeforces Round #574 (Div. 2)
  9. 如何不使用输入法打出汉字- 在word中打印出自己的名字
  10. 连接方法:网线水晶头接法
  11. (3)Pairing Functions Element Functions
  12. h5py 必知--String存储
  13. 餐饮行业的利器——大数据
  14. 制作excle报盘模板
  15. sklearn机器学习(六)逻辑回归实例乳腺癌检测
  16. 吴佳怡最新街拍曝光  潮酷girl演绎初秋时尚
  17. 组件-Element—Badge(标记)
  18. 黑客组织 LAPSUS$ 认领,英伟达超7万员工信息遭泄露时间线
  19. java中short类型变量
  20. Unix时间戳与系统毫秒的转换

热门文章

  1. 电子计算机应用地质地貌,岩土基础整理 一、高数24 1、空间解析几何与向量代数 两点间的距离,向量数量积,向量向量积,平面方程,两平面夹角,点到平面的距离,点... - 雪球...
  2. css3图片无缝滚动
  3. STM32F103C8T6寄存器简单应用之LED流水灯
  4. 部署LVS-DR群集【实验】
  5. 强烈推荐:给计算机系学生的建议
  6. 深蓝学院-机器人运动规划学习笔记-第一章
  7. 公开课精华|机器人的带约束轨迹规划
  8. 学习几何很好的可视化工具,Geogebra(GGB),在线版的
  9. Cache Maintenance-关于cache 清除(invalidate)和清理(clean)操作的基础知识
  10. Android 仿淘宝商品详情标题栏变色,布局层叠效果