rxl 0.3.0 → 0.4.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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile +1 -1
- data/README.md +70 -35
- data/lib/cell.rb +28 -5
- data/lib/rxl.rb +4 -7
- data/lib/rxl/version.rb +1 -1
- data/lib/workbook.rb +5 -1
- data/lib/worksheet.rb +20 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62aee75c921b3b6e206dadf145c6421d3bf193c24eadb6f42c9905b4c1f27c4b
|
4
|
+
data.tar.gz: a95171c0ebbc1242621af4f2aff4b1157e66c6d0fe601eb44bc8ae83f4e6e34c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3ef588d022f83c7f2cb9042521bd2e20699012fcb9155115a07900a7b9367be30fee4a7cf7815da41f18eff3486b4a6492b7ec6cc15f68dbc25c5ba0a87f647
|
7
|
+
data.tar.gz: f50bc7833adc83c12bd227c404841a45d9aa0eb553c673da144124dde780610cc713f2baf33aca4cf415d771a750e5a07db2f15136a8f21523a4a14d8457c076
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -132,8 +132,6 @@ Returns the files with sheet contents populated with hash of cells (or array of
|
|
132
132
|
|
133
133
|
### Write to file
|
134
134
|
|
135
|
-
Any exception is swallowed and returned.
|
136
|
-
|
137
135
|
To write a file pass the filename and hash:
|
138
136
|
|
139
137
|
```ruby
|
@@ -152,39 +150,6 @@ The format of the excel hash_workbook has sheet names as keys and hashes of cell
|
|
152
150
|
}
|
153
151
|
```
|
154
152
|
|
155
|
-
### Write to file as tables
|
156
|
-
|
157
|
-
Any exception is swallowed and returned.
|
158
|
-
|
159
|
-
To write a file as pass the filename and hash:
|
160
|
-
|
161
|
-
```ruby
|
162
|
-
Rxl.write_file_as_tables('path/to/save.xlsx', hash_tables, order)
|
163
|
-
```
|
164
|
-
|
165
|
-
The worsheets' top row will be populated with values specified in the `order` array. Those array items will also be used to extract the current row from the current hash.
|
166
|
-
|
167
|
-
* use `nil` in the `order` array to leave blank columns (including blank header)
|
168
|
-
* string or symbol keys can be used, so long as the key in order is the same as in the hashes
|
169
|
-
|
170
|
-
The format of the excel hash_workbook has sheet names as keys and hashes of rows as values:
|
171
|
-
|
172
|
-
```ruby
|
173
|
-
order = %i[header_a header_b]
|
174
|
-
hash_tables = {
|
175
|
-
'Sheet1' => [
|
176
|
-
{
|
177
|
-
header_a: 'some_value',
|
178
|
-
header_b: 'other_value'
|
179
|
-
},
|
180
|
-
{
|
181
|
-
header_a: 'some_value',
|
182
|
-
header_b: 'other_value'
|
183
|
-
}
|
184
|
-
]
|
185
|
-
}
|
186
|
-
```
|
187
|
-
|
188
153
|
#### Cell specification
|
189
154
|
|
190
155
|
All cells are written with the format set to general except those with a number format specified
|
@@ -233,6 +198,76 @@ Other keys can be specified:
|
|
233
198
|
|
234
199
|
TODO: add full description for hash_cell_to_rubyxl_cell and rubyxl_cell_to_hash_cell (and check they're as consistent as possible)
|
235
200
|
|
201
|
+
### Write to file as tables
|
202
|
+
|
203
|
+
To write a file as pass the filename and hash:
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
Rxl.write_file_as_tables('path/to/save.xlsx', hash_tables, order)
|
207
|
+
```
|
208
|
+
|
209
|
+
The worksheets' top row will be populated with values specified in the `order` array. Those array items will also be used to extract the current row from the current hash.
|
210
|
+
|
211
|
+
* use `nil` in the `order` array to leave blank columns (including blank header)
|
212
|
+
* string or symbol keys can be used, so long as the key in order is the same as in the hashes
|
213
|
+
|
214
|
+
The format of the excel hash_workbook has sheet names as keys and hashes of rows as values:
|
215
|
+
|
216
|
+
```ruby
|
217
|
+
order = %i[header_a header_b]
|
218
|
+
hash_tables = {
|
219
|
+
'Sheet1' => [
|
220
|
+
{
|
221
|
+
header_a: 'some_value',
|
222
|
+
header_b: 'other_value'
|
223
|
+
},
|
224
|
+
{
|
225
|
+
header_a: 'some_value',
|
226
|
+
header_b: 'other_value'
|
227
|
+
}
|
228
|
+
]
|
229
|
+
}
|
230
|
+
```
|
231
|
+
|
232
|
+
#### Formatting for tables
|
233
|
+
|
234
|
+
Add formatting to tables by adding a `:formats` key to the top level hash.
|
235
|
+
|
236
|
+
Inside the formatting hash add child hashes with keys for the relevant table.
|
237
|
+
|
238
|
+
Within the table add hashes for each column with the key as the column letter and the value as a cell hash (excluding `:value`).
|
239
|
+
|
240
|
+
Formatting for rows is not currently implemented.
|
241
|
+
|
242
|
+
Additionally inside the table hash add a key `:headers` with a cell hash (excluding `:value`) to set formatting for the header row.
|
243
|
+
|
244
|
+
```ruby
|
245
|
+
order = %i[header_a header_b]
|
246
|
+
hash_tables = {
|
247
|
+
formats: {
|
248
|
+
'Sheet1' => {
|
249
|
+
headers: {
|
250
|
+
bold: true,
|
251
|
+
align: 'center'
|
252
|
+
},
|
253
|
+
'B' => {
|
254
|
+
fill: 'feb302'
|
255
|
+
}
|
256
|
+
}
|
257
|
+
},
|
258
|
+
'Sheet1' => [
|
259
|
+
{
|
260
|
+
'col_1' => 'some_value',
|
261
|
+
'col_2' => 'other_value'
|
262
|
+
},
|
263
|
+
{
|
264
|
+
'col_1' => 'some_value',
|
265
|
+
'col_2' => 'other_value'
|
266
|
+
}
|
267
|
+
]
|
268
|
+
}
|
269
|
+
```
|
270
|
+
|
236
271
|
## Development
|
237
272
|
|
238
273
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/cell.rb
CHANGED
@@ -8,12 +8,27 @@ module Cell
|
|
8
8
|
|
9
9
|
def self.rubyxl_cell_to_hash_cell(rubyxl_cell = nil)
|
10
10
|
rubyxl_cell_value = rubyxl_cell.nil? ? RubyXL::Cell.new.value : rubyxl_cell.value
|
11
|
-
{
|
11
|
+
values = {
|
12
12
|
value: rubyxl_cell_value,
|
13
13
|
format: hash_cell_format(rubyxl_cell_value),
|
14
14
|
formula: rubyxl_cell_formula(rubyxl_cell),
|
15
15
|
h_align: rubyxl_cell_horizontal_alignment(rubyxl_cell),
|
16
|
-
v_align: rubyxl_cell_vertical_alignment(rubyxl_cell)
|
16
|
+
v_align: rubyxl_cell_vertical_alignment(rubyxl_cell),
|
17
|
+
bold: rubyxl_cell.is_bolded,
|
18
|
+
fill: rubyxl_cell.fill_color,
|
19
|
+
font_name: rubyxl_cell.font_name,
|
20
|
+
font_size: rubyxl_cell.font_size.to_i,
|
21
|
+
border: rubyxl_cell_to_border_hash(rubyxl_cell)
|
22
|
+
}
|
23
|
+
return values
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.rubyxl_cell_to_border_hash(rubyxl_cell)
|
27
|
+
{
|
28
|
+
top: rubyxl_cell.get_border(:top),
|
29
|
+
bottom: rubyxl_cell.get_border(:bottom),
|
30
|
+
left: rubyxl_cell.get_border(:left),
|
31
|
+
right: rubyxl_cell.get_border(:right)
|
17
32
|
}
|
18
33
|
end
|
19
34
|
|
@@ -57,7 +72,7 @@ module Cell
|
|
57
72
|
rubyxl_worksheet[row_index][column_index].change_font_name(combined_hash_cell[:font_style]) if combined_hash_cell[:font_style]
|
58
73
|
rubyxl_worksheet[row_index][column_index].change_font_size(combined_hash_cell[:font_size]) if combined_hash_cell[:font_size]
|
59
74
|
rubyxl_worksheet[row_index][column_index].change_fill(combined_hash_cell[:fill]) if combined_hash_cell[:fill]
|
60
|
-
rubyxl_worksheet[row_index][column_index].change_horizontal_alignment(combined_hash_cell[:
|
75
|
+
rubyxl_worksheet[row_index][column_index].change_horizontal_alignment(combined_hash_cell[:h_align]) if combined_hash_cell[:h_align]
|
61
76
|
rubyxl_worksheet[row_index][column_index].change_font_bold(combined_hash_cell[:bold]) if combined_hash_cell[:bold]
|
62
77
|
|
63
78
|
if combined_hash_cell[:border_all]
|
@@ -91,9 +106,10 @@ module Cell
|
|
91
106
|
unless hash_cell.keys.reject { |key| key.is_a?(Symbol) }.empty?
|
92
107
|
raise("cell key at path #{trace + [hash_cell_key]} must be a Symbol")
|
93
108
|
end
|
94
|
-
|
109
|
+
invalid_keys = hash_cell.keys.delete_if { |key| valid_cell_keys.include?(key) }
|
110
|
+
unless invalid_keys.empty?
|
95
111
|
valid_cell_keys_string = ":#{valid_cell_keys.join(', :')}"
|
96
|
-
raise(%(invalid cell hash key at path #{trace + [hash_cell_key]}, valid keys are: [#{valid_cell_keys_string}]))
|
112
|
+
raise(%(invalid cell hash key(s) #{invalid_keys} at path #{trace + [hash_cell_key]}, valid keys are: [#{valid_cell_keys_string}]))
|
97
113
|
end
|
98
114
|
# TODO: add validation for hash_cell specification
|
99
115
|
end
|
@@ -112,6 +128,13 @@ module Cell
|
|
112
128
|
value
|
113
129
|
number
|
114
130
|
formula
|
131
|
+
bold
|
132
|
+
h_align
|
133
|
+
v_align
|
134
|
+
border
|
135
|
+
fill
|
136
|
+
font_name
|
137
|
+
font_size
|
115
138
|
]
|
116
139
|
end
|
117
140
|
|
data/lib/rxl.rb
CHANGED
@@ -5,18 +5,15 @@ require_relative 'workbook'
|
|
5
5
|
module Rxl
|
6
6
|
|
7
7
|
def self.write_file(filepath, hash_workbook)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
nil
|
12
|
-
rescue => e
|
13
|
-
return e
|
14
|
-
end
|
8
|
+
rubyxl_workbook = Workbook.hash_workbook_to_rubyxl_workbook(hash_workbook)
|
9
|
+
rubyxl_workbook.write(filepath)
|
10
|
+
nil
|
15
11
|
end
|
16
12
|
|
17
13
|
def self.write_file_as_tables(filepath, hash_tables, order, write_headers: true)
|
18
14
|
hash_workbook = Workbook.hashes_to_hash_workbook(hash_tables, order, write_headers: write_headers)
|
19
15
|
write_file(filepath, hash_workbook)
|
16
|
+
nil
|
20
17
|
end
|
21
18
|
|
22
19
|
def self.read_file(filepath)
|
data/lib/rxl/version.rb
CHANGED
data/lib/workbook.rb
CHANGED
@@ -28,7 +28,11 @@ module Workbook
|
|
28
28
|
|
29
29
|
def self.hashes_to_hash_workbook(hash_tables, order, write_headers: true)
|
30
30
|
hash_workbook = {}
|
31
|
-
|
31
|
+
all_formats = hash_tables.delete(:formats) || {}
|
32
|
+
hash_tables.each do |k, v|
|
33
|
+
formats = all_formats[k]
|
34
|
+
hash_workbook[k] = Worksheet.hashes_to_hash_worksheet(v, order, formats, write_headers: write_headers)
|
35
|
+
end
|
32
36
|
hash_workbook
|
33
37
|
end
|
34
38
|
|
data/lib/worksheet.rb
CHANGED
@@ -38,22 +38,37 @@ module Worksheet
|
|
38
38
|
### GET RUBYXL WORKSHEET FROM HASHES ###
|
39
39
|
################################################
|
40
40
|
|
41
|
-
def self.hashes_to_hash_worksheet(hashes, order, write_headers: true)
|
41
|
+
def self.hashes_to_hash_worksheet(hashes, order, formats, write_headers: true)
|
42
42
|
rows = hashes.map do |hash|
|
43
43
|
order.map { |item| hash[item] }
|
44
44
|
end
|
45
45
|
rows.unshift(order.map { |item| "#{item}" }) if write_headers
|
46
|
-
rows_to_hash_worksheet(rows)
|
46
|
+
hash_worksheet = rows_to_hash_worksheet(rows)
|
47
|
+
format_hash_worksheet(hash_worksheet, formats, write_headers) if formats
|
48
|
+
hash_worksheet
|
47
49
|
end
|
48
50
|
|
49
51
|
def self.rows_to_hash_worksheet(rows)
|
50
|
-
|
52
|
+
hash_worksheet = {}
|
51
53
|
rows.count.times do |i|
|
52
54
|
rows[i].each_with_index do |cell_value, index|
|
53
|
-
|
55
|
+
hash_worksheet["#{column_name(index)}#{i + 1}"] = { value: cell_value }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
hash_worksheet
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.format_hash_worksheet(hash_worksheet, formats, write_headers)
|
62
|
+
if write_headers && formats[:headers]
|
63
|
+
hash_worksheet.keys.grep(/^\D+1$/).each { |key| hash_worksheet[key].update(formats[:headers]) }
|
64
|
+
end
|
65
|
+
formats.keys.each do |col|
|
66
|
+
next if col == :header
|
67
|
+
hash_worksheet.keys.grep(/^#{col}/).each do |key|
|
68
|
+
next if write_headers && key[/^\D+1$/]
|
69
|
+
hash_worksheet[key].update(formats[col])
|
54
70
|
end
|
55
71
|
end
|
56
|
-
rxl_worksheet
|
57
72
|
end
|
58
73
|
|
59
74
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rxl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian McWilliams
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|