creek 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTlmZDZhOWE4MjA3ZTI5MDExOGRjNjhlODRhZjE4OGM3NTc5M2M2Yg==
4
+ MDQ1NWQyM2FhYjY0ZWJlYWE4ODlhY2Y2OGQ3OTM2OTBmOGRmMWJkNw==
5
5
  data.tar.gz: !binary |-
6
- NDU3NDgwNmEyZGY5OTExYzE4MTQxMTU4YjdjOTMzNzhkNWYyZWJmYQ==
6
+ M2FlZWVjMmJkYzhhMTVkMzY5Zjg4NDZjNGRlN2NkZTBhM2ZlMDY5YQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MmY0YWJlYmM2YmIwNmNmMzgxNGM2NjhlZTliMTEyZDY4NDZhZTIzNjZlYmU2
10
- YmJmMDU3NDQwM2VjZjI2ZmU2OGRmZTlmOTczM2RjZGFlOWE1ZWY5ODhhYjMy
11
- NjI3NjkyYjUxM2VkYWE1NGQ4MGM1MmM3YTQyZmU1MjQxYmFkMTE=
9
+ MmNkYzY2MzIxNWVmMTgyOTAwMzM0NDNlMWIzNThlZTIyYzA0OTg1MmNlMWFm
10
+ MzU3Nzk3ZDBmOTNjY2FlNGJkYzU1YjRiZDM0MzBhNGJjYmE4ZDJlZGM0NTZl
11
+ MDk5NzM3NTI3NTRmY2U3NDgwOWFkOWMxMDM4ODI1YTg2NjM1ZmM=
12
12
  data.tar.gz: !binary |-
13
- ZTRkZmU3YjY2NTVlODdlZWNjYjkzZjE0ZmViNjE1MTE1NWVhYTY4MTJlNWNm
14
- YjQyZjE2YTUwMGMyMDdmZTM5YTYwOTNmNjMzZGE0MTYzNWY0YjY0NjAyZGE4
15
- N2MwODUyZGI3YTdkY2YwZjc5YzhhOWZkMDEwN2M3NWVhOGZkYWU=
13
+ NjU2NjNkMTU5YzM2ZTc2MDhlYjhmNDc0NjJmZGFhY2FmMTExZjgyNjIwNjgx
14
+ ZTc4MGNkOThiZGEwMzYxMGMxM2FkNDYyNGYyY2ZlOGZjYTk3NGE2ZGM1ODBl
15
+ YzdkOWJlOGRkNjU4NGY4NDY2YjRmYWUzZmEyNTdkODUyYmEyOWI=
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency 'rspec', '~> 2.13.0'
26
+ spec.add_development_dependency 'pry'
26
27
 
27
28
  spec.add_dependency 'nokogiri', '~> 1.6.0'
28
29
  spec.add_dependency 'rubyzip', '>= 1.0.0'
@@ -1,5 +1,9 @@
1
1
  require "creek/version"
2
2
  require 'creek/book'
3
+ require 'creek/styles/constants'
4
+ require 'creek/styles/style_types'
5
+ require 'creek/styles/converter'
6
+ require 'creek/styles'
3
7
  require 'creek/sheet'
4
8
  require 'creek/shared_strings'
5
9
 
@@ -27,6 +27,10 @@ module Creek
27
27
  end
28
28
  end
29
29
 
30
+ def style_types
31
+ @style_types ||= Creek::Styles.new(self).style_types
32
+ end
33
+
30
34
  def close
31
35
  @files.close
32
36
  end
@@ -65,6 +65,8 @@ module Creek
65
65
  closer = Nokogiri::XML::Reader::TYPE_END_ELEMENT
66
66
  Enumerator.new do |y|
67
67
  shared, row, cells, cell = false, nil, {}, nil
68
+ cell_type = nil
69
+ cell_style_idx = nil
68
70
  @book.files.file.open(path) do |xml|
69
71
  Nokogiri::XML::Reader.from_io(xml).each do |node|
70
72
  if (node.name.eql? 'row') and (node.node_type.eql? opener)
