Via a simple Python 3 CGI App, I'm wanting to generate an XLSX file (using OpenPYXL), save it in memory, and force a download of the file to a browser. The test code that I'm using is as follows: #!/usr/bin/env python import os,sys import io import openpyxl print("Content-Type: application/octet-stream; name = test.xlsx") print("Content-Disposition: attachment; filename = test.xlsx\n") wb = openpyxl.Workbook() ws = wb.active ws['A1'] = "hello" ws['A2'] = "there!" output = io.BytesIO() wb.save(output) print(output.getvalue()) The resulting file on disk starts as follows: b'PK\x03\x04\x14\x00\x00\x00\x08\x00Tu\xd0T\x07AMb.... XLS files are ZIP compressed - and this looks like a segment of a compressed file. The problem is that I'm not sure how to write it out as a binary file that Excel will be able to open. I have tried: print(output.getvalue().decode('utf-8')) The problem is that I end up with: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 10: invalid continuation byte because this isn't a UTF-8 file - XLSX documents are compressed files. Using other codecs like raw_unicode_escape and unicode_escape look closer to the expected format - but they are still corrupt when trying to open it in Excel (or extract via unzip). Can anyone point me in the right direction, as to how to create a file that can be correctly downloaded and opened via Excel. Continue reading...