xlsx-DSL 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []