mindreframer-creek 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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>