Mercurial > hg > ooxml
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) |