@@ -77,13 +79,13 @@ module Creek
77
79
  row['cells'] = processed_cells
78
80
  y << (include_meta_data ? row : processed_cells)
79
81
  elsif (node.name.eql? 'c') and (node.node_type.eql? opener)
80
- shared = node.attribute('t').eql? 's'
81
- cell = node.attribute('r')
82
+ cell_type = node.attributes['t']
83
+ cell_style_idx = node.attributes['s']
84
+ cell = node.attributes['r']
85
+
82
86
  elsif node.value?
83
- if shared
84
- cells[cell] = @book.shared_strings.dictionary[node.value.to_i] if @book.shared_strings.dictionary.has_key? node.value.to_i
85
- else
86
- cells[cell] = node.value
87
+ if !cell.nil?
88
+ cells[cell] = convert(node.value, cell_type, cell_style_idx)
87
89
  end
88
90
  end
89
91
  end
@@ -91,6 +93,16 @@ module Creek
91
93
  end
92
94
  end
93
95
  end
96
+
97
+ def convert(value, type, style_idx)
98
+ style = @book.style_types[style_idx.to_i]
99
+ Creek::Styles::Converter.call(value, type, style, converter_options)
100
+ end
101
+
102
+ def converter_options
103
+ @converter_options ||= {shared_strings: @book.shared_strings.dictionary}
104
+ end
105
+
94
106
  ##
95
107
  # The unzipped XML file does not contain any node for empty cells.
96
108
  # Empty cells are being padded in using this function
@@ -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,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
@@ -1,3 +1,3 @@
1
1
  module Creek
2
- VERSION = "1.0.5"
2
+ VERSION = "1.0.6"
3
3
  end
