Search code examples
python-3.xms-worddocxpython-docx

How to update content in existing word document using python


I have an existing word document in the below format.

1. Test Case Specification Identifier

    [test case number] 55-01-01
    [title] Login with default 

    [revision history] 

    2. Test Items
     [objective] 

    3. Execution
    [step 1]    ;# Non-executable description
      [step 1.1]        ;# Executable Step Level 2 or more

I want to open this word document and update the [objective] and [step] with the below value using python.

objective = "This is objective"

Steps = {"step1":["step1.1","step1.2"],"step2":["step2.1"]}

After including the above data, the output document has look like below.


1. Test Case Specification Identifier
[test case number] 55-01-01
[title] Login with default 

[revision history] 

2. Test Items
 [objective] 
This is objective

3. Execution
[step 1]    Step 1
  [step 1.1]    Step 1.1
  [step 1.2]    Step 1.2
[step 2]    Step 2
  [step 2.1]    Step 2.1

Could you please help?


Solution

  • Try this:

    from docx import Document
    import re
    
    document = Document(docx='existing.docx')
    objective = "This is objective"
    
    steps = ["step 1", "step 1.1", "step 1.2", "step 2", "step 2.1"]    
    
    # read current document contents
    for paragraph in document.paragraphs:
    
        if '[objective]' in paragraph.text:
            paragraph.text += objective
    
        for step in steps:
            indent = 1
            if re.search(r"{}\]".format(step), paragraph.text):
                print step, paragraph.text
                if '.' in step:
                    indent += 1
                paragraph.text = '{}[{}]\t{}'.format('\t'*indent, step, step.title())
                steps.remove(step)
    
    # add remaining steps not in existing document    
    for step in steps:
        indent = 1
        if '.' in step:
            indent += 1
        document.add_paragraph('{}[{}]\t{}'.format('\t'*indent, step, step.title()))
    
    document.save('output.docx')