使用Python将整个word文档(包括表)复制到另一个文档
我需要将模板的全部内容复制到新文档中。问题是无法复制表。目前,我的代码负责复制粗体和斜体等样式使用Python将整个word文档(包括表)复制到另一个文档,python,python-3.x,ms-word,python-docx,Python,Python 3.x,Ms Word,Python Docx,我需要将模板的全部内容复制到新文档中。问题是无法复制表。目前,我的代码负责复制粗体和斜体等样式 def get_para_data(output_doc_name, paragraph): output_para = output_doc_name.add_paragraph() for run in paragraph.runs: output_run = output_para.add_run(run.text) # Run's bold da
def get_para_data(output_doc_name, paragraph):
output_para = output_doc_name.add_paragraph()
for run in paragraph.runs:
output_run = output_para.add_run(run.text)
# Run's bold data
output_run.bold = run.bold
# Run's italic data
output_run.italic = run.italic
# Run's underline data
output_run.underline = run.underline
# Run's color data
output_run.font.color.rgb = run.font.color.rgb
# Run's font data
output_run.style.name = run.style.name
# Paragraph's alignment data
output_para.paragraph_format.alignment =
paragraph.paragraph_format.alignment
input_doc=Document('templatemain.docx')
output_doc=Document()
for para in input_doc.paragraphs:
get_para_data(output_doc, para)
output_doc.save('OutputDoc.docx')
我发现复制表的大部分帮助是附加它们。但是我正在将模板复制到一个空白文档中,因此这对我没有任何帮助。您只是在迭代文档的.parations属性。表通过.Tables属性单独列出 您需要按照文档顺序将文档主体的所有子元素循环到一起,否则最终会将所有段落和表格聚在一起。pythondocx库不直接提供此功能,您需要这样做 例如,简化版本为:
from docx.oxml.text.paragraph import CT_P
from docx.oxml.table import CT_Tbl
from docx.table import Table
from docx.text.paragraph import Paragraph
# select only paragraphs or table nodes
for child in input_doc.element.body.xpath('w:p | w:tbl'):
if isinstance(child, CT_P):
paragraph = Paragraph(child, input_doc)
get_para_data(output_doc, paragraph)
elif isinstance(child, CT_Tbl):
table = Table(child, input_doc)
# do something with the table
表格只能包含在文档正文、嵌套在其他表格中的表格单元格、页眉和页脚、脚注和跟踪的更改中,而不能包含在段落中。您只需迭代文档的.paragrations属性。表通过.Tables属性单独列出 您需要按照文档顺序将文档主体的所有子元素循环到一起,否则最终会将所有段落和表格聚在一起。pythondocx库不直接提供此功能,您需要这样做 例如,简化版本为:
from docx.oxml.text.paragraph import CT_P
from docx.oxml.table import CT_Tbl
from docx.table import Table
from docx.text.paragraph import Paragraph
# select only paragraphs or table nodes
for child in input_doc.element.body.xpath('w:p | w:tbl'):
if isinstance(child, CT_P):
paragraph = Paragraph(child, input_doc)
get_para_data(output_doc, paragraph)
elif isinstance(child, CT_Tbl):
table = Table(child, input_doc)
# do something with the table
表格只能包含在文档正文、嵌套在其他表格中的表格单元格、页眉和页脚、脚注和跟踪的更改中,而不能包含在段落中。请澄清您拥有的表格类型。你在帖子上使用了“excel”标签,你有嵌入的excel电子表格吗?或者这些只是常规格式的Word表格?您使用哪个库打开Word文档?我猜是PythonDocx?我用的是PythonDocx。我在剩下的代码中使用了Excel。错把它包括在这里了。它在这个片段中没有相关性。请澄清您有什么类型的表。你在帖子上使用了“excel”标签,你有嵌入的excel电子表格吗?或者这些只是常规格式的Word表格?您使用哪个库打开Word文档?我猜是PythonDocx?我用的是PythonDocx。我在剩下的代码中使用了Excel。错把它包括在这里了。它在这个片段中没有相关性。谢谢!我试试这个。嘿,很抱歉回复晚了。你能解释一下child和iterchildren是什么吗?这个代码对我来说不太管用。输出中没有错误,但也没有更改。甚至段落中的文本现在也没有被复制。@nonamelowlife:docx是一种XML格式,python docx库基本上通过lxml库包装XML元素,该库提供了类似iterchildren-see的方法。然后,child是一个特殊的PythonDocxXML元素,是lxml etree.element类的一个子类。像CT_P和CT_Tbl这样的类本质上是Python docx项目如何工作的实现细节,但不幸的是,该项目没有为我们提供更好的方法来查找段落和表。@nonamelowlife:我已经在几个文档上测试过这一点,代码工作得很好。你确定input_doc.tables不是一个空列表吗?@nonamelowlife:另一方面,我可能误解了这些表的位置。如果不是文档正文的一部分,它们位于何处?谢谢!我试试这个。嘿,很抱歉回复晚了。你能解释一下child和iterchildren是什么吗?这个代码对我来说不太管用。输出中没有错误,但也没有更改。甚至段落中的文本现在也没有被复制。@nonamelowlife:docx是一种XML格式,python docx库基本上通过lxml库包装XML元素,该库提供了类似iterchildren-see的方法。然后,child是一个特殊的PythonDocxXML元素,是lxml etree.element类的一个子类。像CT_P和CT_Tbl这样的类本质上是Python docx项目如何工作的实现细节,但不幸的是,该项目没有为我们提供更好的方法来查找段落和表。@nonamelowlife:我已经在几个文档上测试过这一点,代码工作得很好。你确定input_doc.tables不是一个空列表吗?@nonamelowlife:另一方面,我可能误解了这些表的位置。如果不是文档正文的一部分,它们位于何处?