@@ -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>
@@ -0,0 +1,208 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2
+ <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
3
+ <numFmts count="2">
4
+ <numFmt numFmtId="164" formatCode="GENERAL" />
5
+ <numFmt numFmtId="165" formatCode="MM/DD/YYYY" />
6
+ </numFmts>
7
+ <fonts count="6">
8
+ <font>
9
+ <sz val="11" />
10
+ <color rgb="FF000000" />
11
+ <name val="Calibri" />
12
+ <family val="2" />
13
+ <charset val="1" />
14
+ </font>
15
+ <font>
16
+ <sz val="10" />
17
+ <name val="Arial" />
18
+ <family val="0" />
19
+ </font>
20
+ <font>
21
+ <sz val="10" />
22
+ <name val="Arial" />
23
+ <family val="0" />
24
+ </font>
25
+ <font>
26
+ <sz val="10" />
27
+ <name val="Arial" />
28
+ <family val="0" />
29
+ </font>
30
+ <font><b val="true" />
31
+ <sz val="12" />
32
+ <color rgb="FFFFFFFF" />
33
+ <name val="Calibri" />
34
+ <family val="2" />
35
+ <charset val="1" />
36
+ </font>
37
+ <font><b val="true" />
38
+ <sz val="11" />
39
+ <color rgb="FF000000" />
40
+ <name val="Calibri" />
41
+ <family val="2" />
42
+ <charset val="1" />
43
+ </font>
44
+ </fonts>
45
+ <fills count="4">
46
+ <fill>
47
+ <patternFill patternType="none" />
48
+ </fill>
49
+ <fill>
50
+ <patternFill patternType="gray125" />
51
+ </fill>
52
+ <fill>
53
+ <patternFill patternType="solid">
54
+ <fgColor rgb="FF090948" />
55
+ <bgColor rgb="FF000080" />
56
+ </patternFill>
57
+ </fill>
58
+ <fill>
59
+ <patternFill patternType="solid">
60
+ <fgColor rgb="FFDCE6F2" />
61
+ <bgColor rgb="FFCCFFFF" />
62
+ </patternFill>
63
+ </fill>
64
+ </fills>
65
+ <borders count="2">
66
+ <border diagonalUp="false" diagonalDown="false">
67
+ <left/>
68
+ <right/>
69
+ <top/>
70
+ <bottom/>
71
+ <diagonal/>
72
+ </border>
73
+ <border diagonalUp="false" diagonalDown="false">
74
+ <left style="thin" />
75
+ <right style="thin" />
76
+ <top style="thin" />
77
+ <bottom style="thin" />
78
+ <diagonal/>
79
+ </border>
80
+ </borders>
81
+ <cellStyleXfs count="20">
82
+ <xf numFmtId="164" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="true" applyAlignment="true" applyProtection="true">
83
+ <alignment horizontal="general" vertical="bottom" textRotation="0" wrapText="false" indent="0" shrinkToFit="false" />
84
+ <protection locked="true" hidden="false" />
85
+ </xf>
86
+ <xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
87
+ <xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
88
+ <xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
89
+ <xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
90
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
91
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
92
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
93
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
94
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
95
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
96
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
97
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
98
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
99
+ <xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
100
+ <xf numFmtId="43" fontId="1" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
101
+ <xf numFmtId="41" fontId="1" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
102
+ <xf numFmtId="44" fontId="1" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
103
+ <xf numFmtId="42" fontId="1" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
104
+ <xf numFmtId="9" fontId="1" fillId="0" borderId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false"></xf>
105
+ </cellStyleXfs>
106
+ <cellXfs count="8">
107
+ <xf numFmtId="164" fontId="0" fillId="0" borderId="0" xfId="0" applyFont="false" applyBorder="false" applyAlignment="false" applyProtection="false">
108
+ <alignment horizontal="general" vertical="bottom" textRotation="0" wrapText="false" indent="0" shrinkToFit="false" />
109
+ <protection locked="true" hidden="false" />
110
+ </xf>
111
+ <xf numFmtId="164" fontId="4" fillId="2" borderId="1" xfId="0" applyFont="true" applyBorder="true" applyAlignment="true" applyProtection="false">
112
+ <alignment horizontal="center" vertical="bottom" textRotation="0" wrapText="false" indent="0" shrinkToFit="false" />
113
+ <protection locked="true" hidden="false" />
114
+ </xf>
115
+ <xf numFmtId="164" fontId="4" fillId="2" borderId="0" xfId="0" applyFont="true" applyBorder="true" applyAlignment="true" applyProtection="false">
116
+ <alignment horizontal="center" vertical="bottom" textRotation="0" wrapText="false" indent="0" shrinkToFit="false" />
117
+ <protection locked="true" hidden="false" />
118
+ </xf>
119
+ <xf numFmtId="165" fontId="4" fillId="2" borderId="0" xfId="0" applyFont="true" applyBorder="true" applyAlignment="true" applyProtection="false">
120
+ <alignment horizontal="center" vertical="bottom" textRotation="0" wrapText="false" indent="0" shrinkToFit="false" />
121
+ <protection locked="true" hidden="false" />
122
+ </xf>
123
+ <xf numFmtId="164" fontId="5" fillId="3" borderId="0" xfId="0" applyFont="true" applyBorder="true" applyAlignment="true" applyProtection="false">
124
+ <alignment horizontal="general" vertical="center" textRotation="0" wrapText="true" indent="0" shrinkToFit="false" />
125
+ <protection locked="true" hidden="false" />
126
+ </xf>
127
+ <xf numFmtId="164" fontId="0" fillId="0" borderId="0" xfId="0" applyFont="true" applyBorder="true" applyAlignment="true" applyProtection="false">
128
+ <alignment horizontal="left" vertical="center" textRotation="0" wrapText="true" indent="0" shrinkToFit="false" />
129
+ <protection locked="true" hidden="false" />
130
+ </xf>
131
+ <xf numFmtId="164" fontId="0" fillId="0" borderId="0" xfId="0" applyFont="true" applyBorder="false" applyAlignment="false" applyProtection="false">
132
+ <alignment horizontal="general" vertical="bottom" textRotation="0" wrapText="false" indent="0" shrinkToFit="false" />
133
+ <protection locked="true" hidden="false" />
134
+ </xf>
135
+ <xf numFmtId="164" fontId="0" fillId="0" borderId="0" xfId="0" applyFont="false" applyBorder="true" applyAlignment="false" applyProtection="false">
136
+ <alignment horizontal="general" vertical="bottom" textRotation="0" wrapText="false" indent="0" shrinkToFit="false" />
137
+ <protection locked="true" hidden="false" />
138
+ </xf>
139
+ </cellXfs>
140
+ <cellStyles count="6">
141
+ <cellStyle name="Normal" xfId="0" builtinId="0" customBuiltin="false" />
142
+ <cellStyle name="Comma" xfId="15" builtinId="3" customBuiltin="false" />
143
+ <cellStyle name="Comma [0]" xfId="16" builtinId="6" customBuiltin="false" />
144
+ <cellStyle name="Currency" xfId="17" builtinId="4" customBuiltin="false" />
145
+ <cellStyle name="Currency [0]" xfId="18" builtinId="7" customBuiltin="false" />
146
+ <cellStyle name="Percent" xfId="19" builtinId="5" customBuiltin="false" />
147
+ </cellStyles>
148
+ <colors>
149
+ <indexedColors>
150
+ <rgbColor rgb="FF000000" />
151
+ <rgbColor rgb="FFFFFFFF" />
152
+ <rgbColor rgb="FFFF0000" />
153
+ <rgbColor rgb="FF00FF00" />
154
+ <rgbColor rgb="FF0000FF" />
155
+ <rgbColor rgb="FFFFFF00" />
156
+ <rgbColor rgb="FFFF00FF" />
157
+ <rgbColor rgb="FF00FFFF" />
158
+ <rgbColor rgb="FF800000" />
159
+ <rgbColor rgb="FF008000" />
160
+ <rgbColor rgb="FF090948" />
161
+ <rgbColor rgb="FF808000" />
162
+ <rgbColor rgb="FF800080" />
163
+ <rgbColor rgb="FF008080" />
164
+ <rgbColor rgb="FFC0C0C0" />
165
+ <rgbColor rgb="FF808080" />
166
+ <rgbColor rgb="FF9999FF" />
167
+ <rgbColor rgb="FF993366" />
168
+ <rgbColor rgb="FFFFFFCC" />
169
+ <rgbColor rgb="FFDCE6F2" />
170
+ <rgbColor rgb="FF660066" />
171
+ <rgbColor rgb="FFFF8080" />
172
+ <rgbColor rgb="FF0066CC" />
173
+ <rgbColor rgb="FFCCCCFF" />
174
+ <rgbColor rgb="FF000080" />
175
+ <rgbColor rgb="FFFF00FF" />
176
+ <rgbColor rgb="FFFFFF00" />
177
+ <rgbColor rgb="FF00FFFF" />
178
+ <rgbColor rgb="FF800080" />
179
+ <rgbColor rgb="FF800000" />
180
+ <rgbColor rgb="FF008080" />
181
+ <rgbColor rgb="FF0000FF" />
182
+ <rgbColor rgb="FF00CCFF" />
183
+ <rgbColor rgb="FFCCFFFF" />
184
+ <rgbColor rgb="FFCCFFCC" />
185
+ <rgbColor rgb="FFFFFF99" />
186
+ <rgbColor rgb="FF99CCFF" />
187
+ <rgbColor rgb="FFFF99CC" />
188
+ <rgbColor rgb="FFCC99FF" />
189
+ <rgbColor rgb="FFFFCC99" />
190
+ <rgbColor rgb="FF3366FF" />
191
+ <rgbColor rgb="FF33CCCC" />
192
+ <rgbColor rgb="FF99CC00" />
193
+ <rgbColor rgb="FFFFCC00" />
194
+ <rgbColor rgb="FFFF9900" />
195
+ <rgbColor rgb="FFFF6600" />
196
+ <rgbColor rgb="FF666699" />
197
+ <rgbColor rgb="FF969696" />
198
+ <rgbColor rgb="FF003366" />
199
+ <rgbColor rgb="FF339966" />
200
+ <rgbColor rgb="FF003300" />
201
+ <rgbColor rgb="FF333300" />
202
+ <rgbColor rgb="FF993300" />
203
+ <rgbColor rgb="FF993366" />
204
+ <rgbColor rgb="FF333399" />
205
+ <rgbColor rgb="FF333333" />
206
+ </indexedColors>
207
+ </colors>
208
+ </styleSheet>
@@ -1,4 +1,4 @@
1
- require 'creek'
1
+ require './spec/spec_helper'
2
2
 
