Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将整个word文档(包括表)复制到另一个文档_Python_Python 3.x_Ms Word_Python Docx - Fatal编程技术网

使用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:另一方面,我可能误解了这些表的位置。如果不是文档正文的一部分,它们位于何处?