1
1
"""
2
- pyexcel_ods3.ods
2
+ pyexcel_ods3.odsr
3
3
~~~~~~~~~~~~~~~~~~~
4
4
5
- ODS format plugin for pyexcel
5
+ ods reader
6
6
7
7
:copyright: (c) 2015-2017 by Onni Software Ltd. & its contributors
8
8
:license: New BSD License
9
9
"""
10
- import sys
11
10
import math
12
- import types
13
11
14
12
import ezodf
15
- from pyexcel_io .book import BookReader , BookWriter
16
- from pyexcel_io .sheet import SheetReader , SheetWriter
17
13
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
19
17
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
25
19
26
20
27
21
class ODSSheet (SheetReader ):
@@ -73,7 +67,6 @@ def cell_value(self, row, column):
73
67
74
68
class ODSBook (BookReader ):
75
69
"""read a ods book out"""
76
-
77
70
def open (self , file_name , ** keywords ):
78
71
"""load ods from file"""
79
72
BookReader .open (self , file_name , ** keywords )
@@ -103,8 +96,8 @@ def read_sheet_by_index(self, sheet_index):
103
96
if sheet_index < length :
104
97
return self .read_sheet (sheets [sheet_index ])
105
98
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 ))
108
101
109
102
def read_all (self ):
110
103
"""read all available sheets"""
@@ -118,110 +111,16 @@ def read_sheet(self, native_sheet):
118
111
sheet = ODSSheet (native_sheet , ** self ._keywords )
119
112
return {native_sheet .name : sheet .to_array ()}
120
113
114
+ def close (self ):
115
+ self ._native_book = None
116
+
121
117
def _load_from_file (self ):
122
118
self ._native_book = ezodf .opendoc (self ._file_name )
123
119
124
120
def _load_from_memory (self ):
125
121
self ._native_book = ezodf .opendoc (self ._file_stream )
126
122
127
123
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
-
213
124
def is_integer_ok_for_xl_float (value ):
214
125
"""check if a float had zero value in digits"""
215
126
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