当前位置: 首页 > 知识库问答 >
问题:

如何将方程从docx复制到另一个docx中的特定位置?

伍溪叠
2023-03-14

您好,我目前正在尝试编写一个结合docx文件的代码。这些文件可能包含文本、图像、表格或方程式。代码旨在复制这些对象并将它们附加到基本docx。我可以使用docx模块的“添加图片”和“添加段落”方法复制和合并文本、图像和表格,但我无法对word公式执行此操作。我决定尝试深入研究docx的xml,并从那里复制等式部分。我可以将公式附加到我的基本文档中,但是当我继续附加图片、文本和表格时,这些公式会显示在docx的末尾。我的问题是:如果我按照希望附加对象出现的顺序循环附加对象,为什么会出现这种情况?是否有办法防止代码将公式放在docx的末尾。

下面是代码的一些概述:

>

文档=文档('basedoc.docx')

对于子文档的每个块项目,我对类型、样式以及是否存在等式进行分类

如果是实例(块,段):

if "r:embed" in block._element.xml:

    append content,style, and equation arrays, content being a drawing/image

elif "m:oMathPara" in block._element.xml:

    append content,style, and equation arrays, content being an equation
    equationXml.append(block._element.xml)

elif 'w:br w:type="page"' in block._element.xml:

    append content,style, and equation arrays, content being a page break

else:

    append content,style, and equation arrays), content being text

其他:

append content,style, and equation arrays, content being a table

一旦我有了我的内容和样式数组,我就可以在内容数组中循环并附加表格、图形、分页符和文本。

    if equationXml[i]=='0': #the content is either an image, table, text, or page break
        if "Table" in str(contentStyle[i]):
                insert table and caption
        else:
            if "drawing" in content[i]:
                insert image and caption

            elif "pageBreak" in content[i]:
                document.add_page_break()
            else:
                insert text
    else:                        #there is an equation present
      document=EquationInsert.(document,equationXml[i])

我的EquationInsert文件有一个名为“AddEquation”的函数,我基本上重写了我的文档对象(其中UpdateableZipFile是我在网上找到的一个代码,可以快速更新zip文件中的文件):

def AddEquation(self,document,equationContent):
    document.save('temp.docx')
    z = zipfile.ZipFile('temp.docx')
    tree=etree.parse(z.open('word/document.xml'))
    nmspcDict = tree.getroot().iter().next().nsmap

    for key in nmspcDict:
        ET.register_namespace(key, nmspcDict[key])
    tree2=etree.ElementTree(etree.fromstring(equationContent))
    xmlRoot2=tree2.getroot()
    xmlRoot=tree.getroot()
    xmlRoot[1].append(xmlRoot2) #note that [1] had to be used bc [0] was a comment. need to see if general case or not


    tree.write("document.xml",encoding="utf-8", xml_declaration=True, standalone="yes", pretty_print=True)

    with UpdateableZipFile.UpdateableZipFile("temp.docx","a") as o:
        o.write("document.xml","word/document.xml")

    document = Document('temp.docx') 
    os.remove('document.xml')
    z.close()
    os.remove('temp.docx')
    return document

这段代码添加了等式,但是当主代码继续循环遍历子文档项时,等式只是以某种方式被推送到基本文档的末尾。我尝试过从插入方程函数返回docx并从中创建一个新文档,但没有任何效果。如果有人有任何关于如何使等式不去文件的末尾的建议,将非常感谢。否则,我将不得不冒险看看如何将这些方程转换成图像=/或docx可以处理的东西。我愿意接受解决方案/建议/意见。谢谢!

共有1个答案

宓博实
2023-03-14

我相信你会在XML中找到答案。您可以使用opc-diag方便地浏览. docx包中的XML部件。

Word文档中的段落和表格位于document.xml部分,作为下的子元素。

我将使用一个尽可能短的测试文档,检查您的代码生成的XML,并将其与您想要的外观(可能是用Word手工创建的)进行比较。这将很快指出代码中存在的任何元素排序问题。

 类似资料:
  • 您好,我正在尝试将一个表从一个docx文件复制到另一个docx文件,但实际情况是,该表的值在新文档中的表下方和表外部被复制(请参见下面的图片) Talbe在新的docx里 正如您所见,表的值被复制到表的外部。我使用的是Libre Office,ApachePOI版本3.17,我的电脑运行的是Ubuntu 16.04 我用来执行复制的代码如下

  • 问题内容: 假设我有两个.DOCX文件,以及我需要选择一些内容,并将其复制到。在显示其在控制台中的内容似乎是正确的,但我没有得到的东西,除了空行。谁能提供建议? 问题答案: 我稍加修改了您的代码,它复制文本而不更改文本格式。 fontSize 仍然存在一些问题。有时POI无法确定运行的大小(我将其值写入控制台以跟踪它)并给出-1。当我自己设置字体时,它可以完美地定义字体的大小(例如,我在Word中

  • 问题内容: 我想将文件从Java中的一个位置复制到另一位置。做这个的最好方式是什么? 这是我到目前为止的内容: 这不会复制文件,执行此操作的最佳方法是什么? 问题答案: 您可以使用此(或任何变体): 另外,我建议您使用或代替使其兼容于多个操作系统. 由于您不确定如何临时存储文件,因此请查看: 要将a 个文件移动到单个目录中:

  • 尽管我复制了所有样式信息,但似乎我缺少了一些东西,因为输出缺少一些格式。

  • 假设我的docx文档中有一个特定的段落,具有特定的文本格式,例如: Foo bar 我想制作一个类似于此段落的模板,以便多次将其复制到同一文档中。 复制文本,如 在示例中意味着文本格式丢失。 有没有任何通用的方法可以使用python docx库来实现这一点 我们还特别感谢python和django的其他解决方案<提前谢谢。

  • 有一种方法可以将特定的数字从一个数组复制到另一个数组吗? 例如: 我有一个数组 ,我想将奇数和偶数复制到不同的数组中。因此,结果应该是