In this tutorial, I will discuss how to create the .docx file using python. In python one of the ways to create the .docx file is using the python–docx library. Recently I was working on a project in Odoo where I needed to create a .docx file using python. I faced some challenges that I am sharing here. I will show how to add the images, header, footer, etc in the .docx file.
In order to start with the python-docx, you have to install the library, you can install the library using any of the following ways.
1) You can install it using pip as:
pip install python-docx
2)You can install it using easy_install as:
easy_install python-docx
3) You can also install it by manually downloading from PyPI, unpack it and then simply run setup.py
tar xvzf python-docx-{version}.tar.gz
cd python-docx-{version}
python setup.py install
4) After the library is installed you can create a .docx file. I will create a “Test_word.docx” file and I will explain the meaning of some words also.
from docx import Document #Import the Document from docx.shared import Inches #Import Inches, used to set width, height etc from docx.shared import Pt #Import Pt, used to font etc document = Document() logo_path = 'logo.png' # Path of the image file section = document.sections[0] # Create a section sec_header = section.header # Create header header_tp = sec_header.add_paragraph() # Add a paragraph in the header, you can add any anything in the paragraph header_run = header_tp.add_run() # Add a run in the paragraph. In the run you can set the values header_run.add_picture(logo_path, width=Inches(2.0)) # Add a picture and set width. rml_header = "\t\t This is the header message" header_run.add_text(rml_header) header_run.add_text("\n________________________________________________________________________________________________") header_run.font.size = Pt(8) text = "Second Floor\nA 20 Sector 1\n Lajpat Nagar \nNew Delhi 201301\n______________" table_main = document.add_table(rows=1, cols=2) table_main.allow_autofit = True tx_cells = table_main.rows[0].cells tb_cell_run = tx_cells[0].add_paragraph().add_run() tb_cell_run.add_text(text) tb_cell_run.font.size = Pt(8) tx_cells[0].width = Inches(5) pic_cells = table_main.rows[0].cells pic_cell = pic_cells[1] run = pic_cell.add_paragraph().add_run() run.add_picture("user_image.jpg", width=Inches(0.8)) user_address = document.add_paragraph() user_address_run = user_address.add_run() user_address_run.text = "First Floor\nA 50 Sector 1\n Noida \n U.P 201301\n______________" user_address_run.font.size = Pt(8) table = document.add_table(rows=1, cols=4) #Create a table with and set the rows and columns table.style = "Table Grid" # Define the table style. You can set any style defined in the styles files of the library hdr_cells = table.rows[0].cells hdr_cells[0].text = 'Image' hdr_cells[1].text = 'Product' hdr_cells[2].text = 'Quantity' hdr_cells[3].text = 'Unit Price' records = [{'image':"1.jpeg", "product":"Product 1",'quantity':1, 'price':100}, {'image':"2.png", "product":"Product 2",'quantity':2, 'price':200}] for record in records: row_cells = table.add_row().cells image_cell = row_cells[0].add_paragraph('') image_cell.add_run().add_picture(record.get('image'), width=Inches(0.5)) row_cells[1].text = str(record.get('product')) row_cells[2].text = str(record.get('quantity')) row_cells[3].text = str(record.get('price')) section = document.sections[0] default_footer = section.footer # Add a footer footer_p = default_footer.add_paragraph() text = "Phone: 1256252352565 . Email:[email protected] . Website: http://www.example.com" footer_r = footer_p.add_run() footer_r.add_text(text) footer_r.font.size = Pt(8) document.add_page_break() document.save("Test_word.docx") # Save the file
This is the screenshot of the file that has been created after compilation.

You can customize your file according to your requirement using the style, fonts, width, alignment, etc. You can check the features from the GitHub.
https://github.com/python-openxml/python-docx
If you are using Odoo then you can also save this file in the attachment and then can download it from there whenever required.
Attachment = self.env['ir.attachment'].sudo().create({ 'datas': base64Data, 'type': 'binary', 'res_model': 'modal.modal', 'res_id': int(quote_id), 'db_datas': 'Test_Docx.docx', 'datas_fname':'Test_Docx.docx', 'name':'Test_Docx.docx', } )
That is it.!!!
If you liked this post, I would be very grateful if you write your opinions, comments and suggestions to keep the post updated and interesting.
Thank you!
Current Product Version - 1.0.0
For you….Is possible add a string for automatic import of all picture are in a specificy directory…resize…and insert they automatically in a table with two row and One colomn for any picture?