mindreframer-creek 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,44 @@
1
+ module Creek
2
+ class Styles
3
+ module Constants
4
+ # Map of non-custom numFmtId to casting symbol
5
+ NumFmtMap = {
6
+ 0 => :string, # General
7
+ 1 => :fixnum, # 0
8
+ 2 => :float, # 0.00
9
+ 3 => :fixnum, # #,##0
10
+ 4 => :float, # #,##0.00
11
+ 5 => :unsupported, # $#,##0_);($#,##0)
12
+ 6 => :unsupported, # $#,##0_);[Red]($#,##0)
13
+ 7 => :unsupported, # $#,##0.00_);($#,##0.00)
14
+ 8 => :unsupported, # $#,##0.00_);[Red]($#,##0.00)
15
+ 9 => :percentage, # 0%
16
+ 10 => :percentage, # 0.00%
17
+ 11 => :bignum, # 0.00E+00
18
+ 12 => :unsupported, # # ?/?
19
+ 13 => :unsupported, # # ??/??
20
+ 14 => :date, # mm-dd-yy
21
+ 15 => :date, # d-mmm-yy
22
+ 16 => :date, # d-mmm
23
+ 17 => :date, # mmm-yy
24
+ 18 => :time, # h:mm AM/PM
25
+ 19 => :time, # h:mm:ss AM/PM
26
+ 20 => :time, # h:mm
27
+ 21 => :time, # h:mm:ss
28
+ 22 => :date_time, # m/d/yy h:mm
29
+ 37 => :unsupported, # #,##0 ;(#,##0)
30
+ 38 => :unsupported, # #,##0 ;[Red](#,##0)
31
+ 39 => :unsupported, # #,##0.00;(#,##0.00)
32
+ 40 => :unsupported, # #,##0.00;[Red](#,##0.00)
33
+ 45 => :time, # mm:ss
34
+ 46 => :time, # [h]:mm:ss
35
+ 47 => :time, # mmss.0
36
+ 48 => :bignum, # ##0.0E+0
37
+ 49 => :unsupported # @
38
+ }
39
+
40
+ DATE_SYSTEM_1900 = Date.new(1899, 12, 30)
41
+ DATE_SYSTEM_1904 = Date.new(1904, 1, 1)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,116 @@
1
+ module Creek
2
+ class Styles
3
+ class Converter
4
+ include Creek::Styles::Constants
5
+ ##
6
+ # The heart of typecasting. The ruby type is determined either explicitly
7
+ # from the cell xml or implicitly from the cell style, and this
8
+ # method expects that work to have been done already. This, then,
9
+ # takes the type we determined it to be and casts the cell value
10
+ # to that type.
11
+ #
12
+ # types:
13
+ # - s: shared string (see #shared_string)
14
+ # - n: number (cast to a float)
15
+ # - b: boolean
16
+ # - str: string
17
+ # - inlineStr: string
18
+ # - ruby symbol: for when type has been determined by style
19
+ #
20
+ # options:
21
+ # - shared_strings: needed for 's' (shared string) type
22
+ # - base_date: from what date to begin, see method #base_date
23
+
24
+ DATE_TYPES = [:date, :time, :date_time].to_set
25
+ def self.call(value, type, style, options = {})
26
+ return nil if value.nil? || value.empty?
27
+
28
+ # Sometimes the type is dictated by the style alone
29
+ if type.nil? || (type == 'n' && DATE_TYPES.include?(style))
30
+ type = style
31
+ end
32
+
33
+ case type
34
+
35
+ ##
36
+ # There are few built-in types
37
+ ##
38
+
39
+ when 's' # shared string
40
+ options[:shared_strings][value.to_i]
41
+ when 'n' # number
42
+ value.to_f
43
+ when 'b'
44
+ value.to_i == 1
45
+ when 'str'
46
+ value
47
+ when 'inlineStr'
48
+ value
49
+
50
+ ##
51
+ # Type can also be determined by a style,
52
+ # detected earlier and cast here by its standardized symbol
53
+ ##
54
+
55
+ when :string, :unsupported
56
+ value
57
+ when :fixnum
58
+ value.to_i
59
+ when :float
60
+ value.to_f
61
+ when :percentage
62
+ value.to_f / 100
63
+ when :date, :time, :date_time
64
+ convert_date(value, options)
65
+ when :bignum
66
+ convert_bignum(value)
67
+
68
+ ## Nothing matched
69
+ else
70
+ value
71
+ end
72
+ end
73
+
74
+ # the trickiest. note that all these formats can vary on
75
+ # whether they actually contain a date, time, or datetime.
76
+ def self.convert_date(value, options)
77
+ value = value.to_f
78
+ days_since_date_system_start = value.to_i
79
+ fraction_of_24 = value - days_since_date_system_start
80
+
81
+ # http://stackoverflow.com/questions/10559767/how-to-convert-ms-excel-date-from-float-to-date-format-in-ruby
82
+ date = options.fetch(:base_date, DATE_SYSTEM_1900) + days_since_date_system_start
83
+
84
+ if fraction_of_24 > 0 # there is a time associated
85
+ seconds = (fraction_of_24 * 86400).round
86
+ return Time.utc(date.year, date.month, date.day) + seconds
87
+ else
88
+ return date
89
+ end
90
+ end
91
+
92
+ def self.convert_bignum(value)
93
+ if defined?(BigDecimal)
94
+ BigDecimal.new(value)
95
+ else
96
+ value.to_f
97
+ end
98
+ end
99
+
100
+ ## Returns the base_date from which to calculate dates.
101
+ # Defaults to 1900 (minus two days due to excel quirk), but use 1904 if
102
+ # it's set in the Workbook's workbookPr.
103
+ # http://msdn.microsoft.com/en-us/library/ff530155(v=office.12).aspx
104
+ def base_date
105
+ @base_date ||= begin
106
+ # return DATE_SYSTEM_1900 if xml.workbook == nil
107
+ # xml.workbook.xpath("//workbook/workbookPr[@date1904]").each do |workbookPr|
108
+ # return DATE_SYSTEM_1904 if workbookPr["date1904"] =~ /true|1/i
109
+ # end
110
+ DATE_SYSTEM_1900
111
+ end
112
+ end
113
+
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,85 @@
1
+ # https://github.com/hmcgowan/roo/blob/master/lib/roo/excelx.rb
2
+ # https://github.com/woahdae/simple_xlsx_reader/blob/master/lib/simple_xlsx_reader.rb#L231
3
+ module Creek
4
+ class Styles
5
+ class StyleTypes
6
+ include Creek::Styles::Constants
7
+ attr_accessor :styles_xml_doc
8
+ def initialize(styles_xml_doc)
9
+ @styles_xml_doc = styles_xml_doc
10
+ end
11
+
12
+ # Excel doesn't record types for some cells, only its display style, so
13
+ # we have to back out the type from that style.
14
+ #
15
+ # Some of these styles can be determined from a known set (see NumFmtMap),
16
+ # while others are 'custom' and we have to make a best guess.
17
+ #
18
+ # This is the array of types corresponding to the styles a spreadsheet
19
+ # uses, and includes both the known style types and the custom styles.
20
+ #
21
+ # Note that the xml sheet cells that use this don't reference the
22
+ # numFmtId, but instead the array index of a style in the stored list of
23
+ # only the styles used in the spreadsheet (which can be either known or
24
+ # custom). Hence this style types array, rather than a map of numFmtId to
25
+ # type.
26
+ def call
27
+ @style_types ||= begin
28
+ styles_xml_doc.css('styleSheet cellXfs xf').map do |xstyle|
29
+ a = num_fmt_id(xstyle)
30
+ style_type_by_num_fmt_id( a )
31
+ end
32
+ end
33
+ end
34
+
35
+ #returns the numFmtId value if it's available
36
+ def num_fmt_id(xstyle)
37
+ return nil unless xstyle.attributes['numFmtId']
38
+ xstyle.attributes['numFmtId'].value
39
+ end
40
+
41
+ # Finds the type we think a style is; For example, fmtId 14 is a date
42
+ # style, so this would return :date.
43
+ #
44
+ # Note, custom styles usually (are supposed to?) have a numFmtId >= 164,
45
+ # but in practice can sometimes be simply out of the usual "Any Language"
46
+ # id range that goes up to 49. For example, I have seen a numFmtId of
47
+ # 59 specified as a date. In Thai, 59 is a number format, so this seems
48
+ # like a bad idea, but we try to be flexible and just go with it.
49
+ def style_type_by_num_fmt_id(id)
50
+ return nil unless id
51
+ id = id.to_i
52
+ NumFmtMap[id] || custom_style_types[id]
53
+ end
54
+
55
+ # Map of (numFmtId >= 164) (custom styles) to our best guess at the type
56
+ # ex. {164 => :date_time}
57
+ def custom_style_types
58
+ @custom_style_types ||= begin
59
+ styles_xml_doc.css('styleSheet numFmts numFmt').inject({}) do |acc, xstyle|
60
+ index = xstyle.attributes['numFmtId'].value.to_i
61
+ value = xstyle.attributes['formatCode'].value
62
+ acc[index] = determine_custom_style_type(value)
63
+ acc
64
+ end
65
+ end
66
+ end
67
+
68
+ # This is the least deterministic part of reading xlsx files. Due to
69
+ # custom styles, you can't know for sure when a date is a date other than
70
+ # looking at its format and gessing. It's not impossible to guess right,
71
+ # though.
72
+ #
73
+ # http://stackoverflow.com/questions/4948998/determining-if-an-xlsx-cell-is-date-formatted-for-excel-2007-spreadsheets
74
+ def determine_custom_style_type(string)
75
+ return :float if string[0] == '_'
76
+ return :float if string[0] == ' 0'
77
+
78
+ # Looks for one of ymdhis outside of meta-stuff like [Red]
79
+ return :date_time if string =~ /(^|\])[^\[]*[ymdhis]/i
80
+
81
+ return :unsupported
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,27 @@
1
+ module Creek
2
+ class Styles
3
+ attr_accessor :book
4
+ def initialize(book)
5
+ @book = book
6
+ end
7
+
8
+ def path
9
+ "xl/styles.xml"
10
+ end
11
+
12
+ def styles_xml
13
+ @styles_xml ||= begin
14
+ if @book.files.file.exist?(path)
15
+ doc = @book.files.file.open path
16
+ Nokogiri::XML::Document.parse doc
17
+ end
18
+ end
19
+ end
20
+
21
+ def style_types
22
+ @style_types ||= begin
23
+ Creek::Styles::StyleTypes.new(styles_xml).call
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Creek
2
+ VERSION = "1.0.5"
3
+ end
data/lib/creek.rb ADDED
@@ -0,0 +1,12 @@
1
+ require "creek/version"
2
+ require 'creek/book'
3
+ require 'creek/styles/constants'
4
+ require 'creek/styles/style_types'
5
+ require 'creek/styles/converter'
6
+ require 'creek/styles'
7
+ require 'creek/sheet'
8
+ require 'creek/shared_strings'
9
+
10
+ module Creek
11
+ # Your code goes here...
12
+ end
File without changes
Binary file
Binary file
@@ -0,0 +1,459 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
3
+ <sheetPr filterMode="false">
4
+ <pageSetUpPr fitToPage="false" />
5
+ </sheetPr>
6
+ <dimension ref="A1:FN2755" />
7
+ <sheetViews>
8
+ <sheetView windowProtection="true" showFormulas="false" showGridLines="true" showRowColHeaders="true" showZeros="true" rightToLeft="false" tabSelected="true" showOutlineSymbols="true" defaultGridColor="true" view="normal" topLeftCell="A1" colorId="64" zoomScale="75" zoomScaleNormal="75" zoomScalePageLayoutView="100" workbookViewId="0">
9
+ <pane xSplit="0" ySplit="1" topLeftCell="L2" activePane="bottomLeft" state="frozen" />
10
+ <selection pane="topLeft" activeCell="A1" activeCellId="0" sqref="A1" />
11
+ <selection pane="bottomLeft" activeCell="A2" activeCellId="0" sqref="A2" />
12
+ </sheetView>
13
+ </sheetViews>
14
+ <sheetFormatPr defaultRowHeight="13.8"></sheetFormatPr>
15
+ <cols>
16
+ <col collapsed="false" hidden="false" max="1" min="1" style="0" width="48.5023255813954" />
17
+ <col collapsed="false" hidden="false" max="2" min="2" style="0" width="11.6651162790698" />
18
+ <col collapsed="false" hidden="false" max="3" min="3" style="0" width="15.6604651162791" />
19
+ <col collapsed="false" hidden="false" max="5" min="4" style="0" width="11.6651162790698" />
20
+ <col collapsed="false" hidden="false" max="6" min="6" style="0" width="12.5023255813953" />
21
+ <col collapsed="false" hidden="false" max="9" min="7" style="0" width="11.6651162790698" />
22
+ <col collapsed="false" hidden="false" max="10" min="10" style="0" width="15.8325581395349" />
23
+ <col collapsed="false" hidden="false" max="11" min="11" style="0" width="17.6651162790698" />
24
+ <col collapsed="false" hidden="false" max="42" min="12" style="0" width="11.3302325581395" />
25
+ <col collapsed="false" hidden="false" max="47" min="43" style="0" width="13.0046511627907" />
26
+ <col collapsed="false" hidden="false" max="49" min="48" style="0" width="5.9953488372093" />
27
+ <col collapsed="false" hidden="false" max="50" min="50" style="0" width="4.83255813953488" />
28
+ <col collapsed="false" hidden="false" max="81" min="51" style="0" width="11.3302325581395" />
29
+ <col collapsed="false" hidden="false" max="86" min="82" style="0" width="13.0046511627907" />
30
+ <col collapsed="false" hidden="false" max="1025" min="87" style="0" width="10.8279069767442" />
31
+ </cols>
32
+ <sheetData>
33
+ <row r="1" s="2" customFormat="true" ht="39.75" hidden="false" customHeight="true" outlineLevel="0" collapsed="false">
34
+ <c r="A1" s="1" t="s">
35
+ <v>0</v>
36
+ </c>
37
+ <c r="B1" s="1" t="s">
38
+ <v>1</v>
39
+ </c>
40
+ <c r="C1" s="1" t="s">
41
+ <v>2</v>
42
+ </c>
43
+ <c r="D1" s="1" t="s">
44
+ <v>1</v>
45
+ </c>
46
+ <c r="E1" s="1" t="s">
47
+ <v>2</v>
48
+ </c>
49
+ <c r="F1" s="1" t="s">
50
+ <v>1</v>
51
+ </c>
52
+ <c r="G1" s="1" t="s">
53
+ <v>2</v>
54
+ </c>
55
+ <c r="H1" s="1" t="s">
56
+ <v>1</v>
57
+ </c>
58
+ <c r="I1" s="1" t="s">
59
+ <v>2</v>
60
+ </c>
61
+ <c r="L1" s="3" t="n">
62
+ <v>41275</v>
63
+ </c>
64
+ <c r="M1" s="3" t="n">
65
+ <v>41306</v>
66
+ </c>
67
+ <c r="N1" s="3" t="n">
68
+ <v>41334</v>
69
+ </c>
70
+ <c r="O1" s="3" t="n">
71
+ <v>41365</v>
72
+ </c>
73
+ <c r="P1" s="3" t="n">
74
+ <v>41395</v>
75
+ </c>
76
+ <c r="Q1" s="3" t="n">
77
+ <v>41426</v>
78
+ </c>
79
+ <c r="R1" s="3" t="n">
80
+ <v>41456</v>
81
+ </c>
82
+ <c r="S1" s="3" t="n">
83
+ <v>41487</v>
84
+ </c>
85
+ <c r="T1" s="3" t="n">
86
+ <v>41518</v>
87
+ </c>
88
+ <c r="U1" s="3" t="n">
89
+ <v>41548</v>
90
+ </c>
91
+ <c r="V1" s="3" t="n">
92
+ <v>41579</v>
93
+ </c>
94
+ <c r="W1" s="3" t="n">
95
+ <v>41609</v>
96
+ </c>
97
+ <c r="X1" s="3" t="n">
98
+ <v>41640</v>
99
+ </c>
100
+ <c r="Y1" s="3" t="n">
101
+ <v>41671</v>
102
+ </c>
103
+ <c r="Z1" s="3" t="n">
104
+ <v>41699</v>
105
+ </c>
106
+ <c r="AA1" s="3" t="n">
107
+ <v>41730</v>
108
+ </c>
109
+ <c r="AB1" s="3" t="n">
110
+ <v>41760</v>
111
+ </c>
112
+ <c r="AC1" s="3" t="n">
113
+ <v>41791</v>
114
+ </c>
115
+ <c r="AD1" s="3" t="n">
116
+ <v>41821</v>
117
+ </c>
118
+ <c r="AE1" s="3" t="n">
119
+ <v>41852</v>
120
+ </c>
121
+ <c r="AF1" s="3" t="n">
122
+ <v>41883</v>
123
+ </c>
124
+ <c r="AG1" s="3" t="n">
125
+ <v>41913</v>
126
+ </c>
127
+ <c r="AH1" s="3" t="n">
128
+ <v>41944</v>
129
+ </c>
130
+ <c r="AI1" s="3" t="n">
131
+ <v>41974</v>
132
+ </c>
133
+ <c r="AJ1" s="3" t="n">
134
+ <v>42005</v>
135
+ </c>
136
+ <c r="AK1" s="3" t="n">
137
+ <v>42036</v>
138
+ </c>
139
+ <c r="AL1" s="3" t="n">
140
+ <v>42064</v>
141
+ </c>
142
+ <c r="AM1" s="3" t="n">
143
+ <v>42095</v>
144
+ </c>
145
+ <c r="AN1" s="3" t="n">
146
+ <v>42125</v>
147
+ </c>
148
+ <c r="AO1" s="3" t="n">
149
+ <v>42156</v>
150
+ </c>
151
+ <c r="AP1" s="3" />
152
+ <c r="AQ1" s="3" />
153
+ <c r="AR1" s="3" />
154
+ <c r="AS1" s="3" />
155
+ <c r="AT1" s="3" />
156
+ <c r="AU1" s="3" />
157
+ <c r="AY1" s="3" />
158
+ <c r="AZ1" s="3" />
159
+ <c r="BA1" s="3" />
160
+ <c r="BB1" s="3" />
161
+ <c r="BC1" s="3" />
162
+ <c r="BD1" s="3" />
163
+ <c r="BE1" s="3" />
164
+ <c r="BF1" s="3" />
165
+ <c r="BG1" s="3" />
166
+ <c r="BH1" s="3" />
167
+ <c r="BI1" s="3" />
168
+ <c r="BJ1" s="3" />
169
+ <c r="BK1" s="3" />
170
+ <c r="BL1" s="3" />
171
+ <c r="BM1" s="3" />
172
+ <c r="BN1" s="3" />
173
+ <c r="BO1" s="3" />
174
+ <c r="BP1" s="3" />
175
+ <c r="BQ1" s="3" />
176
+ <c r="BR1" s="3" />
177
+ <c r="BS1" s="3" />
178
+ <c r="BT1" s="3" />
179
+ <c r="BU1" s="3" />
180
+ <c r="BV1" s="3" />
181
+ <c r="BW1" s="3" />
182
+ <c r="BX1" s="3" />
183
+ <c r="BY1" s="3" />
184
+ <c r="BZ1" s="3" />
185
+ <c r="CA1" s="3" />
186
+ <c r="CB1" s="3" />
187
+ <c r="CC1" s="3" />
188
+ <c r="CD1" s="3" />
189
+ <c r="CE1" s="3" />
190
+ <c r="CF1" s="3" />
191
+ <c r="CG1" s="3" />
192
+ <c r="CH1" s="3" />
193
+ <c r="CI1" s="3" />
194
+ <c r="CJ1" s="3" />
195
+ <c r="CK1" s="3" />
196
+ <c r="CL1" s="3" />
197
+ <c r="CM1" s="3" />
198
+ <c r="CN1" s="3" />
199
+ <c r="CO1" s="3" />
200
+ <c r="CP1" s="3" />
201
+ <c r="CQ1" s="3" />
202
+ <c r="CR1" s="3" />
203
+ <c r="CS1" s="3" />
204
+ <c r="CT1" s="3" />
205
+ <c r="CU1" s="3" />
206
+ <c r="CV1" s="3" />
207
+ <c r="CW1" s="3" />
208
+ <c r="CX1" s="3" />
209
+ <c r="CY1" s="3" />
210
+ <c r="CZ1" s="3" />
211
+ <c r="DA1" s="3" />
212
+ <c r="DB1" s="3" />
213
+ <c r="DC1" s="3" />
214
+ <c r="DD1" s="3" />
215
+ <c r="DE1" s="3" />
216
+ <c r="DF1" s="3" />
217
+ <c r="DG1" s="3" />
218
+ <c r="DH1" s="3" />
219
+ <c r="DI1" s="3" />
220
+ <c r="DJ1" s="3" />
221
+ <c r="DK1" s="3" />
222
+ <c r="DL1" s="3" />
223
+ <c r="DM1" s="3" />
224
+ <c r="DN1" s="3" />
225
+ <c r="DO1" s="3" />
226
+ <c r="DP1" s="3" />
227
+ <c r="DQ1" s="3" />
228
+ <c r="DR1" s="3" />
229
+ <c r="DS1" s="3" />
230
+ <c r="DT1" s="3" />
231
+ <c r="DU1" s="3" />
232
+ <c r="DV1" s="3" />
233
+ <c r="DW1" s="3" />
234
+ <c r="DX1" s="3" />
235
+ <c r="DY1" s="3" />
236
+ <c r="DZ1" s="3" />
237
+ <c r="EA1" s="3" />
238
+ <c r="EB1" s="3" />
239
+ <c r="EC1" s="3" />
240
+ <c r="ED1" s="3" />
241
+ <c r="EE1" s="3" />
242
+ <c r="EF1" s="3" />
243
+ <c r="EG1" s="3" />
244
+ <c r="EH1" s="3" />
245
+ <c r="EI1" s="3" />
246
+ <c r="EJ1" s="3" />
247
+ <c r="EK1" s="3" />
248
+ <c r="EL1" s="3" />
249
+ <c r="EM1" s="3" />
250
+ <c r="EN1" s="3" />
251
+ <c r="EO1" s="3" />
252
+ <c r="EP1" s="3" />
253
+ <c r="EQ1" s="3" />
254
+ <c r="ER1" s="3" />
255
+ <c r="ES1" s="3" />
256
+ <c r="ET1" s="3" />
257
+ <c r="EU1" s="3" />
258
+ <c r="EV1" s="3" />
259
+ <c r="EW1" s="3" />
260
+ <c r="EX1" s="3" />
261
+ <c r="EY1" s="3" />
262
+ <c r="EZ1" s="3" />
263
+ <c r="FA1" s="3" />
264
+ <c r="FB1" s="3" />
265
+ <c r="FC1" s="3" />
266
+ <c r="FD1" s="3" />
267
+ <c r="FE1" s="3" />
268
+ <c r="FF1" s="3" />
269
+ <c r="FG1" s="3" />
270
+ <c r="FH1" s="3" />
271
+ <c r="FI1" s="3" />
272
+ <c r="FJ1" s="3" />
273
+ <c r="FK1" s="3" />
274
+ <c r="FL1" s="3" />
275
+ <c r="FM1" s="3" />
276
+ <c r="FN1" s="3" />
277
+ </row>
278
+ <row r="2" s="7" customFormat="true" ht="13.9" hidden="false" customHeight="false" outlineLevel="0" collapsed="false">
279
+ <c r="A2" s="4" t="s">
280
+ <v>3</v>
281
+ </c>
282
+ <c r="B2" s="5" t="s">
283
+ <v>4</v>
284
+ </c>
285
+ <c r="C2" s="5" t="s">
286
+ <v>5</v>
287
+ </c>
288
+ <c r="D2" s="5" t="s">
289
+ <v>6</v>
290
+ </c>
291
+ <c r="E2" s="5" t="s">
292
+ <v>7</v>
293
+ </c>
294
+ <c r="F2" s="5" t="s">
295
+ <v>8</v>
296
+ </c>
297
+ <c r="G2" s="5" t="s">
298
+ <v>9</v>
299
+ </c>
300
+ <c r="H2" s="5" t="s">
301
+ <v>10</v>
302
+ </c>
303
+ <c r="I2" s="5" t="s">
304
+ <v>11</v>
305
+ </c>
306
+ <c r="J2" s="0" />
307
+ <c r="K2" s="0" />
308
+ <c r="L2" s="0" t="n">
309
+ <v>31.27</v>
310
+ </c>
311
+ <c r="M2" s="0" t="n">
312
+ <v>46.05</v>
313
+ </c>
314
+ <c r="N2" s="0" t="n">
315
+ <v>29</v>
316
+ </c>
317
+ <c r="O2" s="0" t="n">
318
+ <v>26.13</v>
319
+ </c>
320
+ <c r="P2" s="0" t="n">
321
+ <v>11.64</v>
322
+ </c>
323
+ <c r="Q2" s="0" t="n">
324
+ <v>34.31</v>
325
+ </c>
326
+ <c r="R2" s="0" t="n">
327
+ <v>25.78</v>
328
+ </c>
329
+ <c r="S2" s="0" t="n">
330
+ <v>33.49</v>
331
+ </c>
332
+ <c r="T2" s="0" t="n">
333
+ <v>28.2</v>
334
+ </c>
335
+ <c r="U2" s="0" t="n">
336
+ <v>46.54</v>
337
+ </c>
338
+ <c r="V2" s="0" t="n">
339
+ <v>12.88</v>
340
+ </c>
341
+ <c r="W2" s="0" t="n">
342
+ <v>38.69</v>
343
+ </c>
344
+ <c r="X2" s="0" t="n">
345
+ <v>36.97</v>
346
+ </c>
347
+ <c r="Y2" s="0" t="n">
348
+ <v>42.26</v>
349
+ </c>
350
+ <c r="Z2" s="0" t="n">
351
+ <v>39.45</v>
352
+ </c>
353
+ <c r="AA2" s="0" t="n">
354
+ <v>29.01</v>
355
+ </c>
356
+ <c r="AB2" s="0" t="n">
357
+ <v>20.2</v>
358
+ </c>
359
+ <c r="AC2" s="0" t="n">
360
+ <v>46.42</v>
361
+ </c>
362
+ <c r="AD2" s="0" t="n">
363
+ <v>22.45</v>
364
+ </c>
365
+ <c r="AE2" s="0" t="n">
366
+ <v>14.35</v>
367
+ </c>
368
+ <c r="AF2" s="0" t="n">
369
+ <v>39.36</v>
370
+ </c>
371
+ <c r="AG2" s="0" t="n">
372
+ <v>21.28</v>
373
+ </c>
374
+ <c r="AH2" s="0" t="n">
375
+ <v>14.19</v>
376
+ </c>
377
+ <c r="AI2" s="0" t="n">
378
+ <v>34.57</v>
379
+ </c>
380
+ <c r="AJ2" s="6" t="n">
381
+ <v>11.64</v>
382
+ </c>
383
+ <c r="AK2" s="6" t="n">
384
+ <v>34.31</v>
385
+ </c>
386
+ <c r="AL2" s="6" t="n">
387
+ <v>11.64</v>
388
+ </c>
389
+ <c r="AM2" s="6" t="n">
390
+ <v>11.64</v>
391
+ </c>
392
+ <c r="AN2" s="6" t="n">
393
+ <v>34.31</v>
394
+ </c>
395
+ <c r="AO2" s="6" t="n">
396
+ <v>25.78</v>
397
+ </c>
398
+ <c r="AP2" s="6" />
399
+ <c r="AQ2" s="0" />
400
+ <c r="AR2" s="0" />
401
+ <c r="AS2" s="0" />
402
+ <c r="AT2" s="0" />
403
+ <c r="AU2" s="0" />
404
+ <c r="AV2" s="0" />
405
+ <c r="AW2" s="0" />
406
+ <c r="AX2" s="0" />
407
+ <c r="AY2" s="0" />
408
+ <c r="AZ2" s="0" />
409
+ <c r="BA2" s="0" />
410
+ <c r="BB2" s="0" />
411
+ <c r="BC2" s="0" />
412
+ <c r="BD2" s="0" />
413
+ <c r="BE2" s="0" />
414
+ <c r="BF2" s="0" />
415
+ <c r="BG2" s="0" />
416
+ <c r="BH2" s="0" />
417
+ <c r="BI2" s="0" />
418
+ <c r="BJ2" s="0" />
419
+ <c r="BK2" s="0" />
420
+ <c r="BL2" s="0" />
421
+ <c r="BM2" s="0" />
422
+ <c r="BN2" s="0" />
423
+ <c r="BO2" s="0" />
424
+ <c r="BP2" s="0" />
425
+ <c r="BQ2" s="0" />
426
+ <c r="BR2" s="0" />
427
+ <c r="BS2" s="0" />
428
+ <c r="BT2" s="0" />
429
+ <c r="BU2" s="0" />
430
+ <c r="BV2" s="0" />
431
+ <c r="BW2" s="6" />
432
+ <c r="BX2" s="6" />
433
+ <c r="BY2" s="6" />
434
+ <c r="BZ2" s="6" />
435
+ <c r="CA2" s="6" />
436
+ <c r="CB2" s="6" />
437
+ <c r="CC2" s="6" />
438
+ <c r="CD2" s="0" />
439
+ </row>
440
+ <row r="2755" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
441
+ <row r="2756" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
442
+ <row r="2757" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
443
+ <row r="2758" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
444
+ <row r="2759" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
445
+ <row r="2760" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
446
+ <row r="2761" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
447
+ <row r="2762" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
448
+ <row r="2763" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
449
+ <row r="2764" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
450
+ <row r="2765" customFormat="false" ht="13" hidden="false" customHeight="true" outlineLevel="0" collapsed="false"></row>
451
+ </sheetData>
452
+ <printOptions headings="false" gridLines="false" gridLinesSet="true" horizontalCentered="false" verticalCentered="false" />
453
+ <pageMargins left="0.7" right="0.7" top="0.7875" bottom="0.7875" header="0.511805555555555" footer="0.511805555555555" />
454
+ <pageSetup paperSize="9" scale="100" firstPageNumber="0" fitToWidth="1" fitToHeight="1" pageOrder="downThenOver" orientation="portrait" usePrinterDefaults="false" blackAndWhite="false" draft="false" cellComments="none" useFirstPageNumber="false" horizontalDpi="300" verticalDpi="300" copies="1" />
455
+ <headerFooter differentFirst="false" differentOddEven="false">
456
+ <oddHeader></oddHeader>
457
+ <oddFooter></oddFooter>
458
+ </headerFooter>
459
+ </worksheet>