From 1975024f95ad962cd7b3e0a5626b37b16effc9db Mon Sep 17 00:00:00 2001 From: pascalfree Date: Wed, 10 Jul 2024 18:42:13 +0200 Subject: [PATCH] feat: xls: add styling for date/time types --- src/tablib/formats/_xls.py | 12 +++++++++++- tests/test_tablib.py | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/tablib/formats/_xls.py b/src/tablib/formats/_xls.py index 2c6c5272..947625dc 100644 --- a/src/tablib/formats/_xls.py +++ b/src/tablib/formats/_xls.py @@ -1,6 +1,6 @@ """ Tablib - XLS Support. """ - +import datetime from io import BytesIO import xlrd @@ -12,6 +12,9 @@ # special styles wrap = xlwt.easyxf("alignment: wrap on") bold = xlwt.easyxf("font: bold on") +datetime_style = xlwt.easyxf(num_format_str='M/D/YY h:mm') +date_style = xlwt.easyxf(num_format_str='M/D/YY') +time_style = xlwt.easyxf(num_format_str='h:mm:ss') class XLSFormat: @@ -138,6 +141,13 @@ def dset_sheet(cls, dataset, ws): elif len(row) < dataset.width: ws.write(i, j, col, bold) + # format date types + elif isinstance(col, datetime.datetime): + ws.write(i, j, col, datetime_style) + elif isinstance(col, datetime.date): + ws.write(i, j, col, date_style) + elif isinstance(col, datetime.time): + ws.write(i, j, col, time_style) # wrap the rest else: try: diff --git a/tests/test_tablib.py b/tests/test_tablib.py index fbb26f96..d557d25e 100755 --- a/tests/test_tablib.py +++ b/tests/test_tablib.py @@ -12,6 +12,7 @@ from pathlib import Path from uuid import uuid4 +import xlrd from openpyxl.reader.excel import load_workbook import tablib @@ -1254,6 +1255,23 @@ def test_book_import_from_stream(self): book = tablib.Databook().load(in_stream, 'xls') self.assertEqual(book.sheets()[0].title, 'Founders') + def test_xls_export_with_dates(self): + date = dt.date(2019, 10, 4) + time = dt.time(14, 30) + date_time = dt.datetime(2019, 10, 4, 12, 30, 8) + data.append((date, time, date_time)) + data.headers = ('date', 'time', 'date/time') + _xls = data.xls + xls_book = xlrd.open_workbook(file_contents=_xls, formatting_info=True) + row = xls_book.sheet_by_index(0).row(1) + + def get_format_str(cell): + return xls_book.format_map[xls_book.xf_list[cell.xf_index].format_key].format_str + + self.assertEqual('m/d/yy', get_format_str(row[0])) + self.assertEqual('h:mm:ss', get_format_str(row[1])) + self.assertEqual('m/d/yy h:mm', get_format_str(row[2])) + class XLSXTests(BaseTestCase): def test_xlsx_format_detect(self):