axlsx 1.3.4 → 1.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/README.md +27 -5
  2. data/examples/example.rb +31 -9
  3. data/examples/ios_preview.rb +14 -0
  4. data/examples/pivot_table.rb +39 -0
  5. data/examples/styles.rb +4 -0
  6. data/lib/axlsx.rb +28 -0
  7. data/lib/axlsx/drawing/bar_3D_chart.rb +15 -10
  8. data/lib/axlsx/drawing/chart.rb +13 -1
  9. data/lib/axlsx/drawing/drawing.rb +12 -11
  10. data/lib/axlsx/drawing/graphic_frame.rb +6 -1
  11. data/lib/axlsx/drawing/hyperlink.rb +5 -0
  12. data/lib/axlsx/drawing/line_3D_chart.rb +3 -2
  13. data/lib/axlsx/drawing/pic.rb +6 -0
  14. data/lib/axlsx/drawing/pie_3D_chart.rb +2 -1
  15. data/lib/axlsx/drawing/scatter_chart.rb +2 -1
  16. data/lib/axlsx/package.rb +13 -0
  17. data/lib/axlsx/rels/relationship.rb +1 -0
  18. data/lib/axlsx/stylesheet/styles.rb +22 -18
  19. data/lib/axlsx/util/accessors.rb +15 -0
  20. data/lib/axlsx/util/constants.rb +25 -5
  21. data/lib/axlsx/util/validators.rb +10 -8
  22. data/lib/axlsx/version.rb +1 -1
  23. data/lib/axlsx/workbook/shared_strings_table.rb +1 -1
  24. data/lib/axlsx/workbook/workbook.rb +27 -3
  25. data/lib/axlsx/workbook/worksheet/cell.rb +26 -64
  26. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
  27. data/lib/axlsx/workbook/worksheet/col.rb +9 -2
  28. data/lib/axlsx/workbook/worksheet/pivot_table.rb +259 -0
  29. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +65 -0
  30. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
  31. data/lib/axlsx/workbook/worksheet/row.rb +10 -1
  32. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
  33. data/lib/axlsx/workbook/worksheet/worksheet.rb +55 -6
  34. data/test/benchmark.rb +1 -0
  35. data/test/drawing/tc_chart.rb +7 -0
  36. data/test/drawing/tc_graphic_frame.rb +5 -0
  37. data/test/example.xlsx +0 -0
  38. data/test/profile.rb +1 -0
  39. data/test/tc_axlsx.rb +15 -0
  40. data/test/tc_package.rb +13 -5
  41. data/test/workbook/worksheet/tc_cell.rb +5 -1
  42. data/test/workbook/worksheet/tc_pivot_table.rb +102 -0
  43. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +46 -0
  44. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
  45. data/test/workbook/worksheet/tc_worksheet.rb +45 -1
  46. metadata +23 -9
