From 40490d1ba5a55dd39e77569eb6f150241fcdb946 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Wed, 8 Sep 2010 17:35:13 -0400 Subject: [PATCH 1/9] Added base DataBook object. --- tablib/core.py | 69 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/tablib/core.py b/tablib/core.py index 5427221..9dc0400 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -20,9 +20,9 @@ try: except ImportError, why: from packages import yaml - -__all__ = ['Dataset', 'source'] + +__all__ = ['Dataset', 'DataBook', 'source'] __version__ = '0.0.4' __build__ = '0x000004' @@ -42,8 +42,6 @@ class Dataset(object): self._data = None self._saved_file = None self._saved_format = None - - self._data = list(args) try: @@ -56,11 +54,11 @@ class Dataset(object): except KeyError, why: self.title = None - + def __len__(self): return self.height - + def __getitem__(self, key): if is_string(key): if key in self.headers: @@ -80,7 +78,7 @@ class Dataset(object): def __delitem__(self, key): del self._data[key] - + def __repr__(self): if self.title: return '<%s dataset>' % (self.title.lower()) @@ -130,13 +128,13 @@ class Dataset(object): except KeyError, why: return 0 - + @property def json(self): """Returns JSON representation of Dataset.""" return json.dumps(self._package()) - + @property def yaml(self): """Returns YAML representation of Dataset.""" @@ -151,7 +149,7 @@ class Dataset(object): for row in self._package(dicts=False): _csv.writerow(row) - + return stream.getvalue() @@ -159,7 +157,7 @@ class Dataset(object): def xls(self): """Returns XLS representation of Dataset.""" stream = cStringIO.StringIO() - + wb = xlwt.Workbook() ws = wb.add_sheet(self.title if self.title else 'Tabbed Dataset') # for row in self._package(dicts=False): @@ -170,12 +168,13 @@ class Dataset(object): wb.save(stream) return stream.getvalue() - + def append(self, row): """Adds a row to the end of Dataset""" self._validate(row) self._data.append(tuple(row)) + def index(self, i, row): """Inserts a row at given position in Dataset""" self._validate(row) @@ -186,32 +185,66 @@ class Dataset(object): # todo: accpept string if headers, or index nubmer pass - def save(self, filename=None, format=None): """Saves dataset""" if not format: format = filename.split('.')[-1].lower() # set format from filename - + if format not in FILE_EXTENSIONS: raise UnsupportedFormat - + # note export format # open file, save the bitch - + def export(self): """Exports Dataset to given filename or file-object.""" + pass +class DataBook(object): + """A book of Dataset objects. + Currently, this exists only for excel workbook support. + """ + + def __init__(self): + self._datasets = [] + + + def add_book(self, dataset): + """Add given .""" + if type(dataset) is Dataset: + self._datasets.append(dataset) + else: + raise InvalidDatasetType + + + def export(self): + pass + + + @property + def size(self): + """The number of the Datasets within DataBook.""" + return len(self._datasets) + + + @property + def xls(self): + pass + + + +class InvalidDatasetType(Exception): + "Only Datasets can be added to a DataBook" + class InvalidDimensions(Exception): "Invalid size" - class UnsupportedFormat(NotImplementedError): "Format is not supported" - def source(src=None, file=None, filename=None): """docstring for import""" From d52537b75b016a9d8128998236badd980848394f Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Wed, 8 Sep 2010 18:05:32 -0400 Subject: [PATCH 2/9] Added workbook feature for xls support. Other formats expected. --- tablib/core.py | 25 ++++++++++++++++++------- tablib/tests/tests.py | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/tablib/core.py b/tablib/core.py index 9dc0400..8a9e1c2 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -14,6 +14,8 @@ import os from helpers import * from packages import simplejson as json from packages import xlwt +import random + try: import yaml @@ -205,7 +207,7 @@ class Dataset(object): class DataBook(object): """A book of Dataset objects. - Currently, this exists only for excel workbook support. + Currently, this exists only for XLS workbook support. """ def __init__(self): @@ -219,11 +221,6 @@ class DataBook(object): else: raise InvalidDatasetType - - def export(self): - pass - - @property def size(self): """The number of the Datasets within DataBook.""" @@ -232,7 +229,21 @@ class DataBook(object): @property def xls(self): - pass + """Returns XLS representation of DataBook.""" + + stream = cStringIO.StringIO() + wb = xlwt.Workbook() + + for dset in self._datasets: + ws = wb.add_sheet(dset.title if dset.title else 'Tabbed Dataset %s' % (int(random.random() * 100000000))) + + #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) + + wb.save(stream) + return stream.getvalue() diff --git a/tablib/tests/tests.py b/tablib/tests/tests.py index 55fa083..42b6110 100644 --- a/tablib/tests/tests.py +++ b/tablib/tests/tests.py @@ -10,17 +10,40 @@ data = [ data = tablib.Dataset(*data, headers=headers) -#print data[1] -data.append(['kenneth' ,'reitz', 4.3]) +data.append(['Kenneth' ,'Reitz', 4.3]) +#print '***WITH HEADERS***' -#print data.digest() +#print 'First Names:\n', +#print data['first_name'] +#print '\nYAML:' #print data.yaml +# +#print 'JSON:' #print data.json +# +#print '\nCSV:' +#print data.csv +# +# +#print '***AND WITHOUT HEADERS***' +# +#data.headers = None +# +#print '\nYAML:' +#print data.yaml +# +#print 'JSON:' +#print data.json +# +#print '\nCSV:' +#print data.csv + +book = tablib.DataBook() +book.add_book(data) +book.add_book(data) + +print book.xls + -data.headers = None -print data.csv -#print len(data.xls) -print data.yaml -print data.json \ No newline at end of file From da4f2013f1e8b05d937369c1867a25ed79ff4faf Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sat, 11 Sep 2010 23:08:31 -0400 Subject: [PATCH 3/9] Unvendorized packages. --- tablib/packages/xlwt/BIFFRecords.py | 2393 -------------- tablib/packages/xlwt/Bitmap.py | 262 -- tablib/packages/xlwt/Cell.py | 243 -- tablib/packages/xlwt/Column.py | 34 - tablib/packages/xlwt/CompoundDoc.py | 516 --- tablib/packages/xlwt/ExcelFormula.py | 43 - tablib/packages/xlwt/ExcelFormulaLexer.py | 128 - tablib/packages/xlwt/ExcelFormulaParser.py | 677 ---- tablib/packages/xlwt/ExcelMagic.py | 862 ----- tablib/packages/xlwt/Formatting.py | 261 -- tablib/packages/xlwt/Row.py | 253 -- tablib/packages/xlwt/Style.py | 592 ---- tablib/packages/xlwt/UnicodeUtils.py | 81 - tablib/packages/xlwt/Utils.py | 196 -- tablib/packages/xlwt/Workbook.py | 636 ---- tablib/packages/xlwt/Worksheet.py | 1297 -------- tablib/packages/xlwt/__init__.py | 16 - tablib/packages/xlwt/antlr.py | 2874 ----------------- tablib/packages/xlwt/doc/xlwt.html | 199 -- tablib/packages/xlwt/examples/big-16Mb.py | 35 - tablib/packages/xlwt/examples/big-35Mb.py | 34 - tablib/packages/xlwt/examples/blanks.py | 36 - tablib/packages/xlwt/examples/col_width.py | 19 - tablib/packages/xlwt/examples/country.py | 10 - tablib/packages/xlwt/examples/dates.py | 37 - tablib/packages/xlwt/examples/format.py | 38 - .../packages/xlwt/examples/formula_names.py | 34 - tablib/packages/xlwt/examples/formulas.py | 47 - tablib/packages/xlwt/examples/hyperlinks.py | 28 - tablib/packages/xlwt/examples/image.py | 12 - tablib/packages/xlwt/examples/merged.py | 39 - tablib/packages/xlwt/examples/merged0.py | 30 - tablib/packages/xlwt/examples/merged1.py | 102 - tablib/packages/xlwt/examples/mini.py | 9 - tablib/packages/xlwt/examples/mini.xls | Bin 5632 -> 0 bytes tablib/packages/xlwt/examples/num_formats.py | 60 - tablib/packages/xlwt/examples/numbers.py | 25 - tablib/packages/xlwt/examples/outline.py | 60 - tablib/packages/xlwt/examples/panes.py | 58 - tablib/packages/xlwt/examples/parse-fmla.py | 12 - tablib/packages/xlwt/examples/protection.py | 134 - tablib/packages/xlwt/examples/python.bmp | Bin 37446 -> 0 bytes tablib/packages/xlwt/examples/row_styles.py | 17 - .../xlwt/examples/row_styles_empty.py | 18 - tablib/packages/xlwt/examples/simple.py | 24 - tablib/packages/xlwt/examples/sst.py | 52 - tablib/packages/xlwt/examples/unicode0.py | 12 - tablib/packages/xlwt/examples/unicode1.py | 28 - tablib/packages/xlwt/examples/unicode2.py | 19 - tablib/packages/xlwt/examples/wsprops.py | 155 - .../xlwt/examples/xlwt_easyxf_simple_demo.py | 46 - tablib/packages/xlwt/excel-formula.g | 374 --- 52 files changed, 13167 deletions(-) delete mode 100644 tablib/packages/xlwt/BIFFRecords.py delete mode 100644 tablib/packages/xlwt/Bitmap.py delete mode 100644 tablib/packages/xlwt/Cell.py delete mode 100644 tablib/packages/xlwt/Column.py delete mode 100644 tablib/packages/xlwt/CompoundDoc.py delete mode 100644 tablib/packages/xlwt/ExcelFormula.py delete mode 100644 tablib/packages/xlwt/ExcelFormulaLexer.py delete mode 100644 tablib/packages/xlwt/ExcelFormulaParser.py delete mode 100644 tablib/packages/xlwt/ExcelMagic.py delete mode 100644 tablib/packages/xlwt/Formatting.py delete mode 100644 tablib/packages/xlwt/Row.py delete mode 100644 tablib/packages/xlwt/Style.py delete mode 100644 tablib/packages/xlwt/UnicodeUtils.py delete mode 100644 tablib/packages/xlwt/Utils.py delete mode 100644 tablib/packages/xlwt/Workbook.py delete mode 100644 tablib/packages/xlwt/Worksheet.py delete mode 100644 tablib/packages/xlwt/__init__.py delete mode 100644 tablib/packages/xlwt/antlr.py delete mode 100644 tablib/packages/xlwt/doc/xlwt.html delete mode 100644 tablib/packages/xlwt/examples/big-16Mb.py delete mode 100644 tablib/packages/xlwt/examples/big-35Mb.py delete mode 100644 tablib/packages/xlwt/examples/blanks.py delete mode 100644 tablib/packages/xlwt/examples/col_width.py delete mode 100644 tablib/packages/xlwt/examples/country.py delete mode 100644 tablib/packages/xlwt/examples/dates.py delete mode 100644 tablib/packages/xlwt/examples/format.py delete mode 100644 tablib/packages/xlwt/examples/formula_names.py delete mode 100644 tablib/packages/xlwt/examples/formulas.py delete mode 100644 tablib/packages/xlwt/examples/hyperlinks.py delete mode 100644 tablib/packages/xlwt/examples/image.py delete mode 100644 tablib/packages/xlwt/examples/merged.py delete mode 100644 tablib/packages/xlwt/examples/merged0.py delete mode 100644 tablib/packages/xlwt/examples/merged1.py delete mode 100644 tablib/packages/xlwt/examples/mini.py delete mode 100644 tablib/packages/xlwt/examples/mini.xls delete mode 100644 tablib/packages/xlwt/examples/num_formats.py delete mode 100644 tablib/packages/xlwt/examples/numbers.py delete mode 100644 tablib/packages/xlwt/examples/outline.py delete mode 100644 tablib/packages/xlwt/examples/panes.py delete mode 100644 tablib/packages/xlwt/examples/parse-fmla.py delete mode 100644 tablib/packages/xlwt/examples/protection.py delete mode 100644 tablib/packages/xlwt/examples/python.bmp delete mode 100644 tablib/packages/xlwt/examples/row_styles.py delete mode 100644 tablib/packages/xlwt/examples/row_styles_empty.py delete mode 100644 tablib/packages/xlwt/examples/simple.py delete mode 100644 tablib/packages/xlwt/examples/sst.py delete mode 100644 tablib/packages/xlwt/examples/unicode0.py delete mode 100644 tablib/packages/xlwt/examples/unicode1.py delete mode 100644 tablib/packages/xlwt/examples/unicode2.py delete mode 100644 tablib/packages/xlwt/examples/wsprops.py delete mode 100644 tablib/packages/xlwt/examples/xlwt_easyxf_simple_demo.py delete mode 100644 tablib/packages/xlwt/excel-formula.g diff --git a/tablib/packages/xlwt/BIFFRecords.py b/tablib/packages/xlwt/BIFFRecords.py deleted file mode 100644 index 632c64e..0000000 --- a/tablib/packages/xlwt/BIFFRecords.py +++ /dev/null @@ -1,2393 +0,0 @@ -# -*- coding: cp1252 -*- -from struct import pack -from UnicodeUtils import upack1, upack2 -import sys - -class SharedStringTable(object): - _SST_ID = 0x00FC - _CONTINUE_ID = 0x003C - - def __init__(self, encoding): - self.encoding = encoding - self._str_indexes = {} - self._tally = [] - self._add_calls = 0 - # Following 3 attrs are used for temporary storage in the - # get_biff_record() method and methods called by it. The pseudo- - # initialisation here is for documentation purposes only. - self._sst_record = None - self._continues = None - self._current_piece = None - - def add_str(self, s): - if self.encoding != 'ascii' and not isinstance(s, unicode): - s = unicode(s, self.encoding) - self._add_calls += 1 - if s not in self._str_indexes: - idx = len(self._str_indexes) - self._str_indexes[s] = idx - self._tally.append(1) - else: - idx = self._str_indexes[s] - self._tally[idx] += 1 - return idx - - def del_str(self, idx): - # This is called when we are replacing the contents of a string cell. - assert self._tally[idx] > 0 - self._tally[idx] -= 1 - self._add_calls -= 1 - - def str_index(self, s): - return self._str_indexes[s] - - def get_biff_record(self): - self._sst_record = '' - self._continues = [None, None] - self._current_piece = pack(' 0x2020: # limit for BIFF7/8 - chunks = [] - pos = 0 - while pos < len(data): - chunk_pos = pos + 0x2020 - chunk = data[pos:chunk_pos] - chunks.append(chunk) - pos = chunk_pos - continues = pack('<2H', self._REC_ID, len(chunks[0])) + chunks[0] - for chunk in chunks[1:]: - continues += pack('<2H%ds'%len(chunk), 0x003C, len(chunk), chunk) - # 0x003C -- CONTINUE record id - return continues - else: - return self.get_rec_header() + data - - -class Biff8BOFRecord(BiffRecord): - """ - Offset Size Contents - 0 2 Version, contains 0600H for BIFF8 and BIFF8X - 2 2 Type of the following data: - 0005H = Workbook globals - 0006H = Visual Basic module - 0010H = Worksheet - 0020H = Chart - 0040H = Macro sheet - 0100H = Workspace file - 4 2 Build identifier - 6 2 Build year - 8 4 File history flags - 12 4 Lowest Excel version that can read all records in this file - """ - _REC_ID = 0x0809 - # stream types - BOOK_GLOBAL = 0x0005 - VB_MODULE = 0x0006 - WORKSHEET = 0x0010 - CHART = 0x0020 - MACROSHEET = 0x0040 - WORKSPACE = 0x0100 - - def __init__(self, rec_type): - version = 0x0600 - build = 0x0DBB - year = 0x07CC - file_hist_flags = 0x00L - ver_can_read = 0x06L - - self._rec_data = pack('<4H2I', version, rec_type, build, year, file_hist_flags, ver_can_read) - - -class InteraceHdrRecord(BiffRecord): - _REC_ID = 0x00E1 - - def __init__(self): - self._rec_data = pack('BB', 0xB0, 0x04) - - -class InteraceEndRecord(BiffRecord): - _REC_ID = 0x00E2 - - def __init__(self): - self._rec_data = '' - - -class MMSRecord(BiffRecord): - _REC_ID = 0x00C1 - - def __init__(self): - self._rec_data = pack('> 15 - c = low_15 | high_15 - passwd_hash ^= c - passwd_hash ^= len(plaintext) - passwd_hash ^= 0xCE4B - return passwd_hash - - def __init__(self, passwd = ""): - self._rec_data = pack('