Files
colibre/datasette/plugins/xlsx.py
T
2024-04-17 22:36:28 +02:00

75 lines
2.0 KiB
Python

from datasette import hookimpl
from datasette.utils.asgi import Response
from openpyxl import Workbook
from openpyxl.cell import WriteOnlyCell
from openpyxl.styles import Alignment, 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}