@@ -0,0 +1,46 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestPivotTableCacheDefinition < Test::Unit::TestCase
4
+ def setup
5
+ p = Axlsx::Package.new
6
+ @ws = p.workbook.add_worksheet
7
+ 5.times do
8
+ @ws << ["aa","aa","aa","aa"]
9
+ end
10
+ @pivot_table = @ws.add_pivot_table('G5:G6', 'A1:D5')
11
+ @cache_definition = @pivot_table.cache_definition
12
+ end
13
+
14
+ def test_initialization
15
+ assert(@cache_definition.is_a?(Axlsx::PivotTableCacheDefinition), "must create a pivot table cache definition")
16
+ assert_equal(@pivot_table, @cache_definition.pivot_table, 'refers back to its pivot table')
17
+ end
18
+
19
+ def test_pn
20
+ assert_equal('pivotCache/pivotCacheDefinition1.xml', @cache_definition.pn)
21
+ end
22
+
23
+ def test_rId
24
+ assert_equal('rId1', @cache_definition.rId)
25
+ end
26
+
27
+ def test_index
28
+ assert_equal(0, @cache_definition.index)
29
+ end
30
+
31
+ def test_cache_id
32
+ assert_equal(1, @cache_definition.cache_id)
33
+ end
34
+
35
+ def test_to_xml_string
36
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
37
+ doc = Nokogiri::XML(@cache_definition.to_xml_string)
38
+ errors = []
39
+ schema.validate(doc).each do |error|
40
+ errors.push error
41
+ puts error.message
42
+ end
43
+ assert(errors.empty?, "error free validation")
44
+ end
45
+
46
+ end
@@ -0,0 +1,88 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestSheetFormatPr < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @options = {
7
+ :base_col_width => 5,
8
+ :default_col_width => 7.2,
9
+ :default_row_height => 5.2,
10
+ :custom_height => true,
11
+ :zero_height => false,
12
+ :thick_top => true,
13
+ :thick_bottom => true,
14
+ :outline_level_row => 0,
15
+ :outline_level_col => 0
16
+ }
17
+ @sheet_format_pr = Axlsx::SheetFormatPr.new(@options)
18
+ end
19
+
20
+ def test_default_initialization
21
+ sheet_format_pr = Axlsx::SheetFormatPr.new
22
+ assert_equal 8, sheet_format_pr.base_col_width
23
+ assert_equal 18, sheet_format_pr.default_row_height
24
+ end
25
+
26
+ def test_initialization_with_options
27
+ @options.each do |key, value|
28
+ assert_equal value, @sheet_format_pr.instance_variable_get("@#{key}")
29
+ end
30
+ end
31
+
32
+ def test_base_col_width
33
+ assert_raise(ArgumentError) { @sheet_format_pr.base_col_width = :foo }
34
+ assert_nothing_raised { @sheet_format_pr.base_col_width = 1 }
35
+ end
36
+
37
+ def test_outline_level_row
38
+ assert_raise(ArgumentError) { @sheet_format_pr.outline_level_row = :foo }
39
+ assert_nothing_raised { @sheet_format_pr.outline_level_row = 1 }
40
+ end
41
+
42
+ def test_outline_level_col
43
+ assert_raise(ArgumentError) { @sheet_format_pr.outline_level_col = :foo }
44
+ assert_nothing_raised { @sheet_format_pr.outline_level_col = 1 }
45
+ end
46
+
47
+ def test_default_row_height
48
+ assert_raise(ArgumentError) { @sheet_format_pr.default_row_height = :foo }
49
+ assert_nothing_raised { @sheet_format_pr.default_row_height= 1.0 }
50
+ end
51
+
52
+ def test_default_col_width
53
+ assert_raise(ArgumentError) { @sheet_format_pr.default_col_width= :foo }
54
+ assert_nothing_raised { @sheet_format_pr.default_col_width = 1.0 }
55
+ end
56
+
57
+ def test_custom_height
58
+ assert_raise(ArgumentError) { @sheet_format_pr.custom_height= :foo }
59
+ assert_nothing_raised { @sheet_format_pr.custom_height = true }
60
+ end
61
+
62
+ def test_zero_height
63
+ assert_raise(ArgumentError) { @sheet_format_pr.zero_height= :foo }
64
+ assert_nothing_raised { @sheet_format_pr.zero_height = true }
65
+ end
66
+ def test_thick_top
67
+ assert_raise(ArgumentError) { @sheet_format_pr.thick_top= :foo }
68
+ assert_nothing_raised { @sheet_format_pr.thick_top = true }
69
+ end
70
+ def test_thick_bottom
71
+ assert_raise(ArgumentError) { @sheet_format_pr.thick_bottom= :foo }
72
+ assert_nothing_raised { @sheet_format_pr.thick_bottom = true }
73
+ end
74
+
75
+ def test_to_xml_string
76
+ doc = Nokogiri::XML(@sheet_format_pr.to_xml_string)
77
+ assert doc.xpath("sheetFormatPr[@thickBottom='true']")
78
+ assert doc.xpath("sheetFormatPr[@baseColWidth=5]")
79
+ assert doc.xpath("sheetFormatPr[@default_col_width=7.2]")
80
+ assert doc.xpath("sheetFormatPr[@default_row_height=5.2]")
81
+ assert doc.xpath("sheetFormatPr[@custom_height='true']")
82
+ assert doc.xpath("sheetFormatPr[@zero_height='false']")
83
+ assert doc.xpath("sheetFormatPr[@thick_top='true']")
84
+ assert doc.xpath("sheetFormatPr[@outline_level_row=0]")
85
+ assert doc.xpath("sheetFormatPr[@outline_level_col=0]")
86
+ end
87
+
88
+ end
@@ -19,9 +19,16 @@ class TestWorksheet < Test::Unit::TestCase
19
19
  assert_equal(@ws.name, '&lt;foo&gt; &amp; &lt;bar&gt;')
