diff --git a/tablib/formats/_csv.py b/tablib/formats/_csv.py index 3a4c374..549259c 100644 --- a/tablib/formats/_csv.py +++ b/tablib/formats/_csv.py @@ -51,5 +51,5 @@ def detect(stream): try: csv.Sniffer().sniff(stream) return True - except csv.Error: - return False \ No newline at end of file + except (csv.Error, TypeError): + return False diff --git a/tablib/formats/_tsv.py b/tablib/formats/_tsv.py index f581f81..ac9554c 100644 --- a/tablib/formats/_tsv.py +++ b/tablib/formats/_tsv.py @@ -55,5 +55,5 @@ def detect(stream): try: csv.Sniffer().sniff(stream, delimiters='\t') return True - except csv.Error: + except (csv.Error, TypeError): return False diff --git a/tablib/formats/_xls.py b/tablib/formats/_xls.py index 89d2845..6530d91 100644 --- a/tablib/formats/_xls.py +++ b/tablib/formats/_xls.py @@ -6,6 +6,8 @@ import sys from tablib.compat import BytesIO, xlwt +from tablib.packages import xlrd +from tablib.packages.xlrd.biffh import XLRDError import tablib title = 'xls' @@ -16,6 +18,24 @@ wrap = xlwt.easyxf("alignment: wrap on") bold = xlwt.easyxf("font: bold on") +def detect(stream): + """Returns True if given stream is a readable excel file.""" + try: + xlrd.open_workbook(file_contents=stream) + return True + except (TypeError, XLRDError): + pass + try: + xlrd.open_workbook(file_contents=stream.read()) + return True + except (AttributeError, XLRDError): + pass + try: + xlrd.open_workbook(filename=stream) + return True + except: + return False + def export_set(dataset): """Returns XLS representation of Dataset.""" diff --git a/tablib/formats/_yaml.py b/tablib/formats/_yaml.py index 0eab78e..c9ffbd3 100644 --- a/tablib/formats/_yaml.py +++ b/tablib/formats/_yaml.py @@ -60,5 +60,5 @@ def detect(stream): return True else: return False - except yaml.parser.ParserError: - return False \ No newline at end of file + except (yaml.parser.ParserError, yaml.reader.ReaderError): + return False