diff --git a/HISTORY.rst b/HISTORY.rst index 9f86fe2..d380034 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,11 @@ History ======= +0.8.2 (2010-09-28) +------------------ +* Added alignment wrapping to written cells. +* Added separator support to XLS. + 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(), diff --git a/tablib/core.py b/tablib/core.py index ddb9769..e7b622c 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._separators = [] try: self.headers = kwargs['headers'] @@ -33,6 +36,7 @@ class Dataset(object): self._register_formats() + def __len__(self): return self.height @@ -194,7 +198,26 @@ class Dataset(object): self._data = [tuple([row]) for row in col] - def insert(self, i, row=None, col=None): + def insert_separator(self, index, text='-'): + """Adds a separator to Dataset at given index.""" + + 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: + index = (self.height + 1) if self.height else 1 + + self.insert_separator(index, text) + + + def insert(self, i, row=None): """Inserts a row at given position in Dataset""" if row: self._validate(row) @@ -225,9 +248,11 @@ class Databook(object): except AttributeError: return '' + def wipe(self): """Wipe book clean.""" self._datasets = [] + @classmethod def _register_formats(cls): @@ -249,7 +274,7 @@ class Databook(object): self._datasets.append(dataset) else: raise InvalidDatasetType - + def _package(self): """Packages Databook for delivery.""" @@ -268,6 +293,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" diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index 1a739af..76e9318 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -9,7 +9,8 @@ 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,10 +18,8 @@ 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)): - for j, col in enumerate(row): - ws.write(i, j, col) - + dset_sheet(dataset, ws) + stream = cStringIO.StringIO() wb.save(stream) return stream.getvalue() @@ -34,12 +33,35 @@ def export_book(databook): 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) + dset_sheet(dset, ws) stream = cStringIO.StringIO() wb.save(stream) - return stream.getvalue() \ No newline at end of file + 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): + + # bold headers + if (i == 0) and dataset.headers: + ws.write(i, j, col, bold) + + # bold separators + elif len(row) < dataset.width: + ws.write(i, j, col, bold) + + # wrap the rest + else: + ws.write(i, j, col, wrap) + + \ No newline at end of file