axlsx 1.1.8 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +5 -2
- data/CHANGELOG.md +39 -0
- data/README.md +48 -46
- data/Rakefile +3 -3
- data/examples/basic_charts.rb +8 -0
- data/examples/example.rb +7 -1
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/scraping_html.rb +91 -0
- data/examples/shared_strings_example.xlsx +0 -0
- data/lib/axlsx.rb +14 -8
- data/lib/axlsx/drawing/bar_3D_chart.rb +2 -8
- data/lib/axlsx/drawing/chart.rb +29 -25
- data/lib/axlsx/drawing/d_lbls.rb +100 -0
- data/lib/axlsx/drawing/drawing.rb +2 -0
- data/lib/axlsx/drawing/line_3D_chart.rb +2 -9
- data/lib/axlsx/drawing/pie_3D_chart.rb +3 -0
- data/lib/axlsx/drawing/scatter_chart.rb +2 -8
- data/lib/axlsx/drawing/two_cell_anchor.rb +38 -1
- data/lib/axlsx/util/simple_typed_list.rb +13 -6
- data/lib/axlsx/version.rb +2 -7
- data/lib/axlsx/workbook/defined_name.rb +174 -0
- data/lib/axlsx/workbook/defined_names.rb +21 -0
- data/lib/axlsx/workbook/workbook.rb +39 -13
- data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
- data/lib/axlsx/workbook/worksheet/cell.rb +24 -1
- data/lib/axlsx/workbook/worksheet/col.rb +15 -0
- data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
- data/lib/axlsx/workbook/worksheet/comments.rb +8 -0
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
- data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
- data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
- data/lib/axlsx/workbook/worksheet/row.rb +1 -1
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
- data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +263 -380
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
- data/test/drawing/tc_bar_series.rb +1 -1
- data/test/drawing/tc_chart.rb +7 -1
- data/test/drawing/tc_d_lbls.rb +47 -0
- data/test/drawing/tc_drawing.rb +5 -4
- data/test/drawing/tc_line_series.rb +1 -1
- data/test/drawing/tc_pie_3D_chart.rb +1 -1
- data/test/drawing/tc_pie_series.rb +1 -1
- data/test/drawing/tc_scatter_series.rb +1 -1
- data/test/drawing/tc_series.rb +1 -1
- data/test/tc_package.rb +16 -1
- data/test/workbook/tc_defined_name.rb +41 -0
- data/test/workbook/tc_workbook.rb +5 -3
- data/test/workbook/worksheet/table/tc_table.rb +0 -8
- data/test/workbook/worksheet/tc_cell.rb +2 -4
- data/test/workbook/worksheet/tc_protected_range.rb +0 -1
- data/test/workbook/worksheet/tc_row.rb +2 -2
- data/test/workbook/worksheet/tc_worksheet.rb +19 -21
- metadata +48 -7
@@ -0,0 +1,57 @@
|
|
1
|
+
module Axlsx
|
2
|
+
|
3
|
+
# A wraper class for comments that defines its on worksheet
|
4
|
+
# serailization
|
5
|
+
class WorksheetComments
|
6
|
+
|
7
|
+
# Creates a new WorksheetComments object
|
8
|
+
# param [Worksheet] worksheet The worksheet comments in thes object belong to
|
9
|
+
def initialize(worksheet)
|
10
|
+
raise ArugumentError, 'You must provide a worksheet' unless worksheet.is_a?(Worksheet)
|
11
|
+
@worksheet = worksheet
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :worksheet
|
15
|
+
|
16
|
+
# The comments for this worksheet.
|
17
|
+
# @return [Comments]
|
18
|
+
def comments
|
19
|
+
@comments ||= Comments.new(worksheet)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Adds a comment
|
23
|
+
# @param [Hash] options
|
24
|
+
# @see Comments#add_comment
|
25
|
+
def add_comment(options={})
|
26
|
+
comments.add_comment(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
# The relationships defined by this objects comments collection
|
30
|
+
# @return [Relationships]
|
31
|
+
def relationships
|
32
|
+
return [] unless has_comments?
|
33
|
+
comments.relationships
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# Helper method to tell us if there are comments in the comments collection
|
38
|
+
# @return [Boolean]
|
39
|
+
def has_comments?
|
40
|
+
!comments.empty?
|
41
|
+
end
|
42
|
+
|
43
|
+
# The index in the worksheet's relationships for the VML drawing that will render the comments
|
44
|
+
# @return [Integer]
|
45
|
+
def index
|
46
|
+
worksheet.relationships.index { |r| r.Type == VML_DRAWING_R } + 1
|
47
|
+
end
|
48
|
+
|
49
|
+
# Seraalize the object
|
50
|
+
# @param [String] str
|
51
|
+
# @return [String]
|
52
|
+
def to_xml_string(str = '')
|
53
|
+
return unless has_comments?
|
54
|
+
str << "<legacyDrawing r:id='rId#{index}' />"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Axlsx
|
2
|
+
|
3
|
+
# This is a utility class for serialing the drawing node in a
|
4
|
+
# worksheet. Drawing objects have their own serialization that exports
|
5
|
+
# a drawing document. This is only for the single node in the
|
6
|
+
# worksheet
|
7
|
+
class WorksheetDrawing
|
8
|
+
|
9
|
+
# Creates a new WorksheetDrawing
|
10
|
+
# @param [Worksheet] worksheet
|
11
|
+
def initialize(worksheet)
|
12
|
+
raise ArgumentError, 'you must provide a worksheet' unless worksheet.is_a?(Worksheet)
|
13
|
+
@worksheet = worksheet
|
14
|
+
@drawing = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :worksheet
|
18
|
+
|
19
|
+
attr_reader :drawing
|
20
|
+
|
21
|
+
# adds a chart to the drawing object
|
22
|
+
# @param [Class] chart_type The type of chart to add
|
23
|
+
# @param [Hash] options Options to pass on to the drawing and chart
|
24
|
+
# @see Worksheet#add_chart
|
25
|
+
def add_chart(chart_type, options)
|
26
|
+
@drawing ||= Drawing.new worksheet
|
27
|
+
drawing.add_chart(chart_type, options)
|
28
|
+
end
|
29
|
+
|
30
|
+
# adds an image to the drawing object
|
31
|
+
# @param [Hash] options Options to pass on to the drawing and image
|
32
|
+
# @see Worksheet#add_image
|
33
|
+
def add_image(options)
|
34
|
+
@drawing ||= Drawing.new worksheet
|
35
|
+
drawing.add_image(options)
|
36
|
+
end
|
37
|
+
|
38
|
+
# helper method to tell us if the drawing has something in it or not
|
39
|
+
# @return [Boolean]
|
40
|
+
def has_drawing?
|
41
|
+
@drawing.is_a? Drawing
|
42
|
+
end
|
43
|
+
|
44
|
+
# The relationship required by this object
|
45
|
+
# @return [Relationship]
|
46
|
+
def relationship
|
47
|
+
return unless has_drawing?
|
48
|
+
Relationship.new(DRAWING_R, "../#{drawing.pn}")
|
49
|
+
end
|
50
|
+
|
51
|
+
# returns the index of the worksheet releationship that defines this drawing.
|
52
|
+
# @return [Integer]
|
53
|
+
def index
|
54
|
+
worksheet.relationships.index{ |r| r.Type == DRAWING_R } +1
|
55
|
+
end
|
56
|
+
|
57
|
+
# Serialize the drawing for the worksheet
|
58
|
+
# @param [String] str
|
59
|
+
def to_xml_string(str = '')
|
60
|
+
return unless has_drawing?
|
61
|
+
str << "<drawing r:id='rId#{index}'/>"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -5,7 +5,7 @@ class TestBarSeries < Test::Unit::TestCase
|
|
5
5
|
def setup
|
6
6
|
p = Axlsx::Package.new
|
7
7
|
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
|
-
@chart = @ws.
|
8
|
+
@chart = @ws.add_chart Axlsx::Bar3DChart, :title => "fishery"
|
9
9
|
@series = @chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :colors => ['FF0000', '00FF00', '0000FF'], :shape => :cone
|
10
10
|
end
|
11
11
|
|
data/test/drawing/tc_chart.rb
CHANGED
@@ -73,7 +73,13 @@ class TestChart < Test::Unit::TestCase
|
|
73
73
|
def test_pn
|
74
74
|
assert_equal(@chart.pn, "charts/chart1.xml")
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
|
+
def test_d_lbls
|
78
|
+
assert_equal(nil, @chart.instance_values[:d_lbls])
|
79
|
+
@chart.d_lbls.d_lbl_pos = :t
|
80
|
+
assert(@chart.d_lbls.is_a?(Axlsx::DLbls), 'DLbls instantiated on access')
|
81
|
+
end
|
82
|
+
|
77
83
|
def test_to_xml_string
|
78
84
|
schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
|
79
85
|
doc = Nokogiri::XML(@chart.to_xml_string)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'tc_helper'
|
2
|
+
|
3
|
+
class TestDLbls < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@d_lbls = Axlsx::DLbls.new(Axlsx::Pie3DChart)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_initialization
|
10
|
+
assert_equal(:bestFit, @d_lbls.d_lbl_pos)
|
11
|
+
Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
|
12
|
+
assert_equal(false, @d_lbls.send(attr))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_initialization_with_optoins
|
17
|
+
options_hash = Hash[*[Axlsx::DLbls::BOOLEAN_ATTRIBUTES.map { |name| [name, true] }] ]
|
18
|
+
d_lbls = Axlsx::DLbls.new(Axlsx::Pie3DChart, options_hash.merge( { :d_lbl_pos => :t }))
|
19
|
+
Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
|
20
|
+
assert_equal(true, d_lbls.send(attr), "boolean attributes set by options")
|
21
|
+
end
|
22
|
+
assert_equal(:t, d_lbls.d_lbl_pos, "d_lbl_pos set by options")
|
23
|
+
end
|
24
|
+
def test_d_lbl_pos
|
25
|
+
assert_raise(ArgumentError, 'invlaid label positions are rejected') { @d_lbls.d_lbl_pos = :upside_down }
|
26
|
+
assert_nothing_raised('accepts valid label position') { @d_lbls.d_lbl_pos = :ctr }
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_boolean_attributes
|
30
|
+
Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
|
31
|
+
assert_raise(ArgumentError, "rejects non boolean value for #{attr}") { @d_lbls.send("#{attr}=", :foo) }
|
32
|
+
assert_nothing_raised("accepts boolean value for #{attr}") { @d_lbls.send("#{attr}=", true) }
|
33
|
+
assert_nothing_raised("accepts boolean value for #{attr}") { @d_lbls.send("#{attr}=", false) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_to_xml_string
|
38
|
+
str = '<?xml version="1.0" encoding="UTF-8"?>'
|
39
|
+
str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '" xmlns:a="' << Axlsx::XML_NS_A << '" xmlns:r="' << Axlsx::XML_NS_R << '">'
|
40
|
+
@d_lbls.to_xml_string(str)
|
41
|
+
str << '</c:chartSpace>'
|
42
|
+
doc = Nokogiri::XML(str)
|
43
|
+
@d_lbls.instance_values.each do |name, value|
|
44
|
+
assert(doc.xpath("//c:#{Axlsx::camel(name, false)}[@val='#{value}']"), "#{name} is properly serialized")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/test/drawing/tc_drawing.rb
CHANGED
@@ -9,8 +9,6 @@ class TestDrawing < Test::Unit::TestCase
|
|
9
9
|
|
10
10
|
def test_initialization
|
11
11
|
assert(@ws.workbook.drawings.empty?)
|
12
|
-
assert_equal(@ws.drawing, @ws.workbook.drawings.last, "drawing is added to workbook")
|
13
|
-
assert(@ws.drawing.anchors.is_a?(Axlsx::SimpleTypedList) && @ws.drawing.anchors.empty?, "anchor list is created and empty")
|
14
12
|
end
|
15
13
|
|
16
14
|
def test_add_chart
|
@@ -39,7 +37,6 @@ class TestDrawing < Test::Unit::TestCase
|
|
39
37
|
assert(image.is_a?(Axlsx::Pic))
|
40
38
|
end
|
41
39
|
def test_charts
|
42
|
-
assert(@ws.drawing.charts.empty?)
|
43
40
|
chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
|
44
41
|
assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
|
45
42
|
chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
|
@@ -47,23 +44,26 @@ class TestDrawing < Test::Unit::TestCase
|
|
47
44
|
end
|
48
45
|
|
49
46
|
def test_pn
|
47
|
+
@ws.add_chart(Axlsx::Pie3DChart)
|
50
48
|
assert_equal(@ws.drawing.pn, "drawings/drawing1.xml")
|
51
49
|
end
|
52
50
|
|
53
51
|
def test_rels_pn
|
52
|
+
@ws.add_chart(Axlsx::Pie3DChart)
|
54
53
|
assert_equal(@ws.drawing.rels_pn, "drawings/_rels/drawing1.xml.rels")
|
55
54
|
end
|
56
55
|
|
57
56
|
def test_rId
|
57
|
+
@ws.add_chart(Axlsx::Pie3DChart)
|
58
58
|
assert_equal(@ws.drawing.rId, "rId1")
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_index
|
62
|
+
@ws.add_chart(Axlsx::Pie3DChart)
|
62
63
|
assert_equal(@ws.drawing.index, @ws.workbook.drawings.index(@ws.drawing))
|
63
64
|
end
|
64
65
|
|
65
66
|
def test_relationships
|
66
|
-
assert(@ws.drawing.relationships.empty?)
|
67
67
|
chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
|
68
68
|
assert_equal(@ws.drawing.relationships.size, 1, "adding a chart adds a relationship")
|
69
69
|
chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
|
@@ -72,6 +72,7 @@ class TestDrawing < Test::Unit::TestCase
|
|
72
72
|
|
73
73
|
def test_to_xml
|
74
74
|
schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
|
75
|
+
@ws.add_chart(Axlsx::Pie3DChart)
|
75
76
|
doc = Nokogiri::XML(@ws.drawing.to_xml_string)
|
76
77
|
errors = []
|
77
78
|
schema.validate(doc).each do |error|
|
@@ -5,7 +5,7 @@ class TestLineSeries < Test::Unit::TestCase
|
|
5
5
|
def setup
|
6
6
|
p = Axlsx::Package.new
|
7
7
|
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
|
-
chart = @ws.
|
8
|
+
chart = @ws.add_chart Axlsx::Line3DChart, :title => "fishery"
|
9
9
|
@series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :color => "#FF0000"
|
10
10
|
end
|
11
11
|
|
@@ -6,7 +6,7 @@ class TestPie3DChart < Test::Unit::TestCase
|
|
6
6
|
p = Axlsx::Package.new
|
7
7
|
ws = p.workbook.add_worksheet
|
8
8
|
@row = ws.add_row ["one", 1, Time.now]
|
9
|
-
@chart = ws.
|
9
|
+
@chart = ws.add_chart Axlsx::Pie3DChart, :title => "fishery"
|
10
10
|
end
|
11
11
|
|
12
12
|
def teardown
|
@@ -5,7 +5,7 @@ class TestPieSeries < Test::Unit::TestCase
|
|
5
5
|
def setup
|
6
6
|
p = Axlsx::Package.new
|
7
7
|
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
|
-
chart = @ws.
|
8
|
+
chart = @ws.add_chart Axlsx::Pie3DChart, :title => "fishery"
|
9
9
|
@series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :colors => ["FF0000", "00FF00", "0000FF"]
|
10
10
|
end
|
11
11
|
|
@@ -5,7 +5,7 @@ class TestScatterSeries < Test::Unit::TestCase
|
|
5
5
|
def setup
|
6
6
|
p = Axlsx::Package.new
|
7
7
|
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
|
-
@chart = @ws.
|
8
|
+
@chart = @ws.add_chart Axlsx::ScatterChart, :title => "Scatter Chart"
|
9
9
|
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"exponents", :color => 'FF0000'
|
10
10
|
end
|
11
11
|
|
data/test/drawing/tc_series.rb
CHANGED
@@ -5,7 +5,7 @@ class TestSeries < Test::Unit::TestCase
|
|
5
5
|
def setup
|
6
6
|
p = Axlsx::Package.new
|
7
7
|
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
|
-
chart = @ws.
|
8
|
+
chart = @ws.add_chart Axlsx::Chart, :title => "fishery"
|
9
9
|
@series = chart.add_series :title=>"bob"
|
10
10
|
end
|
11
11
|
|
data/test/tc_package.rb
CHANGED
@@ -7,6 +7,7 @@ class TestPackage < Test::Unit::TestCase
|
|
7
7
|
ws = @package.workbook.add_worksheet
|
8
8
|
ws.add_row ['Can', 'we', 'build it?']
|
9
9
|
ws.add_row ['Yes!', 'We', 'can!']
|
10
|
+
ws.workbook.add_defined_name("#{ws.name}!A1:C2", :name => '_xlnm.Print_Titles', :hidden => true)
|
10
11
|
ws.protect_range('A1:C1')
|
11
12
|
ws.protect_range(ws.rows.last.cells)
|
12
13
|
ws.add_comment :author => 'alice', :text => 'Hi Bob', :ref => 'A12'
|
@@ -28,11 +29,25 @@ class TestPackage < Test::Unit::TestCase
|
|
28
29
|
|
29
30
|
ws.add_chart(Axlsx::Pie3DChart, :title => "これは?", :start_at => [0,3]) do |chart|
|
30
31
|
chart.add_series :data=>[1,2,3], :labels=>["a", "b", "c"]
|
32
|
+
chart.d_lbls.show_val = true
|
33
|
+
chart.d_lbls.d_lbl_pos = :outEnd
|
34
|
+
chart.d_lbls.show_percent = true
|
31
35
|
end
|
32
36
|
|
33
37
|
ws.add_chart(Axlsx::Line3DChart, :title => "axis labels") do |chart|
|
34
38
|
chart.valAxis.title = 'bob'
|
39
|
+
chart.d_lbls.show_val = true
|
35
40
|
end
|
41
|
+
|
42
|
+
ws.add_chart(Axlsx::Bar3DChart, :title => 'bar chart') do |chart|
|
43
|
+
chart.add_series :data => [1,4,5], :labels => %w(A B C)
|
44
|
+
chart.d_lbls.show_percent = true
|
45
|
+
end
|
46
|
+
|
47
|
+
ws.add_chart(Axlsx::ScatterChart, :title => 'scat man') do |chart|
|
48
|
+
chart.add_series :xData => [1,2,3,4], :yData => [4,3,2,1]
|
49
|
+
chart.d_lbls.show_val = true
|
50
|
+
end
|
36
51
|
|
37
52
|
@fname = 'axlsx_test_serialization.xlsx'
|
38
53
|
img = File.expand_path('../../examples/image1.jpeg', __FILE__)
|
@@ -122,7 +137,7 @@ class TestPackage < Test::Unit::TestCase
|
|
122
137
|
|
123
138
|
|
124
139
|
#no mystery parts
|
125
|
-
assert_equal(p.size,
|
140
|
+
assert_equal(p.size, 21)
|
126
141
|
|
127
142
|
end
|
128
143
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'tc_helper'
|
2
|
+
|
3
|
+
class TestDefinedNames < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@dn = Axlsx::DefinedName.new('Sheet1!A1:A1')
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_initialize
|
9
|
+
assert_equal('Sheet1!A1:A1', @dn.formula)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_string_attributes
|
13
|
+
Axlsx::DefinedName::STRING_ATTRIBUTES.each do |attr|
|
14
|
+
assert_raise(ArgumentError, 'only strings allowed in string attributes') { @dn.send("#{attr}=", 1) }
|
15
|
+
assert_nothing_raised { @dn.send("#{attr}=", '_xlnm.Sheet_Title') }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_boolean_attributes
|
20
|
+
Axlsx::DefinedName::BOOLEAN_ATTRIBUTES.each do |attr|
|
21
|
+
assert_raise(ArgumentError, 'only booleanish allowed in string attributes') { @dn.send("#{attr}=", 'foo') }
|
22
|
+
assert_nothing_raised { @dn.send("#{attr}=", 1) }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_local_sheet_id
|
28
|
+
assert_raise(ArgumentError, 'local_sheet_id must be an unsigned int') { @dn.local_sheet_id = -1 }
|
29
|
+
assert_nothing_raised { @dn.local_sheet_id = 1 }
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_to_xml_string
|
33
|
+
assert_raise(ArgumentError, 'name is required for serialization') { @dn.to_xml_string }
|
34
|
+
@dn.name = '_xlnm.Print_Titles'
|
35
|
+
@dn.hidden = true
|
36
|
+
doc = Nokogiri::XML(@dn.to_xml_string)
|
37
|
+
assert(doc.xpath("//definedName[@name='_xlnm.Print_Titles']"))
|
38
|
+
assert(doc.xpath("//definedName[@hidden='true']"))
|
39
|
+
assert_equal('Sheet1!A1:A1', doc.xpath('//definedName').text)
|
40
|
+
end
|
41
|
+
end
|
@@ -24,7 +24,10 @@ class TestWorkbook < Test::Unit::TestCase
|
|
24
24
|
assert_equal(Axlsx::Workbook.date1904, @wb.date1904)
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
def test_add_defined_name
|
28
|
+
@wb.add_defined_name 'Sheet1!1:1', :name => '_xlnm.Print_Titles', :hidden => true
|
29
|
+
assert_equal(1, @wb.defined_names.size)
|
30
|
+
end
|
28
31
|
|
29
32
|
def test_shared_strings
|
30
33
|
assert_equal(@wb.use_shared_strings, nil)
|
@@ -72,14 +75,13 @@ class TestWorkbook < Test::Unit::TestCase
|
|
72
75
|
assert(@wb.worksheets.size == 1)
|
73
76
|
end
|
74
77
|
|
75
|
-
|
76
78
|
def test_to_xml_string_defined_names
|
77
79
|
@wb.add_worksheet do |sheet|
|
78
80
|
sheet.add_row [1, "two"]
|
79
81
|
sheet.auto_filter = "A1:B1"
|
80
82
|
end
|
81
83
|
doc = Nokogiri::XML(@wb.to_xml_string)
|
82
|
-
assert_equal(doc.xpath('//xmlns:workbook/xmlns:definedNames/xmlns:definedName').inner_text, @wb.worksheets[0].
|
84
|
+
assert_equal(doc.xpath('//xmlns:workbook/xmlns:definedNames/xmlns:definedName').inner_text, @wb.worksheets[0].auto_filter.defined_name)
|
83
85
|
end
|
84
86
|
|
85
87
|
|
@@ -25,14 +25,6 @@ class TestTable < Test::Unit::TestCase
|
|
25
25
|
|
26
26
|
end
|
27
27
|
|
28
|
-
def test_charts
|
29
|
-
assert(@ws.drawing.charts.empty?)
|
30
|
-
chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
|
31
|
-
assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
|
32
|
-
chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
|
33
|
-
assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
|
34
|
-
end
|
35
|
-
|
36
28
|
def test_pn
|
37
29
|
@ws.add_table("A1:D5")
|
38
30
|
assert_equal(@ws.tables.first.pn, "tables/table1.xml")
|
@@ -197,19 +197,17 @@ class TestCell < Test::Unit::TestCase
|
|
197
197
|
end
|
198
198
|
|
199
199
|
def test_merge_with_string
|
200
|
-
assert_equal(@c.row.worksheet.merged_cells.size, 0)
|
201
200
|
@c.row.add_cell 2
|
202
201
|
@c.row.add_cell 3
|
203
202
|
@c.merge "A2"
|
204
|
-
assert_equal(@c.row.worksheet.merged_cells.last, "A1:A2")
|
203
|
+
assert_equal(@c.row.worksheet.send(:merged_cells).last, "A1:A2")
|
205
204
|
end
|
206
205
|
|
207
206
|
def test_merge_with_cell
|
208
|
-
assert_equal(@c.row.worksheet.merged_cells.size, 0)
|
209
207
|
@c.row.add_cell 2
|
210
208
|
@c.row.add_cell 3
|
211
209
|
@c.merge @row.cells.last
|
212
|
-
assert_equal(@c.row.worksheet.merged_cells.last, "A1:C1")
|
210
|
+
assert_equal(@c.row.worksheet.send(:merged_cells).last, "A1:C1")
|
213
211
|
end
|
214
212
|
|
215
213
|
def test_ssti
|