axlsx_styler 0.1.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +23 -0
  3. data/README.md +50 -26
  4. data/Rakefile +18 -4
  5. data/lib/axlsx_styler.rb +4 -23
  6. data/lib/axlsx_styler/axlsx_cell.rb +32 -30
  7. data/lib/axlsx_styler/axlsx_package.rb +17 -0
  8. data/lib/axlsx_styler/axlsx_styles.rb +36 -0
  9. data/lib/axlsx_styler/axlsx_workbook.rb +26 -43
  10. data/lib/axlsx_styler/axlsx_worksheet.rb +34 -17
  11. data/lib/axlsx_styler/version.rb +1 -1
  12. data/test/dummy_app/Rakefile +7 -0
  13. data/test/dummy_app/app/assets/config/manifest.js +3 -0
  14. data/test/dummy_app/app/assets/javascripts/application.js +0 -0
  15. data/test/dummy_app/app/assets/stylesheets/application.css +3 -0
  16. data/test/dummy_app/app/controllers/application_controller.rb +3 -0
  17. data/test/dummy_app/app/controllers/spreadsheets_controller.rb +7 -0
  18. data/test/dummy_app/app/models/application_record.rb +3 -0
  19. data/test/dummy_app/app/views/layouts/application.html.erb +14 -0
  20. data/{examples/colors_and_borders.rb → test/dummy_app/app/views/spreadsheets/test.xlsx.axlsx} +2 -7
  21. data/test/dummy_app/config.ru +4 -0
  22. data/test/dummy_app/config/application.rb +56 -0
  23. data/test/dummy_app/config/boot.rb +10 -0
  24. data/test/dummy_app/config/database.yml +25 -0
  25. data/test/dummy_app/config/environment.rb +5 -0
  26. data/test/dummy_app/config/environments/development.rb +30 -0
  27. data/test/dummy_app/config/environments/production.rb +60 -0
  28. data/test/dummy_app/config/environments/test.rb +41 -0
  29. data/test/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  30. data/test/dummy_app/config/initializers/inflections.rb +10 -0
  31. data/test/dummy_app/config/initializers/mime_types.rb +5 -0
  32. data/test/dummy_app/config/initializers/secret_token.rb +11 -0
  33. data/test/dummy_app/config/initializers/session_store.rb +8 -0
  34. data/test/dummy_app/config/initializers/wrap_parameters.rb +14 -0
  35. data/test/dummy_app/config/locales/en.yml +5 -0
  36. data/test/dummy_app/config/routes.rb +3 -0
  37. data/test/dummy_app/config/secrets.yml +22 -0
  38. data/test/dummy_app/db/schema.rb +15 -0
  39. data/test/dummy_app/db/test.sqlite3 +0 -0
  40. data/test/dummy_app/log/test.log +1004 -0
  41. data/test/helper_methods.rb +12 -0
  42. data/test/integration/application_test.rb +18 -0
  43. data/test/test_helper.rb +31 -4
  44. data/test/unit/borders_test.rb +127 -0
  45. data/test/unit/examples_test.rb +20 -0
  46. data/test/unit/merge_styles_test.rb +56 -0
  47. data/test/unit/regresssions_test.rb +44 -0
  48. data/test/unit/serialize_test.rb +34 -0
  49. data/test/unit/to_stream_test.rb +34 -0
  50. metadata +152 -47
  51. data/.gitignore +0 -24
  52. data/Gemfile +0 -4
  53. data/axlsx_styler.gemspec +0 -36
  54. data/examples/vanilla_axlsx.md +0 -70
  55. data/spreadsheet.png +0 -0
  56. data/test/cell_test.rb +0 -14
  57. data/test/integration_test.rb +0 -234
  58. data/test/workbook_test.rb +0 -10
