From 2ffb9a5aa3f2dcebe1531d0104abe0b6d91dd56a Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 10 Mar 2023 18:51:30 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=20Import=20export?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/drf/renders/base.py | 4 ++++ apps/common/drf/renders/excel.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/apps/common/drf/renders/base.py b/apps/common/drf/renders/base.py index 8aa60350e..038bd8a81 100644 --- a/apps/common/drf/renders/base.py +++ b/apps/common/drf/renders/base.py @@ -148,6 +148,9 @@ class BaseFileRenderer(BaseRenderer): def get_rendered_value(self): raise NotImplementedError + def after_render(self): + pass + def render(self, data, accepted_media_type=None, renderer_context=None): if data is None: return bytes() @@ -176,6 +179,7 @@ class BaseFileRenderer(BaseRenderer): self.initial_writer() self.write_column_titles(column_titles) self.write_rows(rows) + self.after_render() value = self.get_rendered_value() except Exception as e: logger.debug(e, exc_info=True) diff --git a/apps/common/drf/renders/excel.py b/apps/common/drf/renders/excel.py index 0d43185aa..1b3f8dacf 100644 --- a/apps/common/drf/renders/excel.py +++ b/apps/common/drf/renders/excel.py @@ -19,6 +19,7 @@ class ExcelFileRenderer(BaseFileRenderer): def write_row(self, row): self.row_count += 1 + self.ws.row_dimensions[self.row_count].height = 20 column_count = 0 for cell_value in row: # 处理非法字符 @@ -26,6 +27,19 @@ class ExcelFileRenderer(BaseFileRenderer): cell_value = ILLEGAL_CHARACTERS_RE.sub(r'', str(cell_value)) self.ws.cell(row=self.row_count, column=column_count, value=str(cell_value)) + def after_render(self): + for col in self.ws.columns: + max_length = 0 + column = col[0].column_letter + for cell in col: + if len(str(cell.value)) > max_length: + max_length = len(cell.value) + adjusted_width = (max_length + 2) * 1.0 + adjusted_width = 300 if adjusted_width > 300 else adjusted_width + adjusted_width = 30 if adjusted_width < 30 else adjusted_width + self.ws.column_dimensions[column].width = adjusted_width + self.wb.save('/tmp/test.xlsx') + def get_rendered_value(self): value = save_virtual_workbook(self.wb) return value