Class: Axlsx::AutoFilter

Inherits:
Object
  • Object
show all
Defined in:
lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb

Overview

This class represents an auto filter range in a worksheet

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(worksheet) ⇒ AutoFilter

creates a new Autofilter object

Raises:

  • (ArgumentError)


12
13
14
15
# File 'lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb', line 12

def initialize(worksheet)
  raise ArgumentError, 'you must provide a worksheet' unless worksheet.is_a?(Worksheet)
  @worksheet = worksheet
end

Instance Attribute Details

#rangeString

The range the autofilter should be applied to. This should be a string like 'A1:B8'



22
23
24
# File 'lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb', line 22

def range
  @range
end

#worksheetObject (readonly)

Returns the value of attribute worksheet.



17
18
19
# File 'lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb', line 17

def worksheet
  @worksheet
end

Instance Method Details

#add_column(col_id, filter_type, options = {}) ⇒ FilterColumn

Adds a filter column. This is the recommended way to create and manage filter columns for your autofilter. In addition to the require id and type parameters, options will be passed to the filter column during instantiation.



45
46
47
48
# File 'lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb', line 45

def add_column(col_id, filter_type, options = {})
  columns << FilterColumn.new(col_id, filter_type, options)
  columns.last
end

#applyObject

actually performs the filtering of rows who's cells do not match the filter.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb', line 52

def apply
  first_cell, last_cell = range.split(':')
  start_point = Axlsx::name_to_indices(first_cell)
  end_point = Axlsx::name_to_indices(last_cell)
  # The +1 is so we skip the header row with the filter drop downs
  rows = worksheet.rows[(start_point.last+1)..end_point.last] || []

  column_offset = start_point.first
  columns.each do |column|
    rows.each do |row|
      next if row.hidden
      column.apply(row, column_offset)
    end
  end
end

#columnsSimpleTypedList

A collection of filterColumns for this auto_filter



35
36
37
# File 'lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb', line 35

def columns
  @columns ||= SimpleTypedList.new FilterColumn
end

#defined_nameString

the formula for the defined name required for this auto filter This prepends the worksheet name to the absolute cell reference e.g. A1:B2 -> 'Sheet1'!$A$1:$B$2



28
29
30
31
# File 'lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb', line 28

def defined_name
  return unless range
  Axlsx.cell_range(range.split(':').collect { |name| worksheet.name_to_cell(name)})
end

#to_xml_string(str = '') ⇒ String

serialize the object



69
70
71
72
73
74
# File 'lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb', line 69

def to_xml_string(str='')
  return unless range
  str << "<autoFilter ref='#{range}'>"
  columns.each { |filter_column| filter_column.to_xml_string(str) }
  str << "</autoFilter>"
end