From 0e880ac3186e74ea22dced51d337d915342acece Mon Sep 17 00:00:00 2001 From: Ejaaz Khan Date: Tue, 5 Aug 2025 17:07:47 +0530 Subject: [PATCH 1/3] feat: format date and datetime fields on export --- frappe/utils/xlsxutils.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/frappe/utils/xlsxutils.py b/frappe/utils/xlsxutils.py index 3104734343..e28002376b 100644 --- a/frappe/utils/xlsxutils.py +++ b/frappe/utils/xlsxutils.py @@ -1,11 +1,13 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE +import datetime import re from io import BytesIO import openpyxl import xlrd from openpyxl import load_workbook +from openpyxl.cell import WriteOnlyCell from openpyxl.styles import Font from openpyxl.utils import get_column_letter from openpyxl.workbook.child import INVALID_TITLE_REGEX @@ -18,6 +20,11 @@ ILLEGAL_CHARACTERS_RE = re.compile( ) +def get_excel_date_format(): + frappe_format = frappe.get_system_settings("date_format") or "yyyy-mm-dd" + return frappe_format.upper().replace("YYYY", "yyyy").replace("DD", "dd").replace("MM", "mm") + + # return xlsx file object def make_xlsx(data, sheet_name, wb=None, column_widths=None): column_widths = column_widths or [] @@ -34,6 +41,8 @@ def make_xlsx(data, sheet_name, wb=None, column_widths=None): row1 = ws.row_dimensions[1] row1.font = Font(name="Calibri", bold=True) + date_format = get_excel_date_format() + for row in data: clean_row = [] for item in row: @@ -46,7 +55,15 @@ def make_xlsx(data, sheet_name, wb=None, column_widths=None): # Remove illegal characters from the string value = ILLEGAL_CHARACTERS_RE.sub("", value) - clean_row.append(value) + if isinstance(value, datetime.date | datetime.datetime): + if isinstance(value, datetime.datetime): + date_format += " HH:MM:SS" + + cell = WriteOnlyCell(ws, value=value) + cell.number_format = date_format + clean_row.append(cell) + else: + clean_row.append(value) ws.append(clean_row) From 6cde9a4bcc59548f5937d082d75f4934f0d5e8d3 Mon Sep 17 00:00:00 2001 From: Ejaaz Khan Date: Tue, 5 Aug 2025 17:30:14 +0530 Subject: [PATCH 2/3] refactor: fetch time format dynamic --- frappe/utils/xlsxutils.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/frappe/utils/xlsxutils.py b/frappe/utils/xlsxutils.py index e28002376b..02950b2713 100644 --- a/frappe/utils/xlsxutils.py +++ b/frappe/utils/xlsxutils.py @@ -21,8 +21,14 @@ ILLEGAL_CHARACTERS_RE = re.compile( def get_excel_date_format(): - frappe_format = frappe.get_system_settings("date_format") or "yyyy-mm-dd" - return frappe_format.upper().replace("YYYY", "yyyy").replace("DD", "dd").replace("MM", "mm") + date_format = frappe.get_system_settings("date_format") + time_format = frappe.get_system_settings("time_format") + + # Excel-compatible format + date_format = date_format.upper().replace("YYYY", "yyyy").replace("DD", "dd").replace("MM", "mm") + time_format = time_format.upper().replace("HH", "hh").replace("MM", "mm").replace("SS", "ss") + + return date_format, time_format # return xlsx file object @@ -41,7 +47,7 @@ def make_xlsx(data, sheet_name, wb=None, column_widths=None): row1 = ws.row_dimensions[1] row1.font = Font(name="Calibri", bold=True) - date_format = get_excel_date_format() + date_format, time_format = get_excel_date_format() for row in data: clean_row = [] @@ -56,11 +62,12 @@ def make_xlsx(data, sheet_name, wb=None, column_widths=None): value = ILLEGAL_CHARACTERS_RE.sub("", value) if isinstance(value, datetime.date | datetime.datetime): + number_format = date_format if isinstance(value, datetime.datetime): - date_format += " HH:MM:SS" + number_format = f"{date_format} {time_format}" cell = WriteOnlyCell(ws, value=value) - cell.number_format = date_format + cell.number_format = number_format clean_row.append(cell) else: clean_row.append(value) From 50ff20a12a1d314cace6c8c14a4667b357503146 Mon Sep 17 00:00:00 2001 From: Ejaaz Khan Date: Wed, 6 Aug 2025 11:11:24 +0530 Subject: [PATCH 3/3] refactor: only replace month for compatibility --- frappe/utils/xlsxutils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/utils/xlsxutils.py b/frappe/utils/xlsxutils.py index 02950b2713..0dc01f09ab 100644 --- a/frappe/utils/xlsxutils.py +++ b/frappe/utils/xlsxutils.py @@ -25,8 +25,7 @@ def get_excel_date_format(): time_format = frappe.get_system_settings("time_format") # Excel-compatible format - date_format = date_format.upper().replace("YYYY", "yyyy").replace("DD", "dd").replace("MM", "mm") - time_format = time_format.upper().replace("HH", "hh").replace("MM", "mm").replace("SS", "ss") + date_format = date_format.replace("mm", "MM") return date_format, time_format