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

Parameters:

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'

Returns:



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.

Parameters:

  • col_id (String)

    Zero-based index indicating the AutoFilter column to which this filter information applies.

  • filter_type (Symbol)

    A symbol representing one of the supported filter types.

  • options (Hash) (defaults to: {})

    a hash of options to pass into the generated filter

Returns:



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

Returns:

  • (SimpleTypedList)


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

Returns:



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

Returns:



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