From 333e73f892d7a61e0c4dea4bbf4d5cfd4aa9c58a Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 10:19:31 -0400 Subject: [PATCH 1/9] Added wrapping support. --- tablib/formats/_xls.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index 1a739af..3698726 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -9,7 +9,7 @@ import cStringIO title = 'xls' extentions = ('xls',) - +wrap = xlwt.easyxf("alignment: wrap on") def export_set(dataset): """Returns XLS representation of Dataset.""" @@ -19,7 +19,7 @@ def export_set(dataset): for i, row in enumerate(dataset._package(dicts=False)): for j, col in enumerate(row): - ws.write(i, j, col) + ws.write(i, j, col, wrap) stream = cStringIO.StringIO() wb.save(stream) @@ -37,7 +37,7 @@ def export_book(databook): #for row in self._package(dicts=False): for i, row in enumerate(dset._package(dicts=False)): for j, col in enumerate(row): - ws.write(i, j, col) + ws.write(i, j, col, wrap) stream = cStringIO.StringIO() From 10207998284bc4dc97346ce3b9dc13efc7e883ec Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 10:53:48 -0400 Subject: [PATCH 2/9] Separator append and insert support. --- tablib/core.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/tablib/core.py b/tablib/core.py index ddb9769..1214f99 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -20,6 +20,9 @@ class Dataset(object): def __init__(self, *args, **kwargs): self._data = list(args) self.__headers = None + + # ('title', index) tuples + self._seperators = [] try: self.headers = kwargs['headers'] @@ -194,6 +197,23 @@ class Dataset(object): self._data = [tuple([row]) for row in col] + def insert_seperator(self, index, text='-'): + """Adds a seperator to Dataset at given index.""" + + if self.height >= index: + sep = (index, text) + self._seperators.append(sep) + else: + raise InvalidDimensions + + + def append_seperator(self, text='-'): + """Adds a seperator to Dataset.""" + + index = self.height if self.headers else (self.height - 1) + self.insert_seperator(index, text) + + def insert(self, i, row=None, col=None): """Inserts a row at given position in Dataset""" if row: @@ -225,9 +245,11 @@ class Databook(object): except AttributeError: return '' + def wipe(self): """Wipe book clean.""" self._datasets = [] + @classmethod def _register_formats(cls): @@ -249,7 +271,7 @@ class Databook(object): self._datasets.append(dataset) else: raise InvalidDatasetType - + def _package(self): """Packages Databook for delivery.""" @@ -268,6 +290,29 @@ class Databook(object): return len(self._datasets) +def detect(stream): + """Return (format, stream) of given stream.""" + for fmt in formats: + try: + if fmt.detect(stream): + return (fmt, stream) + except AttributeError: + pass + return (None, stream) + + +def import_set(stream): + """Return dataset of given stream.""" + (format, stream) = detect(stream) + + try: + data = Dataset() + format.import_set(data, stream) + return data + + except AttributeError, e: + return None + class InvalidDatasetType(Exception): "Only Datasets can be added to a DataBook" From 6574d3e58bfcf55305420346a7d7028614b55839 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 10:54:14 -0400 Subject: [PATCH 3/9] XLS support for Separators. Bolden headers and Separators. --- tablib/formats/_xls.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index 3698726..ccb236a 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -10,6 +10,7 @@ import cStringIO title = 'xls' extentions = ('xls',) wrap = xlwt.easyxf("alignment: wrap on") +bold = xlwt.easyxf("font: bold on") def export_set(dataset): """Returns XLS representation of Dataset.""" @@ -17,9 +18,27 @@ def export_set(dataset): wb = xlwt.Workbook(encoding='utf8') ws = wb.add_sheet(dataset.title if dataset.title else 'Tabbed Dataset') - for i, row in enumerate(dataset._package(dicts=False)): + _package = dataset._package(dicts=False) + print dataset._seperators + + for sep in dataset._seperators: + _package.insert(sep[0], (sep[1],)) + + + for i, row in enumerate(_package): for j, col in enumerate(row): - ws.write(i, j, col, wrap) + + # bold headers + if (i == 0) and dataset.headers: + ws.write(i, j, col, bold) + + # bold seperators + elif i in [sep[0] for sep in dataset._seperators]: + ws.write(i, j, col, bold) + + # write the rest + else: + ws.write(i, j, col, wrap) stream = cStringIO.StringIO() wb.save(stream) From a8b0bf4b5fc680ab7165d77d69eb976bcd339d09 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 11:33:16 -0400 Subject: [PATCH 4/9] Typo. --- tablib/core.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/tablib/core.py b/tablib/core.py index 1214f99..e7b622c 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -22,7 +22,7 @@ class Dataset(object): self.__headers = None # ('title', index) tuples - self._seperators = [] + self._separators = [] try: self.headers = kwargs['headers'] @@ -36,6 +36,7 @@ class Dataset(object): self._register_formats() + def __len__(self): return self.height @@ -197,24 +198,26 @@ class Dataset(object): self._data = [tuple([row]) for row in col] - def insert_seperator(self, index, text='-'): - """Adds a seperator to Dataset at given index.""" + def insert_separator(self, index, text='-'): + """Adds a separator to Dataset at given index.""" - if self.height >= index: - sep = (index, text) - self._seperators.append(sep) + sep = (index, text) + self._separators.append(sep) + + + def append_separator(self, text='-'): + """Adds a separator to Dataset.""" + + # change offsets if headers are or aren't defined + if not self.headers: + index = self.height if self.height else 0 else: - raise InvalidDimensions + index = (self.height + 1) if self.height else 1 + + self.insert_separator(index, text) - def append_seperator(self, text='-'): - """Adds a seperator to Dataset.""" - - index = self.height if self.headers else (self.height - 1) - self.insert_seperator(index, text) - - - def insert(self, i, row=None, col=None): + def insert(self, i, row=None): """Inserts a row at given position in Dataset""" if row: self._validate(row) From da2b011358e49654eb911cb0c0a76b460ea9afa2 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 11:33:34 -0400 Subject: [PATCH 5/9] Added separator support for XLS output. --- tablib/formats/_xls.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index ccb236a..04cd9a2 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -19,12 +19,11 @@ def export_set(dataset): ws = wb.add_sheet(dataset.title if dataset.title else 'Tabbed Dataset') _package = dataset._package(dicts=False) - print dataset._seperators - - for sep in dataset._seperators: - _package.insert(sep[0], (sep[1],)) - + for i, sep in enumerate(dataset._separators): + _offset = i + _package.insert((sep[0] + _offset), (sep[1],)) + for i, row in enumerate(_package): for j, col in enumerate(row): @@ -32,11 +31,11 @@ def export_set(dataset): if (i == 0) and dataset.headers: ws.write(i, j, col, bold) - # bold seperators - elif i in [sep[0] for sep in dataset._seperators]: + # bold separators + elif len(row) < dataset.width: ws.write(i, j, col, bold) - # write the rest + # wrap the rest else: ws.write(i, j, col, wrap) From 8c92e878a3a83f2e7d0c6cf3a1fe4a2f1ef59dba Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 11:38:17 -0400 Subject: [PATCH 6/9] Upgraded XLS abstraction layer. --- tablib/formats/_xls.py | 52 +++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index 04cd9a2..0946af4 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -18,12 +18,37 @@ def export_set(dataset): wb = xlwt.Workbook(encoding='utf8') ws = wb.add_sheet(dataset.title if dataset.title else 'Tabbed Dataset') - _package = dataset._package(dicts=False) + dset_sheet(dataset, ws) + stream = cStringIO.StringIO() + wb.save(stream) + return stream.getvalue() + + +def export_book(databook): + """Returns XLS representation of DataBook.""" + + wb = xlwt.Workbook(encoding='utf8') + + for i, dset in enumerate(databook._datasets): + ws = wb.add_sheet(dset.title if dset.title else 'Sheet%s' % (i)) + + dset_sheet(dataset, ws) + + + stream = cStringIO.StringIO() + wb.save(stream) + return stream.getvalue() + + +def dset_sheet(dataset, ws): + """Completes given worksheet from given Dataset.""" + _package = dataset._package(dicts=False) + for i, sep in enumerate(dataset._separators): _offset = i _package.insert((sep[0] + _offset), (sep[1],)) - + for i, row in enumerate(_package): for j, col in enumerate(row): @@ -39,25 +64,4 @@ def export_set(dataset): else: ws.write(i, j, col, wrap) - stream = cStringIO.StringIO() - wb.save(stream) - return stream.getvalue() - - -def export_book(databook): - """Returns XLS representation of DataBook.""" - - wb = xlwt.Workbook(encoding='utf8') - - for i, dset in enumerate(databook._datasets): - ws = wb.add_sheet(dset.title if dset.title else 'Sheet%s' % (i)) - - #for row in self._package(dicts=False): - for i, row in enumerate(dset._package(dicts=False)): - for j, col in enumerate(row): - ws.write(i, j, col, wrap) - - - stream = cStringIO.StringIO() - wb.save(stream) - return stream.getvalue() \ No newline at end of file + \ No newline at end of file From bcd0e37a655b9bddbf33e1c7882c03e70e943abe Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 11:38:28 -0400 Subject: [PATCH 7/9] Version bump. --- HISTORY.rst | 5 +++++ setup.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 9f86fe2..9aabdb9 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,11 @@ History ======= +0.8.2 (2010-09-28) +------------------ +* Added alignment wrapping to written cells. + + 0.8.1 (2010-09-28) ------------------ * Packaging Fix diff --git a/setup.py b/setup.py index 920c148..bea4609 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ if sys.argv[-1] == "publish": setup( name='tablib', - version='0.8.1', + version='0.8.2', description='Format agnostic tabular data library (XLS, JSON, YAML, CSV)', long_description=open('README.rst').read() + '\n\n' + open('HISTORY.rst').read(), From c6d90bc825ad07e54e71de4374b72620e149420a Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 11:39:05 -0400 Subject: [PATCH 8/9] Updated history. --- HISTORY.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 9aabdb9..d380034 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,7 +4,7 @@ History 0.8.2 (2010-09-28) ------------------ * Added alignment wrapping to written cells. - +* Added separator support to XLS. 0.8.1 (2010-09-28) ------------------ From 49bd48b0166c111a0c7619c5ce37be0628492239 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 4 Oct 2010 11:39:59 -0400 Subject: [PATCH 9/9] namspace fix. --- tablib/formats/_xls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index 0946af4..76e9318 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -33,7 +33,7 @@ def export_book(databook): for i, dset in enumerate(databook._datasets): ws = wb.add_sheet(dset.title if dset.title else 'Sheet%s' % (i)) - dset_sheet(dataset, ws) + dset_sheet(dset, ws) stream = cStringIO.StringIO()