3
3
  describe 'shared strings' do
4
4
 
@@ -0,0 +1,3 @@
1
+ require 'creek'
2
+ require 'pry'
3
+
@@ -0,0 +1,16 @@
1
+ require './spec/spec_helper'
2
+
3
+ describe Creek::Styles::Converter do
4
+
5
+ describe :call do
6
+ def convert(value, type, style)
7
+ Creek::Styles::Converter.call(value, type, style)
8
+ end
9
+
10
+ describe :date_time do
11
+ it "works" do
12
+ convert('41275', 'n', :date_time).should == Date.new(2013,01,01)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ require './spec/spec_helper'
2
+
3
+ describe Creek::Styles::StyleTypes do
4
+
5
+ describe :call do
6
+ it "return array of styletypes with mapping to ruby types" do
7
+ xml_file = File.open('spec/fixtures/styles/first.xml')
8
+ doc = Nokogiri::XML(xml_file)
9
+ res = Creek::Styles::StyleTypes.new(doc).call
10
+ res.size.should == 8
11
+ res[3].should == :date_time
12
+ res.should == [:unsupported, :unsupported, :unsupported, :date_time, :unsupported, :unsupported, :unsupported, :unsupported]
13
+ end
14
+ end
15
+ end
@@ -1,4 +1,4 @@
1
- require 'creek'
1
+ require './spec/spec_helper'
2
2
 