20
20
  end
21
21
 
22
- def test_name_exception_on_colon
22
+ def test_name_exception_on_invalid_character
23
23
  assert_raises(ArgumentError) { @ws.name = 'foo:bar' }
24
+ assert_raises(ArgumentError) { @ws.name = 'foo[bar' }
25
+ assert_raises(ArgumentError) { @ws.name = 'foo]bar' }
26
+ assert_raises(ArgumentError) { @ws.name = 'foo*bar' }
27
+ assert_raises(ArgumentError) { @ws.name = 'foo/bar' }
28
+ assert_raises(ArgumentError) { @ws.name = 'foo\bar' }
29
+ assert_raises(ArgumentError) { @ws.name = 'foo?bar' }
24
30
  end
31
+
25
32
  def test_page_margins
26
33
  assert(@ws.page_margins.is_a? Axlsx::PageMargins)
27
34
  end
@@ -168,6 +175,12 @@ class TestWorksheet < Test::Unit::TestCase
168
175
  assert @ws.drawing.is_a?(Axlsx::Drawing)
169
176
  end
170
177
 
178
+ def test_add_pivot_table
179
+ assert(@ws.workbook.pivot_tables.empty?, "the sheet's workbook should not have any pivot tables by default")
180
+ @ws.add_pivot_table 'G5:G6', 'A1:D:10'
181
+ assert_equal(@ws.workbook.pivot_tables.size, 1, "add_pivot_tables adds a pivot_table to the workbook")
182
+ end
183
+
171
184
  def test_col_style
172
185
  @ws.add_row [1,2,3,4]
173
186
  @ws.add_row [1,2,3,4]
@@ -366,6 +379,7 @@ class TestWorksheet < Test::Unit::TestCase
366
379
  @ws.merge_cells "A4:A5"
367
380
  @ws.add_chart Axlsx::Pie3DChart
368
381
  @ws.add_table "E1:F3"
382
+ @ws.add_pivot_table 'G5:G6', 'A1:D10'
369
383
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
370
384
  doc = Nokogiri::XML(@ws.to_xml_string)
371
385
  assert(schema.validate(doc).map { |e| puts e.message; e }.empty?, schema.validate(doc).map { |e| e.message }.join('\n'))
@@ -382,6 +396,8 @@ class TestWorksheet < Test::Unit::TestCase
382
396
  assert_equal(@ws.relationships.size, 4, "adding a comment adds 3 relationships")
383
397
  c = @ws.add_comment :text => 'not that is a comment!', :author => 'travis', :ref => "A1"
384
398
  assert_equal(@ws.relationships.size, 4, "adding multiple comments in the same worksheet should not add any additional comment relationships")
399
+ c = @ws.add_pivot_table 'G5:G6', 'A1:D10'
400
+ assert_equal(@ws.relationships.size, 5, "adding a pivot table adds 1 relationship")
385
401
  end
386
402
 
387
403
 
@@ -389,6 +405,11 @@ class TestWorksheet < Test::Unit::TestCase
389
405
  assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> n) }
