bra*_*d14 7 python python-docx
我正在使用python-docx模块自动创建Word文档的过程.特别是,我正在创建一个多选项测试,其中问题编号为1,2,3.,......并且在每个问题下有4个答案应标记为A.,B.,C.和D.我用一种风格来创建编号列表和字母列表.但是,我不知道如何重启这些字母.例如,第二个问题的答案范围是E.,F.,G.,H.有谁知道如何将字母重新启动回A?我可以手动指定答案字符串中的字母,但我想知道如何使用样式表.谢谢.
简短的回答是python-docx中还不支持这个,但是如果你在项目的Github问题列表上询问这个问题,我们可能会为你提供一个解决方法:https://github.com/python- OPENXML /蟒蛇,DOCX /问题/ 25
这个特殊的操作在Word中比我认识的人更难.我认为这与需要在这三十年的Word中维持这么多版本的某些向后兼容性有关.
为了给你一个想法,这个样式引用了一个编号定义,它自己引用了一个抽象的编号定义.带有样式的每个段落都会获得序列中的下一个数字/字母.要重新启动序列,您必须创建一个新的编号定义,该定义引用与前一个相同的抽象编号序列.然后在序列应重新启动的段落上引用新的编号定义.具有以下样式的段落:在重新启动的序列中获得下一个数字/字母.
为了实现这一目标,您需要:
无论如何,现在我已经发泄了所有可以告诉你的事情,我们实际上已经让它开始工作了.我们还没有将它添加到API中,但我认为主要是因为它不完全清楚API应该是什么样子并且还没有上升到积压的顶部.但是如果你想要的话,一些解决方法可能会让你完成它.
在你的情况下,我认为这将是一个折腾.我想我会强烈考虑在这种情况下将这些位直接放在段落中,但你最好能够做出决定.
小智 6
我创建了一个拉取请求(#582)来在低级别解决这种情况。我所做的只是定义实现numberingWML 子系统所需的 XML 类型。@scanny 创建了一个名为 的子模块xmlchemy,它创建 XML 的半抽象表示形式,以便您可以处理多级列表和其他编号任务(如果您熟悉该标准)。因此,如果您构建我的分叉,则以下代码将起作用:
#!/usr/bin/python
from docx import Document
from docx import oxml
d = Document()
"""
1. Create an abstract numbering definition for a multi-level numbering style.
"""
numXML = d.part.numbering_part.numbering_definitions._numbering
nextAbstractId = max([ J.abstractNumId for J in numXML.abstractNum_lst ] ) + 1
l = numXML.add_abstractNum()
l.abstractNumId = nextAbstractId
m = l.add_multiLevelType()
m.val = 'multiLevel'
"""
2. Define numbering formats for each (zero-indexed)
level. N.B. The formatting text is one-indexed.
The user agent will accept up to nine levels.
"""
formats = {0: "decimal", 1: "upperLetter" }
textFmts = {0: '%1.', 1: '%2.' }
for i in range(2):
lvl = l.add_lvl()
lvl.ilvl = i
n = lvl.add_numFmt()
n.val = formats[i]
lt = lvl.add_lvlText()
lt.val = textFmts[i]
"""
3. Link the abstract numbering definition to a numbering definition.
"""
n = numXML.add_num(nextAbstractId)
"""
4. Define a function to set the (0-indexed) numbering level of a paragraph.
"""
def set_ilvl(p,ilvl):
pr = p._element._add_pPr()
np = pr.get_or_add_numPr()
il = np.get_or_add_ilvl()
il.val = ilvl
ni = np.get_or_add_numId()
ni.val = n.numId
return(p)
"""
5. Create some content
"""
for x in [1,2,3]:
p = d.add_paragraph()
set_ilvl(p,0)
p.add_run("Question %i" % x)
for y in [1,2,3,4]:
p2 = d.add_paragraph()
set_ilvl(p2,1)
p2.add_run("Choice %i" % y)
d.save('test.docx')
Run Code Online (Sandbox Code Playgroud)