data/.gitignore DELETED
@@ -1,24 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- *.bundle
19
- *.so
20
- *.o
21
- *.a
22
- mkmf.log
23
- *.xlsx
24
- *.xlsx#
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in axlsx_styler.gemspec
4
- gemspec
@@ -1,36 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'axlsx_styler/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = 'axlsx_styler'
8
- spec.version = AxlsxStyler::VERSION
9
- spec.authors = ['Anton Sakovich']
10
- spec.email = ['sakovias@gmail.com']
11
- spec.summary = %q(This gem allows to separate data from styles when using Axlsx gem.)
12
- spec.description = %q(
13
- Axlsx gem is an excellent tool to build Excel worksheets. The sheets are
14
- created row-by-row and styles are immediately added to each cell when a
15
- row is created. This gem allows to follow an alternative route: fill out
16
- a spreadsheet with data and apply styles later. Styles can be added
17
- to individual cells as well as to ranges of cells. As a bonus, this gem
18
- also simplifies drawing borders around groups of cells.
19
- )
20
- spec.homepage = 'https://github.com/sakovias/axlsx_styler'
21
- spec.license = 'MIT'
22
-
23
- spec.files = `git ls-files -z`.split("\x0")
24
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
26
- spec.require_paths = ['lib']
27
- spec.required_ruby_version = '>= 1.9.3'
28
-
29
- spec.add_dependency 'axlsx', '~> 2.0'
30
- spec.add_dependency 'activesupport', '>= 3.1'
31
-
32
- spec.add_development_dependency 'bundler', '~> 1.6'
33
- spec.add_development_dependency 'rake', '~> 0.9'
34
- spec.add_development_dependency 'minitest', '~> 5.0'
35
- spec.add_development_dependency 'awesome_print', '~> 1.6'
36
- end
@@ -1,70 +0,0 @@
1
- This gem is supposed to make styling spreadsheets easier.
2
-
3
- Here's how the [example from the README](../README.md) compares to that implemented with plain `axlsx`.
4
-
5
- ```ruby
6
- require 'axlsx'
7
- axlsx = Axlsx::Package.new
8
- wb = axlsx.workbook
9
- border_color = '000000'
10
- wb.add_worksheet do |sheet|
11
- # top row
12
- header_hash = { b: true, bg_color: '95AFBA' }
13
- top_left_corner = wb.styles.add_style header_hash.merge({
14
- border: { style: :thin, color: border_color, edges: [:top, :left, :bottom] }
15
- })
16
- top_edge = wb.styles.add_style header_hash.merge({
17
- border: { style: :thin, color: border_color, edges: [:top, :bottom] }
18
- })
19
- top_right_corner = wb.styles.add_style header_hash.merge({
20
- border: { style: :thin, color: border_color, edges: [:top, :right, :bottom] }
21
- })
22
- sheet.add_row
23
- sheet.add_row(["", "Product", "Category", "Price"],
24
- style: [ nil, top_left_corner, top_edge, top_right_corner ]
25
- )
26
-
27
- # middle rows
28
- color_hash = { bg_color: 'E2F89C' }
29
- left_edge = wb.styles.add_style color_hash.merge(
30
- b: true,
31
- border: {
32
- style: :thin, color: border_color, edges: [:left]
33
- }
34
- )
35
- inner = wb.styles.add_style color_hash
36
- right_edge = wb.styles.add_style color_hash.merge(
37
- alignment: { horizontal: :left },
38
- border: {
39
- style: :thin, color: border_color, edges: [:right]
40
- }
41
- )
42
- sheet.add_row(
43
- ["", "Butter", "Dairy", 4.99],
44
- style: [nil, left_edge, inner, right_edge]
45
- )
46
- sheet.add_row(
47
- ["", "Bread", "Baked Goods", 3.45],
48
- style: [nil, left_edge, inner, right_edge]
49
- )
50
-
51
- # last row
52
- bottom_left_corner = wb.styles.add_style color_hash.merge({
53
- b: true,
54
- border: { style: :thin, color: border_color, edges: [:left, :bottom] }
55
- })
56
- bottom_edge = wb.styles.add_style color_hash.merge({
57
- border: { style: :thin, color: border_color, edges: [:bottom] }
58
- })
59
- bottom_right_corner = wb.styles.add_style color_hash.merge({
60
- alignment: { horizontal: :left },
61
- border: { style: :thin, color: border_color, edges: [:right, :bottom] }
62
- })
63
- sheet.add_row(["", "Broccoli", "Produce", 2.99],
64
- style: [nil, bottom_left_corner, bottom_edge, bottom_right_corner]
65
- )
66
-
67
- sheet.column_widths 5, 20, 20, 20
68
- end
69
- axlsx.serialize "grocery.xlsx"
70
- ```
Binary file
@@ -1,14 +0,0 @@
1
- require 'test_helper'
2
-
3
- class CellTest < MiniTest::Test
4
- def test_can_add_style
5
- p = Axlsx::Package.new
6
- wb = p.workbook
7
- sheet = wb.add_worksheet
8
- row = sheet.add_row ["x", "y"]
9
- cell = row.cells.first
10
-
11
- cell.add_style b: true
12
- assert_equal({ b: true }, cell.raw_style)
13
- end
14
- end
@@ -1,234 +0,0 @@
1
- require 'test_helper'
2
-
3
- class IntegrationTest < MiniTest::Test
4
- def setup
5
- @axlsx = Axlsx::Package.new
6
- @workbook = @axlsx.workbook
7
- end
8
-
9
- # Save to a file using Axlsx::Package#serialize
10
- def serialize(filename)
11
- @axlsx.serialize File.expand_path("../../tmp/#{filename}.xlsx", __FILE__)
12
- assert_equal true, @workbook.styles_applied
13
- end
14
-
15
- # Save to a file by getting contents from stream
16
- def to_stream(filename)
17
- File.open(File.expand_path("../../tmp/#{filename}.xlsx", __FILE__), 'w') do |f|
18
- f.write @axlsx.to_stream.read
19
- end
20
- end
21
-
22
- # New functionality as of 0.1.5 (serialize)
23
- def test_works_without_apply_styles_serialize
24
- filename = 'without_apply_styles_serialize'
25
- assert_equal nil, @workbook.styles_applied
26
- @workbook.add_worksheet do |sheet|
27
- sheet.add_row ['A1', 'B1']
28
- sheet.add_style 'A1:B1', b: true
29
- end
30
- serialize(filename)
31
- assert_equal 1, @workbook.style_index.count
32
- end
33
-
34
- # New functionality as of 0.1.5 (to_stream)
35
- def test_works_without_apply_styles_to_stream
36
- filename = 'without_apply_styles_to_stream'
37
- assert_equal nil, @workbook.styles_applied
38
- @workbook.add_worksheet do |sheet|
39
- sheet.add_row ['A1', 'B1']
40
- sheet.add_style 'A1:B1', b: true
41
- end
42
- to_stream(filename)
43
- assert_equal 1, @workbook.style_index.count
44
- end
45
-
46
- # Backwards compatibility with pre 0.1.5 (serialize)
47
- def test_works_with_apply_styles_serialize
48
- filename = 'with_apply_styles_serialize'
49
- assert_equal nil, @workbook.styles_applied
50
- @workbook.add_worksheet do |sheet|
51
- sheet.add_row ['A1', 'B1']
52
- sheet.add_style 'A1:B1', b: true
53
- end
54
- @workbook.apply_styles # important for backwards compatibility
55
- assert_equal 1, @workbook.style_index.count
56
- serialize(filename)
57
- end
58
-
59
- # Backwards compatibility with pre 0.1.5 (to_stream)
60
- def test_works_with_apply_styles_to_stream
61
- filename = 'with_apply_styles_to_stream'
62
- assert_equal nil, @workbook.styles_applied
63
- @workbook.add_worksheet do |sheet|
64
- sheet.add_row ['A1', 'B1']
65
- sheet.add_style 'A1:B1', b: true
66
- end
67
- @workbook.apply_styles # important for backwards compatibility
68
- assert_equal 1, @workbook.style_index.count
69
- to_stream(filename)
70
- end
71
-
72
- def test_table_with_borders
73
- filename = 'borders_test'
74
- @workbook.add_worksheet do |sheet|
75
- sheet.add_row
76
- sheet.add_row ['', 'Product', 'Category', 'Price']
77
- sheet.add_row ['', 'Butter', 'Dairy', 4.99]
78
- sheet.add_row ['', 'Bread', 'Baked Goods', 3.45]
79
- sheet.add_row ['', 'Broccoli', 'Produce', 2.99]
80
- sheet.add_row ['', 'Pizza', 'Frozen Foods', 4.99]
81
- sheet.column_widths 5, 20, 20, 20
82
-
83
- sheet.add_style 'B2:D2', b: true
84
- sheet.add_style 'B2:B6', b: true
85
- sheet.add_style 'B2:D2', bg_color: '95AFBA'
86
- sheet.add_style 'B3:D6', bg_color: 'E2F89C'
87
- sheet.add_style 'D3:D6', alignment: { horizontal: :left }
88
- sheet.add_border 'B2:D6'
89
- sheet.add_border 'B3:D3', [:top]
90
- sheet.add_border 'B3:D3', edges: [:bottom], style: :medium
91
- sheet.add_border 'B3:D3', edges: [:bottom], style: :medium, color: '32f332'
92
- end
93
- serialize(filename)
94
- assert_equal 12, @workbook.style_index.count
95
- assert_equal 12 + 2, @workbook.style_index.keys.max
96
- end
97
-
98
- def test_duplicate_borders
99
- filename = 'duplicate_borders_test'
100
- @workbook.add_worksheet do |sheet|
101
- sheet.add_row
102
- sheet.add_row ['', 'B2', 'C2', 'D2']
103
- sheet.add_row ['', 'B3', 'C3', 'D3']
104
- sheet.add_row ['', 'B4', 'C4', 'D4']
105
-
106
- sheet.add_border 'B2:D4'
107
- sheet.add_border 'B2:D4'
108
- end
109
- serialize(filename)
110
- assert_equal 8, @workbook.style_index.count
111
- assert_equal 8, @workbook.styled_cells.count
112
- end
113
-
114
- def test_multiple_style_borders_on_same_sells
115
- filename = 'multiple_style_borders'
116
- @workbook.add_worksheet do |sheet|
117
- sheet.add_row
118
- sheet.add_row ['', 'B2', 'C2', 'D2']
119
- sheet.add_row ['', 'B3', 'C3', 'D3']
120
-
121
- sheet.add_border 'B2:D3', :all
122
- sheet.add_border 'B2:D2', edges: [:bottom], style: :thick, color: 'ff0000'
123
- end
124
- serialize(filename)
125
- assert_equal 6, @workbook.style_index.count
126
- assert_equal 6, @workbook.styled_cells.count
127
-
128
- b2_cell_style = {
129
- border: {
130
- style: :thick,
131
- color: 'ff0000',
132
- edges: [:bottom, :left, :top]
133
- }
134
- }
135
- assert_equal b2_cell_style, @workbook.style_index
136
- .find { |_, v| v[:border][:edges] == [:bottom, :left, :top] }[1]
137
-
138
- d3_cell_style = {
139
- border: {
140
- style: :thin,
141
- color: '000000',
142
- edges: [:bottom, :right]
143
- }
144
- }
145
- assert_equal d3_cell_style, @workbook.style_index
146
- .find { |_, v| v[:border][:edges] == [:bottom, :right] }[1]
147
- end
148
-
149
- def test_table_with_num_fmt
150
- filename = 'num_fmt_test'
151
- t = Time.now
152
- day = 24 * 60 * 60
153
- @workbook.add_worksheet do |sheet|
154
- sheet.add_row %w(Date Count Percent)
155
- sheet.add_row [t - 2 * day, 2, 2.to_f.round(2) / 11]
156
- sheet.add_row [t - 1 * day, 3, 3.to_f.round(2) / 11]
157
- sheet.add_row [t, 6, 6.to_f.round(2) / 11]
158
-
159
- sheet.add_style 'A1:B1', b: true
160
- sheet.add_style 'A2:A4', format_code: 'YYYY-MM-DD hh:mm:ss'
161
- end
162
- serialize(filename)
163
- assert_equal 2, @workbook.style_index.count
164
- assert_equal 2 + 2, @workbook.style_index.keys.max
165
- assert_equal 5, @workbook.styled_cells.count
166
- end
167
-
168
- def test_duplicate_styles
169
- filename = 'duplicate_styles'
170
- @workbook.add_worksheet do |sheet|
171
- sheet.add_row %w(Index City)
172
- sheet.add_row [1, 'Ottawa']
173
- sheet.add_row [2, 'Boston']
174
-
175
- sheet.add_border 'A1:B1', [:bottom]
176
- sheet.add_border 'A1:B1', [:bottom]
177
- sheet.add_style 'A1:A3', b: true
178
- sheet.add_style 'A1:A3', b: true
179
- end
180
- serialize(filename)
181
- assert_equal 4, @workbook.styled_cells.count
182
- assert_equal 3, @workbook.style_index.count
183
- end
184
-
185
- def test_multiple_named_styles
186
- filename = 'multiple_named_styles'
187
- bold_blue = { b: true, fg_color: '0000FF' }
188
- large = { sz: 16 }
189
- red = { fg_color: 'FF0000' }
190
- @workbook.add_worksheet do |sheet|
191
- sheet.add_row %w(Index City)
192
- sheet.add_row [1, 'Ottawa']
193
- sheet.add_row [2, 'Boston']
194
-
195
- sheet.add_style 'A1:B1', bold_blue, large
196
- sheet.add_style 'A1:A3', red
197
- end
198
- serialize(filename)
199
- assert_equal 4, @workbook.styled_cells.count
200
- assert_equal 3, @workbook.style_index.count
201
- end
202
-
203
- # Overriding borders (part 1)
204
- def test_mixed_borders_1
205
- @filename = 'mixed_borders_1'
206
- @workbook.add_worksheet do |sheet|
207
- sheet.add_row
208
- sheet.add_row ['', '1', '2', '3']
209
- sheet.add_row ['', '4', '5', '6']
210
- sheet.add_row ['', '7', '8', '9']
211
- sheet.add_style 'B2:D4', border: { style: :thin, color: '000000' }
212
- sheet.add_border 'C3:D4', style: :medium
213
- end
214
- @workbook.apply_styles
215
- assert_equal 9, @workbook.styled_cells.count
216
- assert_equal 2, @workbook.style_index.count
217
- end
218
-
219
- # Overriding borders (part 2)
220
- def test_mixed_borders
221
- @filename = 'mixed_borders_2'
222
- @workbook.add_worksheet do |sheet|
223
- sheet.add_row
224
- sheet.add_row ['', '1', '2', '3']
225
- sheet.add_row ['', '4', '5', '6']
226
- sheet.add_row ['', '7', '8', '9']
227
- sheet.add_border 'B2:D4', style: :medium
228
- sheet.add_style 'D2:D4', border: { style: :thin, color: '000000' }
229
- end
230
- @workbook.apply_styles
231
- assert_equal 8, @workbook.styled_cells.count
232
- assert_equal 6, @workbook.style_index.count
233
- end
234
- end
@@ -1,10 +0,0 @@
1
- class WorkbookTest < MiniTest::Test
2
- def test_adding_styled_cells
3
- p = Axlsx::Package.new
4
- wb = p.workbook
5
- wb.add_styled_cell 'Cell 1'
6
- wb.add_styled_cell 'Cell 2'
7
- assert_equal ['Cell 1', 'Cell 2'].to_set, wb.styled_cells
8
- assert_equal nil, wb.styles_applied
9
- end
10
- end