axlsx 2.1.0.pre → 3.0.0.pre
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/CHANGELOG.md +5 -0
- data/README.md +17 -20
- data/Rakefile +0 -1
- data/examples/conditional_formatting/example_conditional_formatting.rb +15 -0
- data/examples/example.rb +31 -1
- data/lib/axlsx.rb +9 -4
- data/lib/axlsx/drawing/area_chart.rb +99 -0
- data/lib/axlsx/drawing/area_series.rb +110 -0
- data/lib/axlsx/drawing/bar_chart.rb +143 -0
- data/lib/axlsx/drawing/chart.rb +8 -1
- data/lib/axlsx/drawing/d_lbls.rb +3 -3
- data/lib/axlsx/drawing/drawing.rb +3 -0
- data/lib/axlsx/drawing/line_series.rb +18 -1
- data/lib/axlsx/drawing/num_val.rb +3 -1
- data/lib/axlsx/drawing/one_cell_anchor.rb +2 -1
- data/lib/axlsx/drawing/pic.rb +24 -17
- data/lib/axlsx/drawing/scaling.rb +2 -2
- data/lib/axlsx/drawing/scatter_series.rb +16 -2
- data/lib/axlsx/drawing/str_val.rb +3 -1
- data/lib/axlsx/drawing/title.rb +19 -1
- data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
- data/lib/axlsx/drawing/view_3D.rb +2 -2
- data/lib/axlsx/package.rb +7 -16
- data/lib/axlsx/rels/relationships.rb +5 -2
- data/lib/axlsx/stylesheet/num_fmt.rb +9 -0
- data/lib/axlsx/stylesheet/styles.rb +1 -1
- data/lib/axlsx/util/constants.rb +8 -5
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- data/lib/axlsx/util/simple_typed_list.rb +1 -1
- data/lib/axlsx/util/validators.rb +14 -9
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/workbook.rb +19 -1
- data/lib/axlsx/workbook/workbook_view.rb +5 -3
- data/lib/axlsx/workbook/worksheet/cell.rb +26 -19
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +15 -5
- data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -0
- data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +2 -0
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +36 -13
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +4 -1
- data/lib/axlsx/workbook/worksheet/rich_text.rb +23 -3
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +28 -32
- data/lib/axlsx/workbook/worksheet/row.rb +7 -0
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +3 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +8 -51
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
- data/test/axlsx.qcachegrind +2226 -0
- data/test/drawing/tc_area_chart.rb +39 -0
- data/test/drawing/tc_area_series.rb +71 -0
- data/test/drawing/tc_bar_chart.rb +71 -0
- data/test/drawing/tc_chart.rb +23 -10
- data/test/drawing/tc_drawing.rb +2 -2
- data/test/drawing/tc_line_series.rb +38 -5
- data/test/drawing/tc_pic.rb +11 -19
- data/test/drawing/tc_scatter_series.rb +16 -5
- data/test/drawing/tc_str_val.rb +9 -0
- data/test/drawing/tc_title.rb +5 -0
- data/test/stylesheet/tc_styles.rb +2 -2
- data/test/tc_axlsx.rb +31 -0
- data/test/tc_helper.rb +3 -1
- data/test/tc_package.rb +12 -0
- data/test/util/tc_mime_type_utils.rb +13 -0
- data/test/util/tc_simple_typed_list.rb +1 -1
- data/test/util/tc_validators.rb +34 -10
- data/test/workbook/tc_shared_strings_table.rb +16 -1
- data/test/workbook/tc_workbook.rb +22 -1
- data/test/workbook/worksheet/tc_cell.rb +53 -11
- data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
- data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
- data/test/workbook/worksheet/tc_rich_text_run.rb +11 -11
- data/test/workbook/worksheet/tc_row.rb +5 -0
- data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
- data/test/workbook/worksheet/tc_table.rb +2 -3
- data/test/workbook/worksheet/tc_worksheet.rb +53 -38
- metadata +72 -20
- data/examples/IMAGE1UP.JPEG +0 -0
- data/lib/axlsx/util/string.rb +0 -7
data/test/drawing/tc_title.rb
CHANGED
@@ -19,6 +19,11 @@ class TestTitle < Test::Unit::TestCase
|
|
19
19
|
assert(@title.cell == nil)
|
20
20
|
end
|
21
21
|
|
22
|
+
def test_initialize_title_size
|
23
|
+
title = Axlsx::Title.new 'bob', 90
|
24
|
+
assert_equal "90", title.text_size
|
25
|
+
end
|
26
|
+
|
22
27
|
def test_text
|
23
28
|
assert_raise(ArgumentError, "text must be a string") { @title.text = 123 }
|
24
29
|
@title.cell = @row.cells.first
|
@@ -133,7 +133,7 @@ class TestStyles < Test::Unit::TestCase
|
|
133
133
|
:font_name => "woot font"
|
134
134
|
}
|
135
135
|
assert_equal(@styles.parse_font_options {}, nil, "noop if no font keys are set")
|
136
|
-
|
136
|
+
assert(@styles.parse_font_options(:b=>1).is_a?(Integer), "return index of font if not :dxf type")
|
137
137
|
assert_equal(@styles.parse_font_options(:b=>1, :type => :dxf).class, Axlsx::Font, "return font object if :dxf type")
|
138
138
|
|
139
139
|
f = @styles.parse_font_options(options.merge(:type => :dxf))
|
@@ -147,7 +147,7 @@ class TestStyles < Test::Unit::TestCase
|
|
147
147
|
|
148
148
|
def test_parse_fill_options
|
149
149
|
assert_equal(@styles.parse_fill_options {}, nil, "noop if no fill keys are set")
|
150
|
-
|
150
|
+
assert(@styles.parse_fill_options(:bg_color => "DE").is_a?(Integer), "return index of fill if not :dxf type")
|
151
151
|
assert_equal(@styles.parse_fill_options(:bg_color => "DE", :type => :dxf).class, Axlsx::Fill, "return fill object if :dxf type")
|
152
152
|
f = @styles.parse_fill_options(:bg_color => "DE", :type => :dxf)
|
153
153
|
assert(f.fill_type.bgColor.rgb == "FFDEDEDE")
|
data/test/tc_axlsx.rb
CHANGED
@@ -45,6 +45,16 @@ class TestAxlsx < Test::Unit::TestCase
|
|
45
45
|
assert_equal(Axlsx.cell_range([c2, c1], true), "'Sheet <''>" 1'!$A$1:$B$1")
|
46
46
|
end
|
47
47
|
|
48
|
+
def test_cell_range_row
|
49
|
+
p = Axlsx::Package.new
|
50
|
+
ws = p.workbook.add_worksheet
|
51
|
+
row = ws.add_row
|
52
|
+
row.add_cell
|
53
|
+
row.add_cell
|
54
|
+
row.add_cell
|
55
|
+
assert_equal("A1:C1", Axlsx.cell_range(row, false))
|
56
|
+
end
|
57
|
+
|
48
58
|
def test_name_to_indices
|
49
59
|
setup_wide
|
50
60
|
@wide_test_points.each do |key, value|
|
@@ -69,4 +79,25 @@ class TestAxlsx < Test::Unit::TestCase
|
|
69
79
|
assert_equal([['Z5', 'AA5', 'AB5'], ['Z6', 'AA6', 'AB6']], Axlsx::range_to_a('Z5:AB6'))
|
70
80
|
end
|
71
81
|
|
82
|
+
def test_sanitize_frozen_control_strippped
|
83
|
+
needs_sanitize = "legit\x08".freeze # Backspace control char
|
84
|
+
|
85
|
+
assert_equal(Axlsx.sanitize(needs_sanitize), 'legit', 'should strip control chars')
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_sanitize_unfrozen_control_strippped
|
89
|
+
needs_sanitize = "legit\x08" # Backspace control char
|
90
|
+
sanitized_str = Axlsx.sanitize(needs_sanitize)
|
91
|
+
|
92
|
+
assert_equal(sanitized_str, 'legit', 'should strip control chars')
|
93
|
+
assert_equal(sanitized_str.object_id, sanitized_str.object_id, 'should preserve object')
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_sanitize_unfrozen_no_sanitize
|
97
|
+
legit_str = 'legit'
|
98
|
+
sanitized_str = Axlsx.sanitize(legit_str)
|
99
|
+
|
100
|
+
assert_equal(sanitized_str, legit_str, 'should preserve value')
|
101
|
+
assert_equal(sanitized_str.object_id, legit_str.object_id, 'should preserve object')
|
102
|
+
end
|
72
103
|
end
|
data/test/tc_helper.rb
CHANGED
data/test/tc_package.rb
CHANGED
@@ -7,6 +7,12 @@ 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
|
+
@rt = Axlsx::RichText.new
|
11
|
+
@rt.add_run "run 1", :b => true, :i => false
|
12
|
+
ws.add_row [@rt]
|
13
|
+
|
14
|
+
ws.rows.last.add_cell('b', :type => :text)
|
15
|
+
|
10
16
|
ws.outline_level_rows 0, 1
|
11
17
|
ws.outline_level_columns 0, 1
|
12
18
|
ws.add_hyperlink :ref => ws.rows.first.cells.last, :location => 'https://github.com/randym'
|
@@ -154,6 +160,11 @@ class TestPackage < Test::Unit::TestCase
|
|
154
160
|
assert package_1.to_stream.string == package_2.to_stream.string, "zip files are not identical"
|
155
161
|
end
|
156
162
|
|
163
|
+
def test_serialization_creates_files_with_excel_mime_type
|
164
|
+
assert_equal(MimeMagic.by_magic(@package.to_stream).type,
|
165
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
166
|
+
end
|
167
|
+
|
157
168
|
def test_validation
|
158
169
|
assert_equal(@package.validate.size, 0, @package.validate)
|
159
170
|
Axlsx::Workbook.send(:class_variable_set, :@@date1904, 9900)
|
@@ -188,6 +199,7 @@ class TestPackage < Test::Unit::TestCase
|
|
188
199
|
|
189
200
|
def test_shared_strings_requires_part
|
190
201
|
@package.use_shared_strings = true
|
202
|
+
@package.to_stream #ensure all cell_serializer paths are hit
|
191
203
|
p = @package.send(:parts)
|
192
204
|
assert_equal(p.select{ |part| part[:entry] =~/xl\/sharedStrings.xml/}.size, 1, "shared strings table missing")
|
193
205
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'tc_helper.rb'
|
2
|
+
class TestMimeTypeUtils < Test::Unit::TestCase
|
3
|
+
def setup
|
4
|
+
@test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
|
5
|
+
end
|
6
|
+
|
7
|
+
def teardown
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_mime_type_utils
|
11
|
+
assert_equal(Axlsx::MimeTypeUtils::get_mime_type(@test_img), 'image/jpeg')
|
12
|
+
end
|
13
|
+
end
|
data/test/util/tc_validators.rb
CHANGED
@@ -91,7 +91,7 @@ class TestValidators < Test::Unit::TestCase
|
|
91
91
|
assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 10.0 }
|
92
92
|
assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 400.1 }
|
93
93
|
assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 "99" }
|
94
|
-
|
94
|
+
|
95
95
|
#scale_0_10_400
|
96
96
|
assert_nothing_raised { Axlsx.validate_scale_0_10_400 0 }
|
97
97
|
assert_nothing_raised { Axlsx.validate_scale_0_10_400 10 }
|
@@ -101,7 +101,7 @@ class TestValidators < Test::Unit::TestCase
|
|
101
101
|
assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 10.0 }
|
102
102
|
assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 400.1 }
|
103
103
|
assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 "99" }
|
104
|
-
|
104
|
+
|
105
105
|
#page_orientation
|
106
106
|
assert_nothing_raised { Axlsx.validate_page_orientation :default }
|
107
107
|
assert_nothing_raised { Axlsx.validate_page_orientation :landscape }
|
@@ -109,7 +109,7 @@ class TestValidators < Test::Unit::TestCase
|
|
109
109
|
assert_raise(ArgumentError) { Axlsx.validate_page_orientation nil }
|
110
110
|
assert_raise(ArgumentError) { Axlsx.validate_page_orientation 1 }
|
111
111
|
assert_raise(ArgumentError) { Axlsx.validate_page_orientation "landscape" }
|
112
|
-
|
112
|
+
|
113
113
|
#data_validation_error_style
|
114
114
|
[:information, :stop, :warning].each do |sym|
|
115
115
|
assert_nothing_raised { Axlsx.validate_data_validation_error_style sym }
|
@@ -117,7 +117,7 @@ class TestValidators < Test::Unit::TestCase
|
|
117
117
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
|
118
118
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'warning' }
|
119
119
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
|
120
|
-
|
120
|
+
|
121
121
|
#data_validation_operator
|
122
122
|
[:lessThan, :lessThanOrEqual, :equal, :notEqual, :greaterThanOrEqual, :greaterThan, :between, :notBetween].each do |sym|
|
123
123
|
assert_nothing_raised { Axlsx.validate_data_validation_operator sym }
|
@@ -125,7 +125,7 @@ class TestValidators < Test::Unit::TestCase
|
|
125
125
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
|
126
126
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'lessThan' }
|
127
127
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
|
128
|
-
|
128
|
+
|
129
129
|
#data_validation_type
|
130
130
|
[:custom, :data, :decimal, :list, :none, :textLength, :time, :whole].each do |sym|
|
131
131
|
assert_nothing_raised { Axlsx.validate_data_validation_type sym }
|
@@ -133,7 +133,7 @@ class TestValidators < Test::Unit::TestCase
|
|
133
133
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
|
134
134
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'decimal' }
|
135
135
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
|
136
|
-
|
136
|
+
|
137
137
|
#sheet_view_type
|
138
138
|
[:normal, :page_break_preview, :page_layout].each do |sym|
|
139
139
|
assert_nothing_raised { Axlsx.validate_sheet_view_type sym }
|
@@ -141,7 +141,7 @@ class TestValidators < Test::Unit::TestCase
|
|
141
141
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
|
142
142
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'page_layout' }
|
143
143
|
assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
|
144
|
-
|
144
|
+
|
145
145
|
#active_pane_type
|
146
146
|
[:bottom_left, :bottom_right, :top_left, :top_right].each do |sym|
|
147
147
|
assert_nothing_raised { Axlsx.validate_pane_type sym }
|
@@ -149,7 +149,7 @@ class TestValidators < Test::Unit::TestCase
|
|
149
149
|
assert_raise(ArgumentError) { Axlsx.validate_pane_type :other_symbol }
|
150
150
|
assert_raise(ArgumentError) { Axlsx.validate_pane_type 'bottom_left' }
|
151
151
|
assert_raise(ArgumentError) { Axlsx.validate_pane_type 0 }
|
152
|
-
|
152
|
+
|
153
153
|
#split_state_type
|
154
154
|
[:frozen, :frozen_split, :split].each do |sym|
|
155
155
|
assert_nothing_raised { Axlsx.validate_split_state_type sym }
|
@@ -157,8 +157,32 @@ class TestValidators < Test::Unit::TestCase
|
|
157
157
|
assert_raise(ArgumentError) { Axlsx.validate_split_state_type :other_symbol }
|
158
158
|
assert_raise(ArgumentError) { Axlsx.validate_split_state_type 'frozen_split' }
|
159
159
|
assert_raise(ArgumentError) { Axlsx.validate_split_state_type 0 }
|
160
|
+
|
161
|
+
#display_blanks_as
|
162
|
+
[:gap, :span, :zero].each do |sym|
|
163
|
+
assert_nothing_raised { Axlsx.validate_display_blanks_as sym }
|
164
|
+
end
|
165
|
+
assert_raise(ArgumentError) { Axlsx.validate_display_blanks_as :other_symbol }
|
166
|
+
assert_raise(ArgumentError) { Axlsx.validate_display_blanks_as 'other_blank' }
|
167
|
+
assert_raise(ArgumentError) { Axlsx.validate_display_blanks_as 0 }
|
168
|
+
|
169
|
+
#view_visibility
|
170
|
+
[:visible, :hidden, :very_hidden].each do |sym|
|
171
|
+
assert_nothing_raised { Axlsx.validate_view_visibility sym }
|
172
|
+
end
|
173
|
+
assert_raise(ArgumentError) { Axlsx.validate_view_visibility :other_symbol }
|
174
|
+
assert_raise(ArgumentError) { Axlsx.validate_view_visibility 'other_visibility' }
|
175
|
+
assert_raise(ArgumentError) { Axlsx.validate_view_visibility 0 }
|
176
|
+
|
177
|
+
#marker_symbol
|
178
|
+
[:default, :circle, :dash, :diamond, :dot, :picture, :plus, :square, :star, :triangle, :x].each do |sym|
|
179
|
+
assert_nothing_raised { Axlsx.validate_marker_symbol sym }
|
180
|
+
end
|
181
|
+
assert_raise(ArgumentError) { Axlsx.validate_marker_symbol :other_symbol }
|
182
|
+
assert_raise(ArgumentError) { Axlsx.validate_marker_symbol 'other_marker' }
|
183
|
+
assert_raise(ArgumentError) { Axlsx.validate_marker_symbol 0 }
|
160
184
|
end
|
161
|
-
|
185
|
+
|
162
186
|
def test_validate_integerish
|
163
187
|
assert_raise(ArgumentError) { Axlsx.validate_integerish Axlsx }
|
164
188
|
[1, 1.4, "a"].each { |test_value| assert_nothing_raised { Axlsx.validate_integerish test_value } }
|
@@ -179,7 +203,7 @@ class TestValidators < Test::Unit::TestCase
|
|
179
203
|
|
180
204
|
def test_range_validation
|
181
205
|
# exclusive
|
182
|
-
assert_raise(ArgumentError) { Axlsx::RangeValidator.validate('foo', 1, 10, 10, false) }
|
206
|
+
assert_raise(ArgumentError) { Axlsx::RangeValidator.validate('foo', 1, 10, 10, false) }
|
183
207
|
# inclusive by default
|
184
208
|
assert_nothing_raised { Axlsx::RangeValidator.validate('foo', 1, 10, 10) }
|
185
209
|
end
|
@@ -4,10 +4,12 @@ class TestSharedStringsTable < Test::Unit::TestCase
|
|
4
4
|
|
5
5
|
def setup
|
6
6
|
@p = Axlsx::Package.new :use_shared_strings=>true
|
7
|
+
|
7
8
|
ws = @p.workbook.add_worksheet
|
8
9
|
ws.add_row ['a', 1, 'b']
|
9
10
|
ws.add_row ['b', 1, 'c']
|
10
11
|
ws.add_row ['c', 1, 'd']
|
12
|
+
ws.rows.last.add_cell('b', :type => :text)
|
11
13
|
end
|
12
14
|
|
13
15
|
def test_workbook_has_shared_strings
|
@@ -16,7 +18,7 @@ class TestSharedStringsTable < Test::Unit::TestCase
|
|
16
18
|
|
17
19
|
def test_count
|
18
20
|
sst = @p.workbook.shared_strings
|
19
|
-
assert_equal(sst.count,
|
21
|
+
assert_equal(sst.count, 7)
|
20
22
|
end
|
21
23
|
|
22
24
|
def test_unique_count
|
@@ -41,4 +43,17 @@ class TestSharedStringsTable < Test::Unit::TestCase
|
|
41
43
|
assert_equal(errors.size, 0, "sharedStirngs.xml Invalid" + errors.map{ |e| e.message }.to_s)
|
42
44
|
end
|
43
45
|
|
46
|
+
def test_remove_control_characters_in_xml_serialization
|
47
|
+
nasties = "hello\x10\x00\x1C\x1Eworld"
|
48
|
+
@p.workbook.worksheets[0].add_row [nasties]
|
49
|
+
|
50
|
+
# test that the nasty string was added to the shared strings
|
51
|
+
assert @p.workbook.shared_strings.unique_cells.has_key?(nasties)
|
52
|
+
|
53
|
+
# test that none of the control characters are in the XML output for shared strings
|
54
|
+
assert_no_match(/#{Axlsx::CONTROL_CHARS}/, @p.workbook.shared_strings.to_xml_string)
|
55
|
+
|
56
|
+
# assert that the shared string was normalized to remove the control characters
|
57
|
+
assert_not_nil @p.workbook.shared_strings.to_xml_string.index("helloworld")
|
58
|
+
end
|
44
59
|
end
|
@@ -33,6 +33,12 @@ class TestWorkbook < Test::Unit::TestCase
|
|
33
33
|
assert_equal(@wb.use_autowidth, false)
|
34
34
|
end
|
35
35
|
|
36
|
+
def test_is_reversed
|
37
|
+
assert_equal(@wb.is_reversed, nil)
|
38
|
+
assert_raise(ArgumentError) {@wb.is_reversed = 0.1}
|
39
|
+
assert_nothing_raised {@wb.is_reversed = true }
|
40
|
+
assert_equal(@wb.use_autowidth, true)
|
41
|
+
end
|
36
42
|
|
37
43
|
def test_sheet_by_name_retrieval
|
38
44
|
@wb.add_worksheet(:name=>'foo')
|
@@ -98,7 +104,16 @@ class TestWorkbook < Test::Unit::TestCase
|
|
98
104
|
end
|
99
105
|
assert(errors.empty?, "error free validation")
|
100
106
|
end
|
101
|
-
|
107
|
+
|
108
|
+
def test_to_xml_reversed
|
109
|
+
@wb.is_reversed = true
|
110
|
+
@wb.add_worksheet(:name => 'first')
|
111
|
+
second = @wb.add_worksheet(:name => 'second')
|
112
|
+
doc = Nokogiri::XML(@wb.to_xml_string)
|
113
|
+
assert_equal second.name, doc.xpath('//xmlns:workbook/xmlns:sheets/*[1]/@name').to_s
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_range_requires_valid_sheet
|
102
117
|
ws = @wb.add_worksheet :name=>'fish'
|
103
118
|
ws.add_row [1,2,3]
|
104
119
|
ws.add_row [4,5,6]
|
@@ -136,4 +151,10 @@ class TestWorkbook < Test::Unit::TestCase
|
|
136
151
|
doc = Nokogiri::XML(@wb.to_xml_string)
|
137
152
|
assert_equal pivot_table.cache_definition.rId, doc.xpath("//xmlns:pivotCache").first["r:id"]
|
138
153
|
end
|
154
|
+
|
155
|
+
def test_worksheet_name_is_intact_after_serialized_into_xml
|
156
|
+
sheet = @wb.add_worksheet(:name => '_Example')
|
157
|
+
wb_xml = Nokogiri::XML(@wb.to_xml_string)
|
158
|
+
assert_equal sheet.name, wb_xml.xpath('//xmlns:workbook/xmlns:sheets/*[1]/@name').to_s
|
159
|
+
end
|
139
160
|
end
|
@@ -4,6 +4,7 @@ class TestCell < Test::Unit::TestCase
|
|
4
4
|
|
5
5
|
def setup
|
6
6
|
p = Axlsx::Package.new
|
7
|
+
p.use_shared_strings = true
|
7
8
|
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
9
|
p.workbook.styles.add_style :sz=>20
|
9
10
|
@row = @ws.add_row
|
@@ -56,6 +57,19 @@ class TestCell < Test::Unit::TestCase
|
|
56
57
|
assert_equal('foo', @ws.workbook.defined_names.last.name)
|
57
58
|
end
|
58
59
|
|
60
|
+
def test_autowidth
|
61
|
+
style = @c.row.worksheet.workbook.styles.add_style({:alignment => {:horizontal => :center, :vertical => :center, :wrap_text => true}} )
|
62
|
+
@c.style = style
|
63
|
+
assert_equal(@c.autowidth, 5.5)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_time
|
67
|
+
@c.type = :time
|
68
|
+
now = DateTime.now
|
69
|
+
@c.value = now
|
70
|
+
assert_equal(@c.value, now.to_time)
|
71
|
+
end
|
72
|
+
|
59
73
|
def test_style
|
60
74
|
assert_raise(ArgumentError, "must reject invalid style indexes") { @c.style=@c.row.worksheet.workbook.styles.cellXfs.size }
|
61
75
|
assert_nothing_raised("must allow valid style index changes") {@c.style=1}
|
@@ -119,6 +133,19 @@ class TestCell < Test::Unit::TestCase
|
|
119
133
|
assert_equal("2012-10-10T12:24", @c.send(:cast_value, "2012-10-10T12:24"))
|
120
134
|
end
|
121
135
|
|
136
|
+
def test_cast_time_subclass
|
137
|
+
subtime = Class.new(Time) do
|
138
|
+
def to_time
|
139
|
+
raise "#to_time of Time subclass should not be called"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
time = subtime.now
|
144
|
+
|
145
|
+
@c.type = :time
|
146
|
+
assert_equal(time, @c.send(:cast_value, time))
|
147
|
+
end
|
148
|
+
|
122
149
|
def test_color
|
123
150
|
assert_raise(ArgumentError) { @c.color = -1.1 }
|
124
151
|
assert_nothing_raised { @c.color = "FF00FF00" }
|
@@ -225,7 +252,7 @@ class TestCell < Test::Unit::TestCase
|
|
225
252
|
@c.merge @row.cells.last
|
226
253
|
assert_equal(@c.row.worksheet.send(:merged_cells).last, "A1:C1")
|
227
254
|
end
|
228
|
-
|
255
|
+
|
229
256
|
def test_reverse_merge_with_cell
|
230
257
|
@c.row.add_cell 2
|
231
258
|
@c.row.add_cell 3
|
@@ -271,7 +298,7 @@ class TestCell < Test::Unit::TestCase
|
|
271
298
|
c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
|
272
299
|
assert_equal(c_xml.xpath("/c[@s=1]").size, 1)
|
273
300
|
end
|
274
|
-
|
301
|
+
|
275
302
|
def test_to_xml_string_with_run
|
276
303
|
# Actually quite a number of similar run styles
|
277
304
|
# but the processing should be the same
|
@@ -281,7 +308,7 @@ class TestCell < Test::Unit::TestCase
|
|
281
308
|
@c.font_name = 'arial'
|
282
309
|
@c.color = 'FF0000'
|
283
310
|
c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
|
284
|
-
assert(c_xml.xpath("//b"))
|
311
|
+
assert(c_xml.xpath("//b").any?)
|
285
312
|
end
|
286
313
|
|
287
314
|
def test_to_xml_string_formula
|
@@ -290,8 +317,8 @@ class TestCell < Test::Unit::TestCase
|
|
290
317
|
sheet.add_row ["=IF(2+2=4,4,5)"]
|
291
318
|
end
|
292
319
|
doc = Nokogiri::XML(ws.to_xml_string)
|
293
|
-
|
294
|
-
|
320
|
+
doc.remove_namespaces!
|
321
|
+
assert(doc.xpath("//f[text()='IF(2+2=4,4,5)']").any?)
|
295
322
|
end
|
296
323
|
|
297
324
|
def test_to_xml_string_array_formula
|
@@ -301,9 +328,24 @@ class TestCell < Test::Unit::TestCase
|
|
301
328
|
end
|
302
329
|
doc = Nokogiri::XML(ws.to_xml_string)
|
303
330
|
doc.remove_namespaces!
|
304
|
-
assert(doc.xpath("//f[text()='SUM(C2:C11*D2:D11)']"))
|
305
|
-
assert(doc.xpath("//f[@t='array']"))
|
306
|
-
assert(doc.xpath("//f[@ref='A1']"))
|
331
|
+
assert(doc.xpath("//f[text()='SUM(C2:C11*D2:D11)']").any?)
|
332
|
+
assert(doc.xpath("//f[@t='array']").any?)
|
333
|
+
assert(doc.xpath("//f[@ref='A1']").any?)
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_to_xml_string_text_formula
|
337
|
+
p = Axlsx::Package.new
|
338
|
+
ws = p.workbook.add_worksheet do |sheet|
|
339
|
+
sheet.add_row ["=1+1", "-1+1"], type: :text
|
340
|
+
end
|
341
|
+
doc = Nokogiri::XML(ws.to_xml_string)
|
342
|
+
doc.remove_namespaces!
|
343
|
+
|
344
|
+
assert(doc.xpath("//f[text()='1+1']").empty?)
|
345
|
+
assert(doc.xpath("//t[text()='=1+1']").any?)
|
346
|
+
|
347
|
+
assert(doc.xpath("//f[text()='1+1']").empty?)
|
348
|
+
assert(doc.xpath("//t[text()='-1+1']").any?)
|
307
349
|
end
|
308
350
|
|
309
351
|
def test_font_size_with_custom_style_and_no_sz
|
@@ -322,17 +364,17 @@ class TestCell < Test::Unit::TestCase
|
|
322
364
|
sz = @c.send(:font_size)
|
323
365
|
assert_equal(sz, 52)
|
324
366
|
end
|
325
|
-
|
367
|
+
|
326
368
|
def test_cell_with_sz
|
327
369
|
@c.sz = 25
|
328
370
|
assert_equal(25, @c.send(:font_size))
|
329
371
|
end
|
330
|
-
|
372
|
+
|
331
373
|
def test_to_xml
|
332
374
|
# TODO This could use some much more stringent testing related to the xml content generated!
|
333
375
|
@ws.add_row [Time.now, Date.today, true, 1, 1.0, "text", "=sum(A1:A2)", "2013-01-13T13:31:25.123"]
|
334
376
|
@ws.rows.last.cells[5].u = true
|
335
|
-
|
377
|
+
|
336
378
|
schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
|
337
379
|
doc = Nokogiri::XML(@ws.to_xml_string)
|
338
380
|
errors = []
|