Fixes #202 - Keep error content when importing xls files

This commit is contained in:
Claude Paroz
2019-10-22 20:45:21 +02:00
parent 9858539c87
commit 205403d377
4 changed files with 29 additions and 6 deletions
+1
View File
@@ -9,6 +9,7 @@
### Bugfixes
- Fixed a crash when exporting an empty string with the ReST format (#368)
- Error cells from imported .xls files contain now the error string (#202)
## 0.14.0 (2019-10-19)
+4 -1
View File
@@ -76,7 +76,10 @@ def import_set(dset, in_stream, headers=True):
if (i == 0) and (headers):
dset.headers = sheet.row_values(0)
else:
dset.append(sheet.row_values(i))
dset.append([
val if typ != xlrd.XL_CELL_ERROR else xlrd.error_text_from_code[val]
for val, typ in zip(sheet.row_values(i), sheet.row_types(i))
])
def import_book(dbook, in_stream, headers=True):
Binary file not shown.
+24 -5
View File
@@ -6,6 +6,8 @@ import doctest
import json
import pickle
import unittest
from collections import OrderedDict
from pathlib import Path
from uuid import uuid4
import tablib
@@ -887,17 +889,34 @@ class TSVTests(BaseTestCase):
self.assertEqual(tsv, self.founders.tsv)
class XLSTests(BaseTestCase):
def test_xls_format_detect(self):
"""Test the XLS format detection."""
in_stream = self.founders.xls
self.assertEqual(detect_format(in_stream), 'xls')
def test_xls_import_with_errors(self):
"""Errors from imported files are kept as errors."""
xls_source = Path(__file__).parent / 'files' / 'errors.xls'
with xls_source.open('rb') as fh:
data = tablib.Dataset().load(fh.read())
self.assertEqual(
data.dict[0],
OrderedDict([
('div by 0', '#DIV/0!'),
('name unknown', '#NAME?'),
('not available (formula)', '#N/A'),
('not available (static)', '#N/A')
])
)
class XLSXTests(BaseTestCase):
def test_xlsx_format_detect(self):
"""Test the XLSX format detection."""
in_stream = self.founders.xlsx
self.assertEqual(detect_format(in_stream), 'xlsx')
def test_xls_format_detect(self):
"""Test the XLS format detection."""
in_stream = self.founders.xls
self.assertEqual(detect_format(in_stream), 'xls')
def test_xlsx_import_set(self):
date_time = datetime.datetime(2019, 10, 4, 12, 30, 8)
data.append(('string', '004', 42, 21.55, date_time))