xsv 0.3.11 → 0.3.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 601dc989cf2bdf62aa50002b0293a387df53bf20022fd16fb2f8885c344e9013
4
- data.tar.gz: 6afb26f05ad129280b823540cb3d0e957ab88ea01b877d1758d8c2b376d2d69a
3
+ metadata.gz: 36eeca38d2791f71dafba9b1ae6308e63b3554efd98e2949448c4715863b7616
4
+ data.tar.gz: cf90d5ff1def79ee8b17877523a5e8233b7c5253801c98eb0e725724a6e3f48d
5
5
  SHA512:
6
- metadata.gz: 1e946848856a07d1b95fa22f9f97b22fa4bc9fcb7d6b5985b9ff7a9e2ec4e8dc42f74964ec6c2872f22c80773c7f5ca2188e857af32f1f51345d7feebf77047c
7
- data.tar.gz: f1ff12b091a4fcd8172064ea6f215011bc43e95bd5dcec586d189b72eb0ef0662eaf48b85ac7794ba82a27d824d61459025ed676a4e7b729be7e71f957cc48bd
6
+ metadata.gz: cc203883d561d86a51eb35c11f4c4547929605387a43d38c16eb48f975a2da1ea332c7cbb4aab21e4760424ceb015de2e4d50aeeddd9bf595ccd3bf1f363ac63
7
+ data.tar.gz: b91d7d210c6894c17bfbb2b40dd0c243f2c5228f35c780f8e5d8afba9367303d2df1897ae734bec636f8eab615cda7188d63e63b270b3f543fafc39d91d1aa7e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Xsv Changelog
2
2
 
3
+ ## 0.3.12 - 2020-04-15
4
+
5
+ - Accessing worksheets by name (texpert)
6
+
3
7
  ## 0.3.11 - 2020-04-03
4
8
 
5
9
  - Backward compatibility with Ruby 2.5 (texpert)
data/README.md CHANGED
@@ -83,6 +83,22 @@ columns with the same name!
83
83
  `Xsv::Sheet` implements `Enumerable` so you can call methods like `#first`,
84
84
  `#filter`/`#select` and `#map` on it.
85
85
 
86
+ The sheets could be accessed by index or by name:
87
+
88
+ ```ruby
89
+ x = Xsv::Workbook.open("sheet.xlsx")
90
+
91
+ sheet = x.sheets[0] # gets sheet by index
92
+
93
+ sheet = x.sheets_by_name('Name').first # gets sheet by name
94
+ ```
95
+
96
+ To get all the workbook's sheets names:
97
+
98
+ ```ruby
99
+ sheet_names = x.sheets.map(&:name)
100
+ ```
101
+
86
102
  ### Assumptions
87
103
 
88
104
  Since Xsv treats worksheets like csv files it makes certain assumptions about your
data/lib/xsv.rb CHANGED
@@ -3,10 +3,12 @@ require "date"
3
3
  require "ox"
4
4
 
5
5
  require "xsv/helpers"
6
+ require "xsv/relationships_handler"
6
7
  require "xsv/shared_strings_parser"
7
8
  require "xsv/sheet"
8
9
  require "xsv/sheet_bounds_handler"
9
10
  require "xsv/sheet_rows_handler"
11
+ require 'xsv/sheets_ids_handler'
10
12
  require "xsv/styles_handler"
11
13
  require "xsv/version"
12
14
  require "xsv/workbook"
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ module Xsv
3
+ # RelationshipsHandler parses the "xl/_rels/workbook.xml.rels" file to get the existing relationships.
4
+ # This is used internally when opening a workbook.
5
+ class RelationshipsHandler < Ox::Sax
6
+ def self.get_relations(io)
7
+ relations = []
8
+ handler = new do |relation|
9
+ relations << relation
10
+ end
11
+
12
+ Ox.sax_parse(handler, io.read)
13
+ return relations
14
+ end
15
+
16
+ # Ox::Sax implementation
17
+
18
+ def initialize(&block)
19
+ @block = block
20
+ end
21
+
22
+ def start_element(name)
23
+ @relationship = {} if name == :Relationship
24
+ end
25
+
26
+ def attr(name, value)
27
+ case name
28
+ when :Id, :Type, :Target
29
+ @relationship[name] = value
30
+ end
31
+ end
32
+
33
+ def end_element(name)
34
+ return unless name == :Relationship
35
+
36
+ @block.call(@relationship)
37
+ end
38
+ end
39
+ end
data/lib/xsv/sheet.rb CHANGED
@@ -17,7 +17,7 @@ module Xsv
17
17
 
18
18
  # Returns the current mode. Call {#parse_headers!} to switch to `:hash` mode
19
19
  # @return [Symbol] `:hash` or `:array`
20
- attr_reader :mode
20
+ attr_reader :id, :mode, :name
21
21
 
22
22
  # Set a number of rows to skip at the top of the sheet (header row offset).
23
23
  # For hash mode, do not skip the header row as this will be automatically
@@ -30,9 +30,11 @@ module Xsv
30
30
  # @param workbook [Workbook] The Workbook with shared data such as shared strings and styles
