diff options
| author | Kenneth Reitz <me@kennethreitz.com> | 2010-10-04 11:40:45 -0400 |
|---|---|---|
| committer | Kenneth Reitz <me@kennethreitz.com> | 2010-10-04 11:40:45 -0400 |
| commit | c223dfbdf12bfa9ec6458184b83ac3e458efb185 (patch) | |
| tree | 3120cda066825ddf39ab2970bb636888edf8d3f9 /tablib | |
| parent | 6407afba3eedaf27c2614a362f0842470a8f4fae (diff) | |
| parent | 49bd48b0166c111a0c7619c5ce37be0628492239 (diff) | |
| download | tablib-c223dfbdf12bfa9ec6458184b83ac3e458efb185.tar.gz | |
Merge branch 'hotfix/0.8.2'v0.8.2
Diffstat (limited to 'tablib')
| -rw-r--r-- | tablib/core.py | 52 | ||||
| -rw-r--r-- | tablib/formats/_xls.py | 42 |
2 files changed, 82 insertions, 12 deletions
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 '<databook object>' + 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 |
