diff --git a/tablib/formats/_ods.py b/tablib/formats/_ods.py index f1b0dfa..7b576c1 100644 --- a/tablib/formats/_ods.py +++ b/tablib/formats/_ods.py @@ -47,7 +47,7 @@ def export_book(databook): stream = BytesIO() - wb.save(stream) + wb.save(unicode(stream)) return stream.getvalue() @@ -63,6 +63,11 @@ def dset_sheet(dataset, ws): row_number = i + 1 odf_row = table.TableRow(stylename=bold) for j, col in enumerate(row): + try: + col = unicode(col, errors='ignore') + except TypeError: + ## col is already unicode + pass ws.addElement(table.TableColumn()) # bold headers @@ -70,14 +75,14 @@ def dset_sheet(dataset, ws): odf_row.setAttribute('stylename', bold) ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(stylename="Bold", text=unicode(col, errors='ignore'))) + cell.addElement(text.P(stylename="Bold", text=col)) odf_row.addElement(cell) # bold separators elif len(row) < dataset.width: ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(text=unicode(col, errors='ignore'))) + cell.addElement(text.P(text=col)) odf_row.addElement(cell) # wrap the rest @@ -86,17 +91,15 @@ def dset_sheet(dataset, ws): if '\n' in col: ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(text=unicode(col, errors='ignore'))) + cell.addElement(text.P(text=col)) odf_row.addElement(cell) else: ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(text=unicode(col, errors='ignore'))) + cell.addElement(text.P(text=col)) odf_row.addElement(cell) except TypeError: ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(text=unicode(col, errors='ignore'))) - odf_row.addElement(cell) - - + cell.addElement(text.P(text=col)) + odf_row.addElement(cell) \ No newline at end of file diff --git a/tablib/packages/odf3/attrconverters.py b/tablib/packages/odf3/attrconverters.py index 6af6ec1..c6cb8bf 100644 --- a/tablib/packages/odf3/attrconverters.py +++ b/tablib/packages/odf3/attrconverters.py @@ -158,7 +158,7 @@ def cnv_NCName(attribute, arg, element): """ NCName is defined in http://www.w3.org/TR/REC-xml-names/#NT-NCName Essentially an XML name minus ':' """ - if type(arg) in str: + if isinstance(arg, str): return make_NCName(arg) else: return arg.getAttrNS(STYLENS, 'name') diff --git a/tablib/packages/odf3/element.py b/tablib/packages/odf3/element.py index 00ea088..bd4b5d1 100644 --- a/tablib/packages/odf3/element.py +++ b/tablib/packages/odf3/element.py @@ -38,6 +38,12 @@ def _escape(data, entities={}): the optional entities parameter. The keys and values must all be strings; each key will be replaced with its corresponding value. """ + try: + data = data.decode('utf-8') + except TypeError: + ## Make sure our stream is a string + ## If it comes through as bytes it fails + pass data = data.replace("&", "&") data = data.replace("<", "<") data = data.replace(">", ">") @@ -198,7 +204,7 @@ def _append_child(self, node): childNodes.append(node) node.__dict__["parentNode"] = self -class Childless: +class Childless(object): """ Mixin that makes childless-ness easy to implement and avoids the complexity of the Node methods that deal with children. """ @@ -255,7 +261,7 @@ class Text(Childless, Node): if self.data: f.write(_escape(str(self.data).encode('utf-8'))) -class CDATASection(Childless, Text): +class CDATASection(Text, Childless): nodeType = Node.CDATA_SECTION_NODE def toXml(self,level,f):