3
3
  describe 'Creek trying to parsing an invalid file.' do
4
4
  it 'Fail to open a legacy xls file.' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: creek
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - pythonicrubyist
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-10 00:00:00.000000000 Z
11
+ date: 2015-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.13.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: nokogiri
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -98,13 +112,22 @@ files:
98
112
  - lib/creek/book.rb
99
113
  - lib/creek/shared_strings.rb
100
114
  - lib/creek/sheet.rb
115
+ - lib/creek/styles.rb
116
+ - lib/creek/styles/constants.rb
117
+ - lib/creek/styles/converter.rb
118
+ - lib/creek/styles/style_types.rb
101
119
  - lib/creek/version.rb
102
120
  - spec/fixtures/invalid.xls
103
121
  - spec/fixtures/sample-as-zip.zip
104
122
  - spec/fixtures/sample.xlsx
123
+ - spec/fixtures/sheets/sheet1.xml
105
124
  - spec/fixtures/sst.xml
125
+ - spec/fixtures/styles/first.xml
106
126
  - spec/fixtures/temp_string_io_file_path_with_no_extension
107
127
  - spec/shared_string_spec.rb
128
+ - spec/spec_helper.rb
129
+ - spec/styles/converter_spec.rb
130
+ - spec/styles/style_types_spec.rb
108
131
  - spec/test_spec.rb
109
132
  homepage: https://github.com/pythonicrubyist/creek
110
133
  licenses:
@@ -126,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
149
  version: '0'
127
150
  requirements: []
128
151
  rubyforge_project:
129
- rubygems_version: 2.2.0
152
+ rubygems_version: 2.4.6
130
153
  signing_key:
131
154
  specification_version: 4
132
155
  summary: A Ruby gem for parsing large Excel(xlsx and xlsm) files.
@@ -134,7 +157,12 @@ test_files:
134
157
  - spec/fixtures/invalid.xls
135
158
  - spec/fixtures/sample-as-zip.zip
136
159
  - spec/fixtures/sample.xlsx
160
+ - spec/fixtures/sheets/sheet1.xml
137
161
  - spec/fixtures/sst.xml
162
+ - spec/fixtures/styles/first.xml
138
163
  - spec/fixtures/temp_string_io_file_path_with_no_extension
139
164
  - spec/shared_string_spec.rb
165
+ - spec/spec_helper.rb
166
+ - spec/styles/converter_spec.rb
167
+ - spec/styles/style_types_spec.rb
140
168
  - spec/test_spec.rb