From 1f5223fe6245f4cb428c519d779e5d99010ab330 Mon Sep 17 00:00:00 2001 From: Valentin Dumitru Date: Thu, 13 Nov 2025 16:44:03 +0200 Subject: [PATCH] Change to xlsxwriter and basic adaptations --- be/ldapadmin/import_export.py | 34 ++++++++++++++++------------------ be/ldapadmin/roles_editor.py | 8 ++++---- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/be/ldapadmin/import_export.py b/be/ldapadmin/import_export.py index 7417ee3a..4c4549c7 100644 --- a/be/ldapadmin/import_export.py +++ b/be/ldapadmin/import_export.py @@ -1,7 +1,8 @@ -import xlwt +import xlsxwriter import logging import urllib from StringIO import StringIO +from io import BytesIO logger = logging.getLogger(__name__) @@ -52,29 +53,26 @@ def excel_headers_to_object(properties): def generate_excel(header, rows): - style = xlwt.XFStyle() - wrapstyle = xlwt.XFStyle() - wrapstyle.alignment.wrap = 1 - normalfont = xlwt.Font() - headerfont = xlwt.Font() - headerfont.bold = True - style.font = headerfont + output = BytesIO() + wb = xlsxwriter.Workbook(output, {'in_memory': True}) + ws = wb.add_worksheet('Sheet 1') + ws.set_column('A:G', 30) + ws.set_column(1, 1, 20) + ws.set_column(2, 2, 50) + ws.set_column(3, 4, 20) + style = wb.add_format() + bold = wb.add_format({'bold': True}) + wrapstyle = wb.add_format({'text_wrap': True}) - wb = xlwt.Workbook(encoding='utf-8') - ws = wb.add_sheet('Sheet 1') row = 0 for col in range(0, len(header)): - ws.col(col).width = 256 * 50 - for col in range(0, len(header)): - ws.row(row).set_cell_text(col, header[col], style) - style.font = normalfont + ws.write(row, col, header[col].decode('utf-8'), bold) for item in rows: row += 1 for col in range(0, len(item)): if '\n' in item[col]: - ws.row(row).set_cell_text(col, item[col], wrapstyle) + ws.write(row, col, item[col].decode('utf-8'), wrapstyle) else: - ws.row(row).set_cell_text(col, item[col], style) - output = StringIO() - wb.save(output) + ws.write(row, col, item[col].decode('utf-8'), style) + wb.close() return output.getvalue() diff --git a/be/ldapadmin/roles_editor.py b/be/ldapadmin/roles_editor.py index 99e7fba2..c30ed6e7 100644 --- a/be/ldapadmin/roles_editor.py +++ b/be/ldapadmin/roles_editor.py @@ -998,16 +998,16 @@ def search_users(self, REQUEST): security.declareProtected(view, 'export_members') def export_members(self, REQUEST): - """ Exports xls of members in role given by role_id in QUERY_STRING """ + """ Exports xlsx of members in role given by role_id in QUERY_STRING """ role_id = REQUEST.form.get('role_id', None) subroles = REQUEST.form.get('subroles', None) in [True, 'true', 'True'] if not REQUEST.AUTHENTICATED_USER: raise Unauthorized("You are not allowed to manage members in %s" % role_id) if subroles: - filename = "%s_all_members.xls" % str(role_id) + filename = "%s_all_members.xlsx" % str(role_id) else: - filename = "%s_members.xls" % str(role_id) + filename = "%s_members.xlsx" % str(role_id) REQUEST.RESPONSE.setHeader('Content-Type', 'application/vnd.ms-excel') REQUEST.RESPONSE.setHeader('Content-Disposition', "attachment;filename=%s" % filename) @@ -1803,7 +1803,7 @@ def __call__(self): RESPONSE.setHeader('Pragma', 'public') RESPONSE.setHeader('Cache-Control', 'max-age=0') RESPONSE.addHeader("content-disposition", - "attachment; filename=roles_export-%s.xls" % + "attachment; filename=roles_export-%s.xlsx" % this_role_id) return out