11"""
2- pyexcel_ods3.ods
2+ pyexcel_ods3.odsr
33 ~~~~~~~~~~~~~~~~~~~
44
5- ODS format plugin for pyexcel
5+ ods reader
66
77 :copyright: (c) 2015-2017 by Onni Software Ltd. & its contributors
88 :license: New BSD License
99"""
10- import sys
1110import math
12- import types
1311
1412import ezodf
15- from pyexcel_io .book import BookReader , BookWriter
16- from pyexcel_io .sheet import SheetReader , SheetWriter
1713
18- import pyexcel_ods3 .converter as converter
14+ from pyexcel_io .sheet import SheetReader
15+ from pyexcel_io .book import BookReader
16+ from pyexcel_io ._compact import OrderedDict
1917
20- PY27_BELOW = sys .version_info [0 ] == 2 and sys .version_info [1 ] < 7
21- if PY27_BELOW :
22- from ordereddict import OrderedDict
23- else :
24- from collections import OrderedDict
18+ import pyexcel_ods3 .converter as converter
2519
2620
2721class ODSSheet (SheetReader ):
@@ -73,7 +67,6 @@ def cell_value(self, row, column):
7367
7468class ODSBook (BookReader ):
7569 """read a ods book out"""
76-
7770 def open (self , file_name , ** keywords ):
7871 """load ods from file"""
7972 BookReader .open (self , file_name , ** keywords )
@@ -103,8 +96,8 @@ def read_sheet_by_index(self, sheet_index):
10396 if sheet_index < length :
10497 return self .read_sheet (sheets [sheet_index ])
10598 else :
106- raise IndexError ("Index %d of out bound %d." % (sheet_index ,
107- length ))
99+ raise IndexError ("Index %d of out bound %d." % (
100+ sheet_index , length ))
108101
109102 def read_all (self ):
110103 """read all available sheets"""
@@ -118,110 +111,16 @@ def read_sheet(self, native_sheet):
118111 sheet = ODSSheet (native_sheet , ** self ._keywords )
119112 return {native_sheet .name : sheet .to_array ()}
120113
114+ def close (self ):
115+ self ._native_book = None
116+
121117 def _load_from_file (self ):
122118 self ._native_book = ezodf .opendoc (self ._file_name )
123119
124120 def _load_from_memory (self ):
125121 self ._native_book = ezodf .opendoc (self ._file_stream )
126122
127123
128- class ODSSheetWriter (SheetWriter ):
129- """
130- ODS sheet writer
131- """
132- def set_sheet_name (self , name ):
133- self ._native_sheet = ezodf .Sheet (name )
134- self .current_row = 0
135-
136- def set_size (self , size ):
137- self ._native_sheet .reset (size = size )
138-
139- def write_row (self , array ):
140- """
141- write a row into the file
142- """
143- count = 0
144- for cell in array :
145- value_type = converter .ODS_WRITE_FORMAT_COVERSION [type (cell )]
146- if value_type == "time" :
147- cell = cell .strftime ("PT%HH%MM%SS" )
148- elif value_type == "timedelta" :
149- hours = cell .days * 24 + cell .seconds // 3600
150- minutes = (cell .seconds // 60 ) % 60
151- seconds = cell .seconds % 60
152- cell = "PT%02dH%02dM%02dS" % (hours , minutes , seconds )
153- value_type = "time"
154- self ._native_sheet [self .current_row , count ].set_value (
155- cell ,
156- value_type = value_type )
157- count += 1
158- self .current_row += 1
159-
160- def write_array (self , table ):
161- to_write_data = table
162- if isinstance (to_write_data , types .GeneratorType ):
163- to_write_data = list (table )
164- rows = len (to_write_data )
165- if rows < 1 :
166- return
167- columns = max ([len (row ) for row in to_write_data ])
168- self .set_size ((rows , columns ))
169- for row in to_write_data :
170- self .write_row (row )
171-
172- def close (self ):
173- """
174- This call writes file
175-
176- """
177- self ._native_book .sheets += self ._native_sheet
178-
179-
180- class ODSWriter (BookWriter ):
181- """
182- open document spreadsheet writer
183-
184- """
185- def __init__ (self ):
186- BookWriter .__init__ (self )
187- self ._native_book = None
188-
189- def open (self , file_name , ** keywords ):
190- """open a file for writing ods"""
191- BookWriter .open (self , file_name , ** keywords )
192- self ._native_book = ezodf .newdoc (
193- doctype = "ods" , filename = self ._file_alike_object )
194-
195- skip_backup_flag = self ._keywords .get ('skip_backup' , True )
196- if skip_backup_flag :
197- self ._native_book .backup = False
198-
199- def create_sheet (self , name ):
200- """
201- write a row into the file
202- """
203- return ODSSheetWriter (self ._native_book , None , name )
204-
205- def close (self ):
206- """
207- This call writes file
208-
209- """
210- self ._native_book .save ()
211-
212-
213124def is_integer_ok_for_xl_float (value ):
214125 """check if a float had zero value in digits"""
215126 return value == math .floor (value )
216-
217-
218- _ods_registry = {
219- "file_type" : "ods" ,
220- "reader" : ODSBook ,
221- "writer" : ODSWriter ,
222- "stream_type" : "binary" ,
223- "mime_type" : "application/vnd.oasis.opendocument.spreadsheet" ,
224- "library" : "pyexcel-ods3"
225- }
226-
227- exports = (_ods_registry , )
0 commit comments