当前位置:   article > 正文

关于python-docx自动生成word文档的总结_phython word生成预览

phython word生成预览

目录

一、结构

二、常用的API介绍

三、实例展示

展示一

展示二


        最近接到一个需求——把数据库里的数据做成表格,然后形成一本书,打印出来送给客户。由于系统目前没有自动导出word或者excel类似的功能,只能自己去实现。这个任务的要点在于,表格的形成,然后是多个表格排版在一起。在没有接触过怎么用python自动生成word和PDF文件,这个完全就不知道工作量。后面在网上找资料,发现用python-docx就能实现这个功能,而且代码量很少。当然例如pydf2和Reportlab也能实现PDF,画图也有专门的库pyecharts等。这里主要就是简单总结一下python-docx自动生成word文档相关的内的内容,算作入门,用以复习使用。

一、结构

python-docx把一个word文档视为一个Document()对象,然后根据内容的形式分为一些子类。

标题:add_heading,分为一二三四级等标题;

段落:paragraph,add_paragraph;

表格:table,add_table;

图片:picture,add_picture

他们直接的一些相互关系,可以用一张结构图来表示:

run对象是Python-docx的最基本的单位,例如每一个段落有一个run对象,每一行有一个run对象;每一个表格对象有一个run对象,每一个单元格有一个run对象。通过这个run对象我们就可以精准的控制文档中不同内容、不同粒度的样式,包括字体大小和颜色等。

基本word生成步骤:

1、document = Document() 

2、document.add_*....

3、document.save(path)

 

二、常用的API介绍

1、创建、打开一个文档对象

  1. document = Document()#创建一个文档
  2. document = Document(path)#从path路径打开一个已存在的文档

2、设置标题

注意level参数,控制标题的级别

document.add_heading(text=u'关于python-docx的使用说明',level=1)
3、添加段落文本

这里的style参数用来控制文本的风格格式等,类似前段css样式。当然也可以通过run、add_run()的方式来实现。

  1. document.add_paragraph(text='首先..........其次。。。。。。。。再次。。。。。。。。。', style=None)
  2. document.add_paragraph(text='首先..........其次。。。。。。。。再次。。。。。。。。。', style=None)
  3. run1 = document.add_paragraph( style=None).add_run(text='首先..........其次。。。。。。。。再次。。。。。。。。。')
  4. run1.font.size = Pt(16) # 设置大小为16磅
  5. run1.font.color.rgb = RGBColor(0, 255, 0) # 设置为蓝色 这个可以查找RGB颜色对照表

4、添加表格

这里涉及到表格的行列坐标,以及合并。合并的时候是采用行列坐标来确定单元格的位置,merge函数来实现。单元格:table.cell(row,column)。

  1. table = document.add_table(rows=5, cols=5, style='Table Grid')
  2. # 单元格合并
  3. table.cell(0, 0).merge(table.cell(0, 4)) #第一行合并
  4. table.cell(1, 0).merge(table.cell(2, 2)) #第二行的123列和第3行的123列合并

5、添加图片

add_picture(image_path_or_stream, width=None, height=None),参数分别是图片路径,宽度和高度等。如下,一个函数搞定。

document.add_picture('qianyixue.jpeg')

但是要排版居中的话就有点麻烦,这里需要先引用一个paragraph,然后用它的居中属性来控制:

paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

  1. # 添加图片并且居中
  2. paragraph = document.add_paragraph()
  3. # 图片居中设置
  4. paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  5. run = paragraph.add_run("")
  6. run.add_picture('qianyixue.jpeg')

6、分页符

add_page_break() #增加分页符

这里有的时候排版需要这个分页符的功能

 

三、实例展示

展示一