31
31
  # @param io [IO] A handle to an open worksheet XML file
32
32
  # @param size [Number] size of the XML file
33
- def initialize(workbook, io, size)
33
+ def initialize(workbook, io, size, ids)
34
34
  @workbook = workbook
35
+ @id = ids[:sheetId].to_i
35
36
  @io = io
37
+ @name = ids[:name]
36
38
  @size = size
37
39
  @headers = []
38
40
  @mode = :array
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+ module Xsv
3
+ # SheetsIdsHandler interprets the relevant parts of workbook.xml
4
+ # This is used internally to get the sheets ids, relationship_ids, and names when opening a workbook.
5
+ class SheetsIdsHandler < Ox::Sax
6
+ def self.get_sheets_ids(io)
7
+ sheets_ids = []
8
+ handler = new do |sheet_ids|
9
+ sheets_ids << sheet_ids
10
+ end
11
+
12
+ Ox.sax_parse(handler, io.read)
13
+ return sheets_ids
14
+ end
15
+
16
+ # Ox::Sax implementation
17
+
18
+ def initialize(&block)
19
+ @block = block
20
+ end
21
+
22
+ def start_element(name)
23
+ return @parsing = true if name == :sheets
24
+
25
+ return unless name == :sheet
26
+
27
+ @sheet_ids = {}
28
+ end
29
+
30
+ def attr(name, value)
31
+ return unless @parsing
32
+
33
+ case name
34
+ when :name, :sheetId
35
+ @sheet_ids[name] = value
36
+ when :'r:id'
37
+ @sheet_ids[:r_id] = value
38
+ end
39
+ end
40
+
41
+ def end_element(name)
42
+ return @parsing = false if name == :sheets
43
+
44
+ return unless name == :sheet
45
+
46
+ @block.call(@sheet_ids)
47
+ end
48
+ end
49
+ end
data/lib/xsv/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Xsv
3
- VERSION = "0.3.11"
3
+ VERSION = "0.3.12"
4
4
  end
data/lib/xsv/workbook.rb CHANGED
@@ -41,6 +41,8 @@ module Xsv
41
41
 
42
42
  fetch_shared_strings
43
43
  fetch_styles
44
+ fetch_sheets_ids
45
+ fetch_relationships
44
46
  fetch_sheets
45
47
  end
46
48
 
@@ -56,11 +58,20 @@ module Xsv
56
58
  @sheets = nil
57
59
  @xfs = nil
58
60
  @numFmts = nil
61
+ @relationships = nil
59
62
  @shared_strings = nil
63
+ @sheets_ids = nil
60
64
 
61
65
  true
62
66
  end
63
67
 
68
+ # Returns an array of sheets for the case of same name sheets.
69
+ # @param [String] name
70
+ # @return [Array<Xsv::Sheet>]
71
+ def sheets_by_name(name)
72
+ @sheets.select { |s| s.name == name }
73
+ end
74
+
64
75
  private
65
76
 
66
77
  def fetch_shared_strings
@@ -80,8 +91,24 @@ module Xsv
80
91
  @zip.glob("xl/worksheets/sheet*.xml").sort do |a, b|
81
92
  a.name[/\d+/].to_i <=> b.name[/\d+/].to_i
82
93
  end.each do |entry|
83
- @sheets << Xsv::Sheet.new(self, entry.get_input_stream, entry.size)
94
+ rel = @relationships.detect { |r| entry.name.end_with?(r[:Target]) && r[:Type].end_with?('worksheet') }
95
+ sheet_ids = @sheets_ids.detect { |i| i[:r_id] == rel[:Id] }
96
+ @sheets << Xsv::Sheet.new(self, entry.get_input_stream, entry.size, sheet_ids)
84
97
  end
85
98
  end
99
+
100
+ def fetch_sheets_ids
101
+ stream = @zip.glob("xl/workbook.xml").first.get_input_stream
102
+ @sheets_ids = SheetsIdsHandler.get_sheets_ids(stream)
103
+
104
+ stream.close
105
+ end
106
+
107
+ def fetch_relationships
108
+ stream = @zip.glob("xl/_rels/workbook.xml.rels").first.get_input_stream
109
+ @relationships = RelationshipsHandler.get_relations(stream)
110
+
111
+ stream.close
112
+ end
86
113
  end
87
114
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xsv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.11
4
+ version: 0.3.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martijn Storck
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-03 00:00:00.000000000 Z
11
+ date: 2020-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -108,10 +108,12 @@ files:
108
108
  - bin/setup
109
109
  - lib/xsv.rb
110
110
  - lib/xsv/helpers.rb
111
+ - lib/xsv/relationships_handler.rb
111
112
  - lib/xsv/shared_strings_parser.rb
112
113
  - lib/xsv/sheet.rb
113
114
  - lib/xsv/sheet_bounds_handler.rb
114
115
  - lib/xsv/sheet_rows_handler.rb
116
+ - lib/xsv/sheets_ids_handler.rb
115
117
  - lib/xsv/styles_handler.rb
116
118
  - lib/xsv/version.rb
117
119
  - lib/xsv/workbook.rb