Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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 docx在导入文档时能否保留字体颜色和样式?_Python_Ms Word - Fatal编程技术网

python docx在导入文档时能否保留字体颜色和样式?

python docx在导入文档时能否保留字体颜色和样式?,python,ms-word,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(fi

基本上,我需要做的是编写一个程序,接收许多.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)

但是我需要保留文本样式,比如字体颜色、大小、斜体等等,它们不在这个方法中,因为它只是获取原始文本并转储它。我在pythondocx文档中找不到任何关于保留文本样式或导入原始文本以外的内容。有人知道如何做到这一点吗?

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

请先看,以了解有关样式和单词的一些问题


漫长的道路

当您以
文档()的形式读入文件时,
将引入所有
段落
,其中每个段落都包含
运行
。这些
运行
是具有相同样式的文本块

您可以通过对对象执行
len()
来找出有多少个段落或运行,也可以像您在示例中使用
段落
一样迭代这些段落或运行

您可以检查任何给定段落的样式,但运行的样式可能与整个段落的样式不同,因此我将跳到运行本身,并使用
段落[0]。运行[0]。style
检查那里的样式,这将为您提供一个style对象。您可以检查
字体
对象,该对象将告诉您一些信息,如
大小
斜体
粗体
,等等

现在来看一个长期的解决方案:
你首先应该创建一个新的空白段落,然后你应该用你的原文一个接一个地
add_run()
。对于其中的每一个,您都可以定义
style
属性,但它必须是第一个链接中描述的命名样式。不能直接应用stlye对象,因为它不会复制属性。但是有一种方法可以解决这个问题:检查您想要复制到输出的属性,然后确保您的新运行应用相同的属性

doc\u out=docx.Document()
对于文件段落中的段落:
p=文件输出。添加段落()
对于磨合段运行:
r=p.add\u运行(run.text)
如果为run.bold:
r、 粗体=真
如果为run.italic:
r、 斜体=真
#等
显然,这是低效的,不是一个很好的解决方案,但它可以确保您已经正确地复制了样式


添加新样式

有一种方法可以解决这个问题,但因为您从中获取文本和样式的Word文档不太可能使用命名样式(而不仅仅是将粗体等应用于您想要的单词),因此要添加许多稍微不同的样式,有时甚至是相同的样式,可能还有很长的路要走



不幸的是,这是我给你的关于如何做到这一点的最好答案。在Python中使用Word、Outlook和Excel文档并不太好,尤其是对于您正在尝试的工作。

非常感谢,我非常感谢。