From 97b4401b18ed264f77072dd362ec8d7cca3f4571 Mon Sep 17 00:00:00 2001 From: Daniel Velkov Date: Fri, 1 Jun 2012 11:11:15 -0700 Subject: [PATCH] xls and xlsx import support --- tablib/core.py | 2 ++ tablib/formats/_xls.py | 16 ++++++++++++++ tablib/formats/_xlsx.py | 49 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/tablib/core.py b/tablib/core.py index 1fdc77c..eef470c 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -952,6 +952,8 @@ class Databook(object): except AttributeError: pass + def sheets(self): + return self._datasets def add_sheet(self, dataset): """Adds given :class:`Dataset` to the :class:`Databook`.""" diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index ebec9e1..cf7e332 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -66,6 +66,22 @@ def export_book(databook): return stream.getvalue() +def import_set(dset, in_stream, headers=True): + """Returns databook from XLS stream.""" + + dset.wipe() + + xls_book = xlrd.open_workbook(file_contents=in_stream) + sheet = xls_book.sheet_by_index(0) + + dset.title = sheet.name + + for i in xrange(sheet.nrows): + if (i == 0) and (headers): + dset.headers = sheet.row_values(0) + else: + dset.append(sheet.row_values(i)) + def import_book(dbook, in_stream, headers=True): """Returns databook from XLS stream.""" diff --git a/tablib/formats/_xlsx.py b/tablib/formats/_xlsx.py index 9cd63b5..901ce59 100644 --- a/tablib/formats/_xlsx.py +++ b/tablib/formats/_xlsx.py @@ -12,6 +12,7 @@ else: from cStringIO import StringIO as BytesIO from tablib.compat import openpyxl +import tablib Workbook = openpyxl.workbook.Workbook ExcelWriter = openpyxl.writer.excel.ExcelWriter @@ -23,6 +24,15 @@ from tablib.compat import unicode title = 'xlsx' extentions = ('xlsx',) + +def detect(stream): + """Returns True if given stream is a readable excel file.""" + try: + openpyxl.reader.excel.load_workbook(stream) + return True + except TypeError: + pass + def export_set(dataset): """Returns XLSX representation of Dataset.""" @@ -54,6 +64,45 @@ def export_book(databook): return stream.getvalue() +def import_set(dset, in_stream, headers=True): + """Returns databook from XLS stream.""" + + dset.wipe() + + xls_book = openpyxl.reader.excel.load_workbook(in_stream) + sheet = xls_book.get_active_sheet() + + dset.title = sheet.title + + for i, row in enumerate(sheet.rows): + row_vals = [c.value for c in row] + if (i == 0) and (headers): + dset.headers = row_vals + else: + dset.append(row_vals) + + +def import_book(dbook, in_stream, headers=True): + """Returns databook from XLS stream.""" + + dbook.wipe() + + xls_book = openpyxl.reader.excel.load_workbook(in_stream) + + for sheet in xls_book.worksheets: + data = tablib.Dataset() + data.title = sheet.title + + for i, row in enumerate(sheet.rows): + row_vals = [c.value for c in row] + if (i == 0) and (headers): + data.headers = row_vals + else: + data.append(row_vals) + + dbook.add_sheet(data) + + def dset_sheet(dataset, ws): """Completes given worksheet from given Dataset.""" _package = dataset._package(dicts=False)