Display Excel As HTML Table In Python Flask (Simple Example)

Welcome to a tutorial on how to display an Excel file as an HTML table in Python Flask. So you want to read an Excel file and display it as an HTML table? Yes, it is actually not that difficult – Read on for the example!

ⓘ I have included a zip file with all the source code at the start of this tutorial, so you don’t have to copy-paste everything… Or if you just want to dive straight in.

 

 

TABLE OF CONTENTS

Download & Notes Excel Table Useful Bits & Links
The End

 

DOWNLOAD & NOTES

Firstly, here is the download link to the example code as promised.

 

QUICK NOTES

  • Create your own project folder, e.g. D:\xlstable, unzip the code inside this folder.
  • Open the terminal (or command line), navigate to your project folder cd D:\xlstable.
  • As usual, create a virtual environment if you don’t want to mess up your other projects.
    • virtualenv venv
    • Windows – venv\scripts\activate
    • Mac/Linux – venv/bin/activate
  • Get all the required packages – pip install openpyxl Flask
  • Launch python s2_server.py and access http://localhost.
If you spot a bug, feel free to comment below. I try to answer short questions too, but it is one person versus the entire world… If you need answers urgently, please check out my list of websites to get help with programming.

 

EXAMPLE CODE DOWNLOAD

Click here to download all the example source code, I have released it under the MIT license, so feel free to build on top of it or use it in your own project.

 

 

EXCEL TO HTML TABLE

All right, let us now get into the example of reading an Excel file in Python and displaying it in an HTML table with Flask.

 

PART 1) DUMMY EXCEL

s1_dummy.xlsx
Jo Doe jo@doe.com 465785
Joa Doe joa@doe.com 123456
Job Doe job@doe.com 234567
Joe Doe joe@doe.com 345678
Jog Doe jog@doe.com 578456
Joh Doe joh@doe.com 378945
Joi Doe joi@doe.com 456789
Jon Doe jon@doe.com 987654
Jor Doe jor@doe.com 754642
Joy Doe joy@doe.com 124578

For a start, here is the Excel file that we will be working with. Nothing special here… Just a list of dummy users.

 

PART 2) FLASK SERVER

s2_server.py
# (A) INIT
# (A1) LOAD MODULES
from flask import Flask, render_template, request, make_response
from openpyxl import load_workbook
 
# (A2) FLASK SETTINGS + INIT
HOST_NAME = "localhost"
HOST_PORT = 80
app = Flask(__name__)
# app.debug = True
 
# (B) DEMO - READ EXCEL & GENERATE HTML TABLE
@app.route("/")
def index():
  # (B1) OPEN EXCEL FILE + WORKSHEET
  book = load_workbook("s1_dummy.xlsx")
  sheet = book.active
 
  # (B2) PASS INTO HTML TEMPLATE
  return render_template("s3_excel_table.html", sheet=sheet)
 
# (C) START
if __name__ == "__main__":
  app.run(HOST_NAME, HOST_PORT)

The Flask server script is super straightforward once you trace through it.

  1. Load the required modules, and define the Flask settings; Python cannot read Excel files natively, and we will be using openpyxl. Link to the full documentation is in the extras section below if you want to follow up.
  2. Serve the “Excel to HTML” demo page – Open s1_dummy.xlsx, select the required workbook and pass it into the HTML template.
  3. Captain Obvious at your service. Start running the Flask server.

 

 

PART 3) HTML TEMPLATE

templates/s3_csv_table.html
<table id="demo">
  {% for row in range(1, sheet.max_row + 1) %}
  <tr>
    {% for col in range(1, sheet.max_column + 1): %}
    <td>{{ sheet.cell(row, col).value }}</td>
    {% endfor %}
  </tr>
  {% endfor %}
</table>

Don’t think this needs much explanation. We are just looping through the rows and columns of the Excel file to generate the HTML table.

 

 

USEFUL BITS & LINKS

That’s all for the tutorial, and here is a small section on some extras and links that may be useful to you.

 

LINKS & REFERENCES

 

THE END

Thank you for reading, and we have come to the end. I hope that it has helped you to better understand, and if you want to share anything with this guide, please feel free to comment below. Good luck and happy coding!

Leave a Comment

Your email address will not be published.