导入文档时python-docx可以保留字体颜色和样式吗?

时间:2019-04-26 16:15:43

标签: python ms-word

基本上,我需要做的是编写一个程序,该程序接收许多.docx文件,并将它们全部放入一个文件中,并以某种方式排序。我通过以下方式导入工作:

import docx, os, glob
finaldocname = 'Midterm-All-Questions.docx'
finaldoc=docx.Document()
docstoworkon = glob.glob('*.docx')
if finaldocname in docstoworkon:
    docstoworkon.remove(finaldocname)   #dont process final doc if it exists

for f in docstoworkon:
    doc=docx.Document(f)

    fullText=[]
    for para in doc.paragraphs:
        fullText.append(para.text)  #generates a long text list

    # finaldoc.styles = doc.styles
    for l in fullText:
        # if l=='u\'\\n\'':
        if '#' in l:
            print('We got here!')
            if '#1 ' not in l:  #check last two characters to see if this is the first question
                finaldoc.add_section()  #only add a page break between questions
        finaldoc.add_paragraph(l)
        # finaldoc.add_page_break
        # finaldoc.add_page_break
finaldoc.save(finaldocname)

但是我需要保留文本样式,例如字体颜色,大小,斜体等,并且它们不在这种方法中,因为它只是获取原始文本并将其转储。我在python-docx文档中找不到有关保留文本样式或导入除原始文本以外的任何内容的任何信息。有人知道该怎么做吗?

1 个答案:

答案 0 :(得分:1)

在python-docx中使用样式有点困难,但是可以做到。

首先请参阅this explanation,以了解样式和Word的一些问题。


漫漫长路

当您将文件读为Document()时,它将带入所有paragraphs,并且在每个runs内。这些runs是带有相同样式的文本块。

您可以通过在对象上执行len()来找出有多少段或段​​,或者可以像在示例中使用paragraphs那样遍历它们。

您可以检查任何给定段落的样式,但是运行可能具有与整个段落不同的样式,因此我将跳过运行本身,并使用paragraphs[0].runs[0].style检查那里的样式,这将为您提供样式宾语。您可以检查font对象之外的对象,它会告诉您许多attributes,例如sizeitalicbold等。

现在有了长远的解决方案:
首先,您应该创建一个新的空白段落,然后再与原始文本一起add_run()进行操作。您可以为每个属性定义一个style属性,但是它必须是第一个链接中所述的命名样式。您不能直接应用一个stlye对象,因为它不会复制属性。但是有一种解决方法:检查您要复制到输出的属性,然后确保新运行应用相同的属性。

doc_out = docx.Document()
for para in doc.paragraphs:
    p = doc_out.add_paragraph()
    for run in para.runs:
        r = p.add_run(run.text)
        if run.bold:
            r.bold = True
        if run.italic:
            r.italic = True
        # etc

显然,这效率低下,不是一个很好的解决方案,但是它将确保您正确复制了样式。


添加新样式

有一种add styles by name的方法,但是因为要获取文本和样式的Word文档不太可能使用命名样式(而不是仅对您所用的单词应用粗体等)想要),添加许多稍微不同的样式甚至有时添加相同的样式可能要走很长的路。


不幸的是,这是我为您提供的最佳答案。在Python中处理Word,Outlook和Excel文档不是很好,尤其是对于您要尝试做的事情。