xlsx-DSL 0.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1cd530608ea3bf494fc7f45f2d212c154187a8c1bb8480d41dac3bec9f35622b
4
+ data.tar.gz: a4018d34d5491fdde3f193f3ad66d1357225e851ecec592b5d3aa3e0b9fc0784
5
+ SHA512:
6
+ metadata.gz: 03a727e570a0aa418c3de6a6c68f9a15edea3bc249aa4370c915a66a1977cfb099aba90fc5aaac945bad0e6d9982147ef92ee1a71638eda202de4472d472d94a
7
+ data.tar.gz: 393be7432a03610653d4b8520f3cc5edd89c35daa44900930306c4dc81654a027358079670e12b77fbc3186c09f02069ccc168d21e0002379cea36df40f5179c
@@ -0,0 +1,7 @@
1
+ module OpenXML
2
+ module SpreadsheetML
3
+ module DSL
4
+ VERSION = '0.0.0'
5
+ end
6
+ end
7
+ end
data/lib/xlsx/DSL.rb ADDED
@@ -0,0 +1,4 @@
1
+ rbs_path = File.expand_path('DSL', File.dirname(__FILE__))
2
+ for file in Dir.entries(rbs_path)
3
+ require(File.expand_path($1, rbs_path)) if /(.*)\.rb$/.match(file)
4
+ end
@@ -0,0 +1,40 @@
1
+ module OpenXML
2
+ module SpreadsheetML
3
+ @@sheets = []
4
+ @@shared_strings = nil
5
+
6
+ class << self
7
+ def open xlsx_path
8
+ Zip::File.open(xlsx_path) do |zf|
9
+ zf.each do |entry|
10
+ content = entry.get_input_stream.read
11
+ case entry.name
12
+ when %r{^xl/workbook\.xml$}i
13
+ workbook_parser content
14
+ when %r{^xl/sharedStrings\.xml$}i
15
+ shared_strings_parser content
16
+ when %r{^xl/worksheets/sheet\d*\.xml$}i
17
+ sheet_parser content
18
+ end
19
+ end
20
+ end
21
+ @@workbook.merge_sheets(@@sheets) if @@sheets
22
+ @@workbook
23
+ end
24
+
25
+ private
26
+
27
+ def workbook_parser content
28
+ @@workbook = Workbook.parser content
29
+ end
30
+
31
+ def shared_strings_parser content
32
+ $shared_strings = SharedString.parser content || []
33
+ end
34
+
35
+ def sheet_parser content
36
+ @@sheets << Sheet.parser(content)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ module OpenXML
2
+ module SpreadsheetML
3
+ class SharedString
4
+ def self.parser content
5
+ values = []
6
+ doc = Nokogiri::XML content
7
+ t_tags = doc.css('t')
8
+ t_tags.each do |t|
9
+ values << t.text
10
+ end
11
+ values
12
+ end
13
+ end
14
+ end
15
+ end
data/lib/xlsx/sheet.rb ADDED
@@ -0,0 +1,79 @@
1
+ module OpenXML
2
+ module SpreadsheetML
3
+ Sheet = Struct.new(
4
+ :dimension, :sheet_data, :merge_cells, :sheet_views,
5
+ :name, :sheetId, :rid
6
+ )
7
+ MergeCell = Struct.new(:range)
8
+
9
+ class Sheet
10
+ def + sheet
11
+ self.dimension = self.dimension || sheet.dimension
12
+ self.sheet_data = self.sheet_data || sheet.sheet_data
13
+ self.merge_cells = self.merge_cells || sheet.merge_cells
14
+ self.name = self.name || sheet.name
15
+ self.sheetId = self.sheetId || sheet.sheetId
16
+ self.rid = self.rid || sheet.rid
17
+ self
18
+ end
19
+
20
+ def [] index
21
+ self.merge_cells.each do |mc|
22
+ if mc.include?(index)
23
+ index = mc.top_left
24
+ end
25
+ end
26
+ self.sheet_data[index]
27
+ end
28
+
29
+ alias at_cell []
30
+
31
+ def self.parser content
32
+ doc = Nokogiri::XML content
33
+
34
+ # sheetData
35
+ sheet_data = {}
36
+ sheet_data_tags = doc.css('sheetData')
37
+ cell_tags = sheet_data_tags.css('c')
38
+ cell_tags.each do |cell|
39
+ t = cell[:t]
40
+ v = cell.at_css('v')
41
+ v = v.text if v
42
+ f = cell.at_css('f')
43
+ f = f.text if f
44
+ sheet_data[cell[:r]] = Cell.new(t, v, f)
45
+ end
46
+
47
+ # mergeCells
48
+ merge_cells = []
49
+ merge_cells_tags = doc.css('mergeCell')
50
+ merge_cells_tags.each do |mc|
51
+ merge_cells << MergeCell.new(mc[:ref])
52
+ end
53
+
54
+ # dimension
55
+ dimension_tag = doc.at_css('dimension')
56
+ dimension = dimension_tag[:ref]
57
+
58
+ Sheet.new(dimension, sheet_data, merge_cells)
59
+ end
60
+ end
61
+
62
+ class MergeCell
63
+ def include? index
64
+ /([A-Z]+)(\d+):([A-Z]+)(\d+)/.match(self.range)
65
+ col_span = ($1..$3)
66
+ row_span = ($2..$4)
67
+ /([A-Z]+)(\d+)/.match(index)
68
+ col = $1
69
+ row = $2
70
+ return true if col_span.include?(col) && row_span.include?(row)
71
+ false
72
+ end
73
+
74
+ def top_left
75
+ self.range.split(/:/)[0]
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,14 @@
1
+ module OpenXML
2
+ module SpreadsheetML
3
+ SheetData = Struct.new(:rows)
4
+ Row = Struct.new(:index, :columns)
5
+ Cell = Struct.new(:type, :v, :formula)
6
+
7
+ class Cell
8
+ def value
9
+ return $shared_strings[self.v.to_i] if self.type == 's'
10
+ self.v
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ module OpenXML
2
+ module SpreadsheetML
3
+ Workbook = Struct.new(
4
+ :sheets, :theme, :styles, :calc_chain,
5
+ :xml_maps
6
+ )
7
+
8
+ class Workbook
9
+ def [] index
10
+ self.sheets.each do |sheet|
11
+ return sheet if sheet.name == index
12
+ end
13
+ nil
14
+ end
15
+
16
+ def merge_sheets sheets
17
+ new_sheets = []
18
+ self.sheets.zip(sheets) do |x, y|
19
+ new_sheets << x + y
20
+ end
21
+ self.sheets = new_sheets
22
+ self
23
+ end
24
+
25
+ def self.parser content
26
+ sheets = []
27
+ doc = Nokogiri::XML content
28
+ sheet_tags = doc.css('sheet')
29
+ sheet_tags.each do |s|
30
+ sheet = Sheet.new
31
+ sheet.name = s[:name]
32
+ sheet.sheetId = s[:sheetId]
33
+ sheet.rid = s['r:id']
34
+ sheets << sheet
35
+ end
36
+ Workbook.new(sheets = sheets)
37
+ end
38
+ end
39
+ end
40
+ end
data/lib/xlsx.rb ADDED
@@ -0,0 +1,7 @@
1
+ rbs_path = File.expand_path('xlsx', File.dirname(__FILE__))
2
+ for file in Dir.entries(rbs_path)
3
+ require(File.expand_path($1, rbs_path)) if /(.*)\.rb$/.match(file)
4
+ end
5
+
6
+ require "zip"
7
+ require "nokogiri"
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xlsx-DSL
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Cyan Yan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-02-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.13.10
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.13.10
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubyzip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.3.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.3.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.12.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.12.0
55
+ description: A gem using DSL for reading&writing Excel (.xlsx).
56
+ email: cyan_cg@outlook.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/xlsx.rb
62
+ - lib/xlsx/DSL.rb
63
+ - lib/xlsx/DSL/version.rb
64
+ - lib/xlsx/parser.rb
65
+ - lib/xlsx/shared_string.rb
66
+ - lib/xlsx/sheet.rb
67
+ - lib/xlsx/sheet_data.rb
68
+ - lib/xlsx/workbook.rb
69
+ homepage: https://rubygems.org/gems/xlsx-DSL
70
+ licenses:
71
+ - MIT
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 3.4.6
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: Excel (.xlsx) Controller, using Ruby DSL.
92
+ test_files: []