Files
colibre/datasette/plugins/xlsx.py
T
2021-05-28 12:24:15 +02:00

76 lines
2.0 KiB
Python

from datasette import hookimpl
from datasette.utils.asgi import Response
from openpyxl import Workbook
from openpyxl.writer.excel import save_virtual_workbook
from openpyxl.cell import WriteOnlyCell
from openpyxl.styles import Alignment, Font, PatternFill
from tempfile import NamedTemporaryFile
def render_spreadsheet(rows):
wb = Workbook(write_only=True)
ws = wb.create_sheet()
ws = wb.active
ws.title = "decp"
columnSpecs = {
'acheteur.nom': {
'width': 7,
'wrapText': True
},
'objet': {
'width': 7,
'wrapText': True
},
'titulaire.denominationSociale': {
'width': 7,
'wrapText': True
},
}
columns = rows[0].keys()
if columns[0] == "rowid":
columns = columns[1:]
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
headers = []
index = 0
for col in columns :
c = WriteOnlyCell(ws, col)
c.fill = PatternFill("solid", fgColor="DDEFFF")
headers.append(c)
if col in columnSpecs:
ws.column_dimensions[letters[index]].width = columnSpecs[col]['width'] * 5
else:
ws.column_dimensions[letters[index]].bestFit = True
index = index + 1
ws.append(headers)
for row in rows:
wsRow = []
for col in columns:
c = WriteOnlyCell(ws, row[col])
if col in columnSpecs :
c.alignment = Alignment(wrapText = columnSpecs[col]['wrapText'])
wsRow.append(c)
ws.append(wsRow)
with NamedTemporaryFile() as tmp:
wb.save(tmp.name)
tmp.seek(0)
return Response(
tmp.read(),
headers={
'Content-Disposition': 'attachment; filename=decp.xlsx',
'Content-type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}
)
@hookimpl
def register_output_renderer():
return {"extension": "xlsx",
"render": render_spreadsheet,
"can_render": lambda: False}