comparison excel.py @ 71:54bb53434887

begin work on decoder that allows identifiers as keys and values
author Henry S. Thompson <ht@markup.co.uk>
date Wed, 28 Jun 2017 19:08:30 +0100
parents 0003fe7b6b67
children 4bd5de7ac247
comparison
equal deleted inserted replaced
70:0003fe7b6b67 71:54bb53434887
1 #!/usr/bin/python3 1 #!/usr/bin/python3
2 '''Class model for analysis of Excel spreadsheets''' 2 '''Class model for analysis of Excel spreadsheets'''
3 from jsonweb.encode import to_object, dumper 3 from jsonweb.encode import to_object, dumper
4 from jsonweb.decode import from_object, loader
5 import json
6 import eDecoder
7
4 try: 8 try:
5 string_types=basestring 9 string_types=basestring
6 except NameError: 10 except NameError:
7 string_types=str 11 string_types=str
8 12
13 @from_object()
9 @to_object(exclude_nulls=True) 14 @to_object(exclude_nulls=True)
10 class Book(object): 15 class Book(object):
11 def __init__(self,source,sheets=[],formats=[]): 16 def __init__(self,source,sheets=[],formats=[]):
12 assert(isinstance(source,string_types)) 17 assert(isinstance(source,string_types))
13 self.source=source 18 self.source=source
19 24
20 def addSheet(self,sheet): 25 def addSheet(self,sheet):
21 assert(isinstance(sheet,Sheet)) 26 assert(isinstance(sheet,Sheet))
22 self.sheets.append(sheet) 27 self.sheets.append(sheet)
23 28
29 @from_object()
24 @to_object(exclude_nulls=True,suppress=["book"]) 30 @to_object(exclude_nulls=True,suppress=["book"])
25 class Sheet(object): 31 class Sheet(object):
26 def __init__(self,name,book,tables=[],docs=[],misc=[]): 32 def __init__(self,name,book=None,tables=[],docs=[],misc=[]):
27 assert(isinstance(name,string_types)) 33 assert(isinstance(name,string_types))
28 self.name=name 34 self.name=name
29 assert(isinstance(book,Book))
30 self.book=book
31 tables=list(tables) 35 tables=list(tables)
32 assert(all(isinstance(s,Region) for s in tables)) 36 assert(all(isinstance(s,Table) for s in tables))
33 self.tables=tables 37 self.tables=tables
34 docs=list(docs) 38 docs=list(docs)
35 assert(all(isinstance(s,Region) for s in docs)) 39 assert(all(isinstance(s,Region) for s in docs))
36 self.docs=docs 40 self.docs=docs
37 misc=list(misc) 41 misc=list(misc)
38 assert(all(isinstance(s,Region) for s in misc)) 42 assert(all(isinstance(s,Region) for s in misc))
39 self.misc=misc 43 self.misc=misc
40 book.addSheet(self) 44 if book is not None:
45 assert(isinstance(book,Book))
46 book.addSheet(self)
47 self.book=book
41 48
42 def addTable(self,table): 49 def addTable(self,table):
43 assert(isinstance(table,Region)) 50 assert(isinstance(table,Region))
44 self.tables.append(table) 51 self.tables.append(table)
45 52
46 @to_object(exclude_nulls=True,suppress=["sheet"]) 53 @from_object()
54 @to_object(exclude_nulls=True,suppress=["parent"])
47 class Region(object): 55 class Region(object):
48 def __init__(self,name,sheet=None,ranges=[]): 56 def __init__(self,name,parent=None,ranges=[],content=[]):
49 if sheet is not None: 57 if parent is not None:
50 assert(isinstance(sheet,Sheet)) 58 assert(isinstance(parent,(Region,Sheet)))
51 self.sheet=sheet 59 self.parent=parent
52 ranges=list(ranges) 60 ranges=list(ranges)
53 assert(all(isinstance(s,Range) for s in ranges)) 61 assert(all(isinstance(s,Range) for s in ranges))
54 self.ranges=ranges 62 self.ranges=ranges
63 content=list(content)
64 assert(all(isinstance(s,(Region,string_types)) for s in content))
65 self.content=content
55 assert(isinstance(name,string_types)) 66 assert(isinstance(name,string_types))
56 self.name=name 67 self.name=name
68 if parent is not None:
69 parent.addRegion(self)
70
71 def addRegion(self,content):
72 assert(isinstance(content,(Region,string_types)))
73 self.content.append(content)
74
75 @from_object()
76 @to_object(exclude_nulls=True,suppress=["sheet"])
77 class Table(Region):
78 def __init__(self,name,sheet=None,ranges=[],labels=[],data=[]):
79 super(Table,self).__init__(name,sheet,ranges)
80 labels=list(labels)
81 assert(all(isinstance(s,Label) for s in labels))
82 self.labels=labels
83 data=list(data)
84 assert(all(isinstance(s,Region) for s in data))
85 self.data=data
57 if sheet is not None: 86 if sheet is not None:
87 assert(isinstance(sheet,Sheet))
58 sheet.addTable(self) 88 sheet.addTable(self)
89 self.sheet=sheet
90
91 def addLabel(self,label):
92 assert(isinstance(label,Label))
93 self.labels.append(label)
94
95 def addData(self,data):
96 assert(isinstance(data,Data))
97 self.data.append(data)
98
99 def addRegion(self,region):
100 assert(isinstance(region,(Label,Data)))
101 if isinstance(region,Label):
102 self.addLabel(region)
103 else:
104 self.addData(region)
105
106 def lt(filename):
107 with open(filename,'r') as js:
108 return json.loads(js.read(),cls=eDecoder.eDecoder)