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 +7 -0
- data/lib/xlsx/DSL/version.rb +7 -0
- data/lib/xlsx/DSL.rb +4 -0
- data/lib/xlsx/parser.rb +40 -0
- data/lib/xlsx/shared_string.rb +15 -0
- data/lib/xlsx/sheet.rb +79 -0
- data/lib/xlsx/sheet_data.rb +14 -0
- data/lib/xlsx/workbook.rb +40 -0
- data/lib/xlsx.rb +7 -0
- metadata +92 -0
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
|
data/lib/xlsx/DSL.rb
ADDED
data/lib/xlsx/parser.rb
ADDED
@@ -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
|
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
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: []
|