经过@scanny的大量挖掘和帮助,我终于能够完成此任务。
可以python-docx
使用以下功能将复选框插入任何段落。我将复选框插入表中的特定单元格。
def addCheck@R_763_2419@(para, @R_763_2419@_id, name):
run = para.add_run()
tag = run._r
fldchar = docx.oxml.shared.OxmlElement('w:fldChar')
fldchar.set(docx.oxml.ns.qn('w:fldCharType'), 'begin')
ffdata = docx.oxml.shared.OxmlElement('w:ffData')
name = docx.oxml.shared.OxmlElement('w:name')
name.set(docx.oxml.ns.qn('w:val'), cb_name)
enabled = docx.oxml.shared.OxmlElement('w:enabled')
calconexit = docx.oxml.shared.OxmlElement('w:calcOnExit')
calconexit.set(docx.oxml.ns.qn('w:val'), '0')
check@R_763_2419@ = docx.oxml.shared.OxmlElement('w:check@R_763_2419@')
sizeauto = docx.oxml.shared.OxmlElement('w:sizeAuto')
default = docx.oxml.shared.OxmlElement('w:default')
if checked:
default.set(docx.oxml.ns.qn('w:val'), '1')
else:
default.set(docx.oxml.ns.qn('w:val'), '0')
check@R_763_2419@.append(sizeauto)
check@R_763_2419@.append(default)
ffdata.append(name)
ffdata.append(enabled)
ffdata.append(calconexit)
ffdata.append(check@R_763_2419@)
fldchar.append(ffdata)
tag.append(fldchar)
run2 = para.add_run()
tag2 = run2._r
start = docx.oxml.shared.OxmlElement('w:bookmarkStart')
start.set(docx.oxml.ns.qn('w:id'), str(@R_763_2419@_id))
start.set(docx.oxml.ns.qn('w:name'), name)
tag2.append(start)
run3 = para.add_run()
tag3 = run3._r
instr = docx.oxml.OxmlElement('w:instrText')
instr.text = 'FORMCHECK@R_763_2419@'
tag3.append(instr)
run4 = para.add_run()
tag4 = run4._r
fld2 = docx.oxml.shared.OxmlElement('w:fldChar')
fld2.set(docx.oxml.ns.qn('w:fldCharType'), 'end')
tag4.append(fld2)
run5 = para.add_run()
tag5 = run5._r
end = docx.oxml.shared.OxmlElement('w:bookmarkEnd')
end.set(docx.oxml.ns.qn('w:id'), str(@R_763_2419@_id))
end.set(docx.oxml.ns.qn('w:name'), name)
tag5.append(end)
return
该fldData.text
对象似乎是随机的,但是是从生成的XML中带一个带有现有复选框的Word文档中提取的。如果不设置此文本,该功能将失败。我还没有确认,但是我听说过一种情况,开发人员可以随意更改字符串,但是一旦保存,它将恢复为原始生成的值。