下面看一效果,随便添加的几个文档要素。代码入下:

  1. from docx import Document
  2. from docx.shared import Pt,Inches
  3. from docx.shared import RGBColor
  4. from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
  5. if __name__ == '__main__':
  6. document = Document()
  7. title = document.add_heading(text=u'关于python-docx的使用说明',level=1)
  8. #标题居中
  9. title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  10. document.add_paragraph(text='首先..........其次。。。。。。。。再次。。。。。。。。。', style=None)
  11. run1 = document.add_paragraph( style=None).add_run(text='首先..........其次。。。。。。。。再次。。。。。。。。。')
  12. run1.font.size = Pt(16) # 设置大小为11磅
  13. run1.font.color.rgb = RGBColor(0, 255, 0) # 设置为蓝色 这个可以查找RGB颜色对照表
  14. #添加表格
  15. table = document.add_table(rows=5, cols=5, style='Table Grid')
  16. # 单元格合并
  17. table.cell(0, 0).merge(table.cell(0, 4)) #第一行合并
  18. table.cell(1, 0).merge(table.cell(2, 2)) #第二行的123列和第3行的123列合并
  19. table.cell(0, 0).add_paragraph('这是第一行')
  20. table.cell(1, 0).add_paragraph('第二行和第3行合并')
  21. #换行
  22. document.add_paragraph('\n')
  23. #添加图片
  24. document.add_picture('qianyixue.jpeg', width=Inches(4))
  25. # 添加图片并且居中
  26. paragraph = document.add_paragraph()
  27. # 图片居中设置
  28. paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  29. run = paragraph.add_run("")
  30. run.add_picture('qianyixue.jpeg',width=Inches(4))
  31. #保存word文档
  32. document.save('test.docx')

文档效果:

qianyixue

 

展示二

如下图,要从数据库中查询数据并且做成如下排版的格式,每个页面2个表格,同时还要把数据进行分类,添加2级标题。

de

实现其实很简单,遍历的生成表格,在每一类数据之前添加标题,每生成2个table就换页;每一类数据完成了也换页。

关键代码如下:

  1. document = Document()
  2. fill_save_table(document, patent_data_list, secondary_headlines, new_IpcNums, save_file_docx)
  3. print('生成word文档完成!')
  4. def fill_save_table(document,patent_data_list,secondary_headlines, new_IpcNums,path):
  5. for secondary_headline,new_IpcNum in tqdm(list(zip(secondary_headlines, new_IpcNums)),desc='生成word表格'):
  6. run = document.add_heading('',level=2).add_run(secondary_headline)
  7. run.font.size = Pt(16) # 设置大小为11磅
  8. run.font.color.rgb = RGBColor(0,0,0) #设置为黑色
  9. for i in range(new_IpcNum):
  10. produce_table(document)
  11. document.add_paragraph('')
  12. if (i + 1) % 2 == 0 and (i + 1) != new_IpcNum:
  13. document.add_page_break()
  14. document.add_page_break()
  15. #保存document文档
  16. document.save(path)
  17. #打开document文档
  18. document = Document(path)
  19. tables = document.tables
  20. for table,ele in tqdm(list(zip(tables,patent_data_list)),desc='把数据填充到表格中:'):
  21. #填充数据
  22. table.cell(0,0).add_paragraph(ele[0])
  23. table.cell(0, 1).add_paragraph(ele[1])
  24. table.cell(0, 4).add_paragraph(ele[2])
  25. table.cell(0, 6).add_paragraph(ele[3])
  26. table.cell(0, 7).add_paragraph(ele[4])
  27. table.cell(1, 0).add_paragraph(ele[5])
  28. table.cell(1, 1).add_paragraph(ele[6])
  29. table.cell(1, 3).add_paragraph(ele[7])
  30. table.cell(1, 4).add_paragraph(ele[8])
  31. table.cell(1, 6).add_paragraph(ele[9])
  32. table.cell(1, 7).add_paragraph(ele[10])
  33. table.cell(2, 0).add_paragraph(ele[11])
  34. table.cell(2, 1).add_paragraph(ele[12])
  35. document.save(path)
  36. def produce_table(document):
  37. table = document.add_table(rows=3,cols=10,style='Table Grid')
  38. #单元格合并
  39. table.cell(0, 1).merge(table.cell(0, 3))
  40. table.cell(0,4).merge(table.cell(0, 5))
  41. table.cell(0, 7).merge(table.cell(0, 9))
  42. table.cell(1, 1).merge(table.cell(1, 2))
  43. table.cell(1, 4).merge(table.cell(1, 5))
  44. table.cell(1, 7).merge(table.cell(1, 9))
  45. table.cell(2, 1).merge(table.cell(2, 9))

 

 

写在最后,以上内容其实很简单,当然写的也很粗糙,关于API和其他的一些注意的点,可以参考这一篇博客:python-docx中文文档使用小结

 

 

参考文章:

python docx 使用总结

python-docx中文文档使用小结

python-docx 如何使图片居中?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/421184
推荐阅读
相关标签
  

闽ICP备14008679号