经过@scanny的大量挖掘和帮助,我终于能够完成此任务。
可以
python-docx使用以下功能将复选框插入任何段落。我将复选框插入表中的特定单元格。
def addCheckbox(para, box_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') checkbox = docx.oxml.shared.OxmlElement('w:checkBox') 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') checkbox.append(sizeauto) checkbox.append(default) ffdata.append(name) ffdata.append(enabled) ffdata.append(calconexit) ffdata.append(checkbox) 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(box_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 = 'FORMCHECKBOX' 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(box_id)) end.set(docx.oxml.ns.qn('w:name'), name) tag5.append(end) return
该
fldData.text对象似乎是随机的,但是是从生成的XML中带一个带有现有复选框的Word文档中提取的。如果不设置此文本,该功能将失败。我还没有确认,但是我听说过一种情况,开发人员可以随意更改字符串,但是一旦保存,它将恢复为原始生成的值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)