>>> from env_helper import info; info()
页面更新时间: 2024-04-04 19:45:06
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

2.5. 实例:读取电子表格数据写入 DOCX 文档

数据的统计分析是我们每个人都处理过得问题,将统计分析的结果形成一份漂亮的报告才是我们的根本目的,在报告内使用数据会更加美观、更有说服力。

2.5.1. 场景说明

我们通常使用excel进行数据的统计分析,使用word编写文档,在这里实例里,我们实现如果将excel的数据读取出来,在word内进行使用。

2.5.2. 解决思路

这里有两种解决思路; 第一种是不考虑数据的插入位置的,可以将数据依次写入,比如在表格内、连续的段落内。第二种为考虑数据插入的位置,需要将数据写入特定的位置。 每一种方法都带有优缺点,例如你想将同一个数据插入到多个文档,并且插入的位置不是固定时,显然需要使用第二种方法。

2.5.3. 解决办法

先实现第一个解决思路,不考虑位置的数据插入,假如向一个表格内插入十条数据,我们需要先准备好数据,

excel表内数据内容如下:

_images/e_mod.png

创建一个10行7列的表格

>>> from openpyxl import load_workbook
>>> from docx import Document
>>> word = Document('./d_mod.docx')
>>> table1 = word.add_table(10,7)
>>> word.save('./d_mod.docx')

这会添加一个10行7列的表格,表格样式为None

读取excel内容,然后插入文档的表格内:

>>> excel = load_workbook('./e_mod.xlsx')
>>> ws = excel.active
>>> sheet=excel.get_sheet_by_name('Sheet1')
/tmp/ipykernel_19174/292982847.py:3: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  sheet=excel.get_sheet_by_name('Sheet1')

向表格内插入数据

>>> for i  in range(0,10):
>>>     table1.cell(i,0).text=str(ws.cell(row=(i+1), column=1).value)
>>>     table1.cell(i,1).text=str(ws.cell(row=(i+1), column=2).value)
>>>     table1.cell(i,2).text=str(ws.cell(row=(i+1), column=3).value)
>>>     table1.cell(i,3).text=str(ws.cell(row=(i+1), column=4).value)
>>>     table1.cell(i,4).text=str(ws.cell(row=(i+1), column=5).value)
>>>     table1.cell(i,5).text=str(ws.cell(row=(i+1), column=6).value)
>>>     table1.cell(i,6).text=str(ws.cell(row=(i+1), column=7).value)
>>> word.save('./d_mod.docx')

结果如下:

_images/non_insert.png

实现第二个思路,即考虑数据要插入的位置,这与上一个实例有一些相似之处,需要一个占位符作为目标,最后将占位符替换掉。

>>> tmpl = Document('./tmpl.docx')
>>> paras = tmpl.paragraphs

获取数据直接写入docx文档内,在文档内使用 { } 的形式作为占位标志,使用时可以重新定义。

>>> for row in range(4,10):
>>>     pa1 = paras[0]
>>>     pa2 = paras[1]
>>>     pa1.text = pa1.text.replace('{a}', str(ws.cell(row=row, column=2).value))
>>>     pa2.text = pa2.text.replace('{c}', str(ws.cell(row=row, column=4).value))
>>>     word.add_paragraph(pa1.text, pa1.style)
>>>     word.add_paragraph(pa2.text, pa2.style)

保存为新文件

>>> word.save('xx_tmpl.docx')

如果你的word内有多个表格,可以进行表里获取,我的模板里只用了一个表格,如果你想操作第二个表格,可以再次声明一个table

tabel = word.tables[1]

这样可以获取到所有的表格。

2.5.4. 总结

相比而言第二种方法的应用场合非常广,可以同时向所有目标文档内替换数据,再次修改也很方便。要注意占位的标志符不要使用常用的文字或符号,容易造成替换错误。