creek 1.0.5 → 1.0.6
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.
- checksums.yaml +8 -8
- data/creek.gemspec +1 -0
- data/lib/creek.rb +4 -0
- data/lib/creek/book.rb +4 -0
- data/lib/creek/sheet.rb +18 -6
- data/lib/creek/styles.rb +27 -0
- data/lib/creek/styles/constants.rb +44 -0
- data/lib/creek/styles/converter.rb +116 -0
- data/lib/creek/styles/style_types.rb +85 -0
- data/lib/creek/version.rb +1 -1
- data/spec/fixtures/sheets/sheet1.xml +459 -0
- data/spec/fixtures/styles/first.xml +208 -0
- data/spec/shared_string_spec.rb +1 -1
- data/spec/spec_helper.rb +3 -0
- data/spec/styles/converter_spec.rb +16 -0
- data/spec/styles/style_types_spec.rb +15 -0
- data/spec/test_spec.rb +1 -1
- metadata +31 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDQ1NWQyM2FhYjY0ZWJlYWE4ODlhY2Y2OGQ3OTM2OTBmOGRmMWJkNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
M2FlZWVjMmJkYzhhMTVkMzY5Zjg4NDZjNGRlN2NkZTBhM2ZlMDY5YQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MmNkYzY2MzIxNWVmMTgyOTAwMzM0NDNlMWIzNThlZTIyYzA0OTg1MmNlMWFm
|
10
|
+
MzU3Nzk3ZDBmOTNjY2FlNGJkYzU1YjRiZDM0MzBhNGJjYmE4ZDJlZGM0NTZl
|
11
|
+
MDk5NzM3NTI3NTRmY2U3NDgwOWFkOWMxMDM4ODI1YTg2NjM1ZmM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjU2NjNkMTU5YzM2ZTc2MDhlYjhmNDc0NjJmZGFhY2FmMTExZjgyNjIwNjgx
|
14
|
+
ZTc4MGNkOThiZGEwMzYxMGMxM2FkNDYyNGYyY2ZlOGZjYTk3NGE2ZGM1ODBl
|
15
|
+
YzdkOWJlOGRkNjU4NGY4NDY2YjRmYWUzZmEyNTdkODUyYmEyOWI=
|
data/creek.gemspec
CHANGED
@@ -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'
|
data/lib/creek.rb
CHANGED
data/lib/creek/book.rb
CHANGED
data/lib/creek/sheet.rb
CHANGED
@@ -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
|
-
|
81
|
-
|
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
|
84
|
-
cells[cell] =
|
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
|
data/lib/creek/styles.rb
ADDED
@@ -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
|
data/lib/creek/version.rb
CHANGED
@@ -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>
|
data/spec/shared_string_spec.rb
CHANGED
data/spec/spec_helper.rb
ADDED
@@ -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
|
data/spec/test_spec.rb
CHANGED
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.
|
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:
|
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.
|
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
|