summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2019-10-03 23:44:24 +0200
committerClaude Paroz <claude@2xlibre.net>2019-10-04 19:45:42 +0200
commit5fde5259d9adcfc47db93110d2dac6b08f31e24f (patch)
tree6bae1e205c966871e54586b22f19857b49064644
parent591e8f74489bcd2b60e1dd39154f3078adbec827 (diff)
downloadtablib-5fde5259d9adcfc47db93110d2dac6b08f31e24f.tar.gz
Fixes #314 - Delegate type coercion to openpyxl
Thanks Cristiano Lopes for the initial patch.
-rw-r--r--HISTORY.md2
-rw-r--r--tablib/formats/_xlsx.py18
-rwxr-xr-xtest_tablib.py19
3 files changed, 30 insertions, 9 deletions
diff --git a/HISTORY.md b/HISTORY.md
index 2a96b16..d5be2c4 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -4,6 +4,8 @@
- The project is now maintained by the Jazzband team, https://jazzband.co
- Fixed `DataBook().load` parameter ordering (first stream, then format).
+- Fixed a regression for xlsx exports where non-string values were forced to
+ strings (#314).
- Added search to all documentation pages
- Open xlsx workbooks in read-only mode (#316)
- Unpin requirements
diff --git a/tablib/formats/_xlsx.py b/tablib/formats/_xlsx.py
index a2d46ce..6662a2f 100644
--- a/tablib/formats/_xlsx.py
+++ b/tablib/formats/_xlsx.py
@@ -117,8 +117,6 @@ def dset_sheet(dataset, ws, freeze_panes=True):
# bold headers
if (row_number == 1) and dataset.headers:
- # cell.value = unicode('%s' % col, errors='ignore')
- cell.value = unicode(col)
cell.font = bold
if freeze_panes:
# Export Freeze only after first Line
@@ -126,16 +124,18 @@ def dset_sheet(dataset, ws, freeze_panes=True):
# bold separators
elif len(row) < dataset.width:
- cell.value = unicode('%s' % col, errors='ignore')
cell.font = bold
# wrap the rest
else:
try:
- if '\n' in col:
- cell.value = unicode('%s' % col, errors='ignore')
- cell.alignment = wrap_text
- else:
- cell.value = unicode('%s' % col, errors='ignore')
+ str_col_value = unicode(col)
except TypeError:
- cell.value = unicode(col)
+ str_col_value = ''
+ if '\n' in str_col_value:
+ cell.alignment = wrap_text
+
+ try:
+ cell.value = col
+ except (ValueError, TypeError):
+ cell.value = unicode(col)
diff --git a/test_tablib.py b/test_tablib.py
index 758ac91..bff3147 100755
--- a/test_tablib.py
+++ b/test_tablib.py
@@ -782,6 +782,25 @@ class TSVTests(BaseTestCase):
self.assertEqual(tsv, self.founders.tsv)
+class XLSXTests(BaseTestCase):
+ def test_xlsx_import_set(self):
+ data.append(('string', 42, 21.55))
+ data.headers = ('string', 'integer', 'float')
+ _xlsx = data.xlsx
+ data.xlsx = _xlsx
+ self.assertEqual(data.dict[0]['string'], 'string')
+ self.assertEqual(data.dict[0]['integer'], 42)
+ self.assertEqual(data.dict[0]['float'], 21.55)
+
+ def test_xlsx_wrong_char(self):
+ """Bad characters are not silently ignored. We let the exception bubble up."""
+ from openpyxl.utils.exceptions import IllegalCharacterError
+
+ with self.assertRaises(IllegalCharacterError):
+ data.append(('string', b'\x0cf'))
+ data.xlsx
+
+
class JSONTests(BaseTestCase):
def test_json_format_detect(self):
"""Test JSON format detection."""