75 lines
2.0 KiB
Python
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}
|