🐛 fix date offset problem, #54, #135

This commit is contained in:
chfw 2018-05-10 22:55:54 +01:00
parent 40462db489
commit 94aec7c9bb
3 changed files with 24 additions and 5 deletions

View File

@ -1,6 +1,15 @@
Change log
================================================================================
0.5.7 - 15.03.2018
--------------------------------------------------------------------------------
Added
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#. `pyexcel#54 <https://github.com/pyexcel/pyexcel/issues/54>`_, Book.datemode
attribute of that workbook should be passed always.
0.5.6 - 15.03.2018
--------------------------------------------------------------------------------

View File

@ -44,12 +44,13 @@ class XLSheet(SheetReader):
Currently only support first sheet in the file
"""
def __init__(self, sheet, auto_detect_int=True, **keywords):
def __init__(self, sheet, auto_detect_int=True, date_mode=0, **keywords):
SheetReader.__init__(self, sheet, **keywords)
self.__auto_detect_int = auto_detect_int
self.__hidden_cols = []
self.__hidden_rows = []
self.__merged_cells = {}
self._book_date_mode = date_mode
if keywords.get('detect_merged_cells') is True:
for merged_cell_ranges in sheet.merged_cells:
merged_cells = MergedCell(*merged_cell_ranges)
@ -88,7 +89,7 @@ class XLSheet(SheetReader):
value = self._native_sheet.cell_value(row, column)
if cell_type == xlrd.XL_CELL_DATE:
value = xldate_to_python_date(value)
value = xldate_to_python_date(value, self._book_date_mode)
elif cell_type == xlrd.XL_CELL_NUMBER and self.__auto_detect_int:
if has_no_digits_in_float(value):
value = int(value)
@ -176,7 +177,8 @@ class XLSBook(BookReader):
return result
def read_sheet(self, native_sheet):
sheet = XLSheet(native_sheet, **self._keywords)
sheet = XLSheet(native_sheet, date_mode=self._native_book.datemode,
**self._keywords)
return {sheet.name: sheet.to_array()}
def _get_book(self, on_demand=False):
@ -208,11 +210,12 @@ class XLSBook(BookReader):
return params
def xldate_to_python_date(value):
def xldate_to_python_date(value, date_mode):
"""
convert xl date to python date
"""
date_tuple = xlrd.xldate_as_tuple(value, 0)
date_tuple = xlrd.xldate_as_tuple(value, date_mode)
ret = None
if date_tuple == (0, 0, 0, 0, 0, 0):
ret = datetime.datetime(1900, 1, 1, 0, 0, 0)

View File

@ -7,6 +7,7 @@
import os
import pyexcel as pe
from pyexcel_xls import save_data
from pyexcel_xls.xlsr import xldate_to_python_date
from pyexcel_xls.xlsw import XLSWriter as Writer
from _compact import OrderedDict
from nose.tools import eq_, raises
@ -100,5 +101,11 @@ def test_empty_book_pyexcel_issue_120():
writer.write({})
def test_pyexcel_issue_54():
xlvalue = 41071.0
date = xldate_to_python_date(xlvalue, 1)
eq_(date, datetime.date(2016, 6, 12))
def get_fixture(file_name):
return os.path.join("tests", "fixtures", file_name)