390
406
  end
391
407
 
408
+ def test_name_unique_only_checks_other_worksheet_names
409
+ assert_nothing_raised { @ws.name = @ws.name }
410
+ assert_nothing_raised { Axlsx::Package.new.workbook.add_worksheet :name => 'Sheet1' }
411
+ end
412
+
392
413
  def test_name_size
393
414
  assert_raise(ArgumentError, "name too long!") { @ws.name = Array.new(32, "A").join() }
394
415
  assert_nothing_raised { @ws.name = Array.new(31, "A").join() }
@@ -459,4 +480,27 @@ class TestWorksheet < Test::Unit::TestCase
459
480
  doc = Nokogiri::XML(@ws.to_xml_string)
460
481
  assert(doc.xpath('//sheetPr[@filterMode="true"]'))
461
482
  end
483
+
484
+ def test_outline_level_rows
485
+ 3.times { @ws.add_row [1,2,3] }
486
+ @ws.outline_level_rows 0, 2
487
+ assert_equal(1, @ws.rows[0].outline_level)
488
+ assert_equal(true, @ws.rows[2].hidden)
489
+ assert_equal(true, @ws.sheet_view.show_outline_symbols)
490
+ end
491
+
492
+ def test_outline_level_columns
493
+ 3.times { @ws.add_row [1,2,3] }
494
+ @ws.outline_level_columns 0, 2
495
+ assert_equal(1, @ws.column_info[0].outline_level)
496
+ assert_equal(true, @ws.column_info[2].hidden)
497
+ assert_equal(true, @ws.sheet_view.show_outline_symbols)
498
+ end
499
+
500
+ def test_worksheet_does_not_get_added_to_workbook_on_initialize_failure
501
+ assert_equal(1, @wb.worksheets.size)
502
+ assert_raise(ArgumentError) { @wb.add_worksheet(:name => 'Sheet1') }
503
+ assert_equal(1, @wb.worksheets.size)
504
+ end
505
+
462
506
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: axlsx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.4
4
+ version: 1.3.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-25 00:00:00.000000000 Z
12
+ date: 2013-02-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -107,12 +107,13 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
- description: ! ' xlsx generation with charts, images, automated column width, customizable
111
- styles and full schema validation. Axlsx excels at helping you generate beautiful
112
- Office Open XML Spreadsheet documents without having to understand the entire ECMA
113
- specification. Check out the README for some examples of how easy it is. Best of
114
- all, you can validate your xlsx file before serialization so you know for sure that
115
- anything generated is going to load on your client''s machine.
110
+ description: ! ' xlsx spreadsheet generation with charts, images, automated column
111
+ width, customizable styles and full schema validation. Axlsx helps you create beautiful
112
+ Office Open XML Spreadsheet documents ( Excel, Google Spreadsheets, Numbers, LibreOffice)
113
+ without having to understand the entire ECMA specification. Check out the README
114
+ for some examples of how easy it is. Best of all, you can validate your xlsx file
115
+ before serialization so you know for sure that anything generated is going to load
116
+ on your client''s machine.
116
117
 
117
118
  '
118
119
  email: digital.ipseity@gmail.com
@@ -199,6 +200,7 @@ files:
199
200
  - lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb
200
201
  - lib/axlsx/workbook/worksheet/auto_filter/filters.rb
201
202
  - lib/axlsx/workbook/worksheet/cell.rb
203
+ - lib/axlsx/workbook/worksheet/cell_serializer.rb
202
204
  - lib/axlsx/workbook/worksheet/cfvo.rb
203
205
  - lib/axlsx/workbook/worksheet/cfvos.rb
204
206
  - lib/axlsx/workbook/worksheet/col.rb
@@ -221,6 +223,9 @@ files:
221
223
  - lib/axlsx/workbook/worksheet/page_set_up_pr.rb
222
224
  - lib/axlsx/workbook/worksheet/page_setup.rb
223
225
  - lib/axlsx/workbook/worksheet/pane.rb
