How can I insert a checkbox form into a .docx file using python-docx?

前端 未结 2 538
闹比i
闹比i 2020-12-21 20:11

I\'ve been using python to implement a custom parser and use that parsed data to format a word document to be distributed internally. All of the formatting has been straight

2条回答
  •  青春惊慌失措
    2020-12-21 20:43

    I've finally been able to accomplish this after lots of digging and help from @scanny.

    Checkboxes can be inserted into any paragraph in python-docx using the following function. I am inserting a checkbox into specific cells in a table.

    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
    

    The fldData.text object seems random but was taken from the generated XML form a word document with an existing checkbox. The function fails without setting this text. I have not confirmed but I have heard of one scenario where a developer was arbitrarily changing the string but once saved it would revert back to the original generated value.

提交回复
热议问题