python-docx复制单元格

puruo6ea  于 2023-01-19  发布在  Python
关注(0)|答案(2)|浏览(262)

我需要复制表格的单元格与文本和图像到另一个文件中的另一个表。

# -*- coding: utf-8 -*-
from docx import Document

oldDocument = Document("d:/first.docx")

newDocument = Document()
temp = oldDocument.tables[9].rows[1].cells[1]
table = newDocument .add_table(rows=1, cols=1)
table.rows[0].cells[0] = temp
newDocument .save("d:/second.docx")

这是表格的示例

这是错误类型错误:“tuple”对象不支持项赋值

jyztefdp

jyztefdp1#

不能简单地将对象从一个文档复制到另一个文档。python-docx API对象是代理对象,这意味着它们是实际构成段落、单元格等的XML的 Package 器。
您需要从源文档中读取内容,然后在目标文档中创建所需的结构(如表格、单元格、段落),将内容放置在它应该放置的位置。
如果你深入到lxml层,你也许可以做一些更花哨的事情,也许可以复制文本及其所有格式(上标等),但这需要深入研究内部并理解底层XML结构。如果你搜索“python-docx workaround function”,你应该会找到一些例子来帮助你开始。

pb3skfrl

pb3skfrl2#

对于任何人谁访问这个问题,而谷歌,这实际上是可行的。
首先,一个文档中的任何内容都可以插入到另一个文档中,并保留GitHub注解中描述的基本样式。

def direct_insert(doc_dest, doc_src):
    for p in doc_src.paragraphs:
        inserted_p = doc_dest._body._body._insert_p(p._p)
        if p._p.get_or_add_pPr().numPr:
            inserted_p.style = "ListNumber"

最后两行在上面提到的评论中被称为列表的“肮脏黑客”。认为它不太好用。要使它与列表一起工作,你必须挖掘得更深一点。If子句是可以的,但要改变风格,我们将在另一个线程中引用此评论。
其中的代码片段:

from docx import Document
from docx.shared import Inches
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

def create_list(paragraph, list_type):
    p = paragraph._p #access to xml paragraph element
    pPr = p.get_or_add_pPr() #access paragraph properties
    numPr = OxmlElement('w:numPr') #create number properties element
    numId = OxmlElement('w:numId') #create numId element - sets bullet type
    numId.set(qn('w:val'), list_type) #set list type/indentation
    numPr.append(numId) #add bullet type to number properties list
    pPr.append(numPr) #add number properties to paragraph

ordered = "5"
unordered = "1"

document = Document()

paragraph = document.add_paragraph("Hello", "List Paragraph")
create_list(paragraph, unordered)

paragraph = document.add_paragraph("Hello Again", "List Paragraph")
create_list(paragraph, unordered)

paragraph = document.add_paragraph("Goodbye", "List Paragraph")
create_list(paragraph, unordered)

paragraph = document.add_paragraph("Hello", "List Paragraph")
create_list(paragraph, ordered)

paragraph = document.add_paragraph("Hello Again", "List Paragraph")
create_list(paragraph, ordered)

paragraph = document.add_paragraph("Goodbye", "List Paragraph")
create_list(paragraph, ordered)

document.save("bullet list demo.docx")

贷记到berezovskyipanoptical
现在,根据上述研究中的信息,问题中的代码应该如下所示:

# -*- coding: utf-8 -*-
from docx import Document

oldDocument = Document("d:/first.docx")

newDocument = Document()
temp = oldDocument.tables[9].rows[1].cells[1]
table = newDocument.add_table(rows=1, cols=1)
for p in temp:
    table.rows[0].cells[0]._element._insert_p(p._p)
newDocument.save("d:/second.docx")

由于原始问题没有列表,因此不包括if子句。

相关问题