226
+ - lib/axlsx/workbook/worksheet/pivot_table.rb
227
+ - lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb
228
+ - lib/axlsx/workbook/worksheet/pivot_tables.rb
224
229
  - lib/axlsx/workbook/worksheet/print_options.rb
225
230
  - lib/axlsx/workbook/worksheet/protected_range.rb
226
231
  - lib/axlsx/workbook/worksheet/protected_ranges.rb
@@ -228,6 +233,7 @@ files:
228
233
  - lib/axlsx/workbook/worksheet/selection.rb
229
234
  - lib/axlsx/workbook/worksheet/sheet_calc_pr.rb
230
235
  - lib/axlsx/workbook/worksheet/sheet_data.rb
236
+ - lib/axlsx/workbook/worksheet/sheet_format_pr.rb
231
237
  - lib/axlsx/workbook/worksheet/sheet_pr.rb
232
238
  - lib/axlsx/workbook/worksheet/sheet_protection.rb
233
239
  - lib/axlsx/workbook/worksheet/sheet_view.rb
@@ -287,7 +293,9 @@ files:
287
293
  - examples/data_validation.rb
288
294
  - examples/example.rb
289
295
  - examples/extractive.rb
296
+ - examples/ios_preview.rb
290
297
  - examples/page_setup.rb
298
+ - examples/pivot_table.rb
291
299
  - examples/sheet_protection.rb
292
300
  - examples/skydrive/real_example.rb
293
301
  - examples/styles.rb
@@ -389,11 +397,14 @@ files:
389
397
  - test/workbook/worksheet/tc_page_set_up_pr.rb
390
398
  - test/workbook/worksheet/tc_page_setup.rb
391
399
  - test/workbook/worksheet/tc_pane.rb
400
+ - test/workbook/worksheet/tc_pivot_table.rb
401
+ - test/workbook/worksheet/tc_pivot_table_cache_definition.rb
392
402
  - test/workbook/worksheet/tc_print_options.rb
393
403
  - test/workbook/worksheet/tc_protected_range.rb
394
404
  - test/workbook/worksheet/tc_row.rb
395
405
  - test/workbook/worksheet/tc_selection.rb
396
406
  - test/workbook/worksheet/tc_sheet_calc_pr.rb
407
+ - test/workbook/worksheet/tc_sheet_format_pr.rb
397
408
  - test/workbook/worksheet/tc_sheet_pr.rb
398
409
  - test/workbook/worksheet/tc_sheet_protection.rb
399
410
  - test/workbook/worksheet/tc_sheet_view.rb
@@ -421,7 +432,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
421
432
  version: '0'
422
433
  segments:
423
434
  - 0
424
- hash: 3556182461904299335
435
+ hash: -4130267238681018479
425
436
  requirements: []
426
437
  rubyforge_project:
427
438
  rubygems_version: 1.8.24
@@ -520,11 +531,14 @@ test_files:
520
531
  - test/workbook/worksheet/tc_page_set_up_pr.rb
521
532
  - test/workbook/worksheet/tc_page_setup.rb
522
533
  - test/workbook/worksheet/tc_pane.rb
534
+ - test/workbook/worksheet/tc_pivot_table.rb
535
+ - test/workbook/worksheet/tc_pivot_table_cache_definition.rb
523
536
  - test/workbook/worksheet/tc_print_options.rb
524
537
  - test/workbook/worksheet/tc_protected_range.rb
525
538
  - test/workbook/worksheet/tc_row.rb
526
539
  - test/workbook/worksheet/tc_selection.rb
527
540
  - test/workbook/worksheet/tc_sheet_calc_pr.rb
541
+ - test/workbook/worksheet/tc_sheet_format_pr.rb
528
542
  - test/workbook/worksheet/tc_sheet_pr.rb
529
543
  - test/workbook/worksheet/tc_sheet_protection.rb
530
544
  - test/workbook/worksheet/tc_sheet_view.rb