Skip to content

Commit 4539ffd

Browse files
committed
Range reference to easily use some feature (#504)
This patch introduce following methods to easily use auto_filter, table, etc. - Worksheet#top_left_reference - Worksheet#bottom_right_reference - Worksheet#range_reference
1 parent d41258e commit 4539ffd

File tree

3 files changed

+71
-3
lines changed

3 files changed

+71
-3
lines changed

examples/auto_filter.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
require 'axlsx'
66
Axlsx::Package.new do |p|
77
p.workbook.add_worksheet(:name => "Table") do |sheet|
8-
sheet.add_row ["Build Matrix"]
98
sheet.add_row ["Build", "Duration", "Finished", "Rvm"]
109
sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
1110
sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
1211
sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
13-
sheet.auto_filter = 'A2:D5'
12+
sheet.auto_filter = sheet.range_reference # => "A1:D4"
1413
sheet.auto_filter.add_column 3, :filters, :filter_items => ['1.9.2']
1514
end
1615
p.workbook.add_worksheet(:name => "Table 2") do |sheet|
@@ -19,7 +18,7 @@
1918
sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
2019
sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
2120
sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
22-
sheet.auto_filter = 'A2:D5'
21+
sheet.auto_filter = "A2:#{sheet.bottom_right_reference}" # => 'A2:D5'
2322
sheet.auto_filter.add_column 3, :filters, :filter_items => ['1.9.2']
2423
end
2524
end.serialize('auto_filter.xlsx')

lib/axlsx/workbook/worksheet/worksheet.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,53 @@ def outline_level_columns(start_index, end_index, level = 1, collapsed = true)
682682
outline column_info, (start_index..end_index), level, collapsed
683683
end
684684

685+
# The excel-style reference of the top-left cell of this worksheet, e.g., A1
686+
# @return String
687+
def top_left_reference
688+
raise "worksheet has no data" if rows.empty? or rows.first.empty?
689+
rows.first.first.r
690+
end
691+
692+
# The excel-style reference of the bottom-right cell of this worksheet, e.g., D5
693+
# This method is useful when you want to apply auto_filter or table to dynamic length data.
694+
#
695+
# @example
696+
# Axlsx::Package.new do |p|
697+
# p.workbook.add_worksheet(:name => "Table 2") do |sheet|
698+
# sheet.add_row ["Build Matrix"]
699+
# sheet.add_row ["Build", "Duration", "Finished", "Rvm"]
700+
# sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
701+
# sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
702+
# sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
703+
# sheet.auto_filter = "A2:#{sheet.bottom_right_reference}" # => 'A2:D5'
704+
# sheet.auto_filter.add_column 3, :filters, :filter_items => ['1.9.2']
705+
# end
706+
# end
707+
# @return String
708+
def bottom_right_reference
709+
raise "worksheet has no data" if rows.empty? or rows.last.empty?
710+
rows.last.last.r
711+
end
712+
713+
# The excel-style reference of the range of this worksheet, e.g., A1:D5
714+
# This method is useful when you just want to apply auto_filter or table to whole worksheet.
715+
#
716+
# @example
717+
# Axlsx::Package.new do |p|
718+
# p.workbook.add_worksheet(:name => "Table") do |sheet|
719+
# sheet.add_row ["Build", "Duration", "Finished", "Rvm"]
720+
# sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
721+
# sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
722+
# sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
723+
# sheet.auto_filter = sheet.range_reference # => "A1:D4"
724+
# sheet.auto_filter.add_column 3, :filters, :filter_items => ['1.9.2']
725+
# end
726+
# end
727+
# @return String
728+
def range_reference
729+
"#{top_left_reference}:#{bottom_right_reference}"
730+
end
731+
685732
private
686733

687734
def xml_space

test/workbook/worksheet/tc_worksheet.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,28 @@ def test_referencing
163163
assert_equal(range.last, @ws.rows.last.cells.last)
164164
end
165165

166+
def test_corner_reference
167+
@ws.add_row [1, 2, 3]
168+
@ws.add_row [4, 5, 6]
169+
assert_equal(@ws.top_left_reference, "A1")
170+
assert_equal(@ws.bottom_right_reference, "C2")
171+
end
172+
173+
def test_corner_reference_raise_exception_if_no_row
174+
assert_raise(RuntimeError, "worksheet has no data"){ @ws.top_left_reference }
175+
assert_raise(RuntimeError, "worksheet has no data"){ @ws.bottom_right_reference }
176+
end
177+
178+
def test_range_reference
179+
@ws.add_row [1, 2, 3]
180+
@ws.add_row [4, 5, 6]
181+
assert_equal(@ws.range_reference, 'A1:C2')
182+
end
183+
184+
def test_range_reference_raise_exception_if_no_row
185+
assert_raise(RuntimeError, "worksheet has no data"){ @ws.range_reference }
186+
end
187+
166188
def test_add_row
167189
assert(@ws.rows.empty?, "sheet has no rows by default")
168190
r = @ws.add_row([1,2,3])

0 commit comments

Comments
 (0)