class Axlsx::SharedStringsTable

The Shared String Table class is responsible for managing and serializing common strings in a workbook. While the ECMA-376 spec allows for both inline and shared strings it seems that at least some applications like iWorks Numbers and Google Docs require that the shared string table is populated in order to interoperate properly. As a developer, you should never need to directly work against this class. Simply set ‘use_shared_strings’ on the package or workbook to generate a package that uses the shared strings table instead of inline strings. @note Serialization performance is affected by using this serialization method so if you do not need interoperability it is recomended that you use the default inline string method of serialization.

Attributes

count[R]

The total number of strings in the workbook including duplicates Empty cells are treated as blank strings @return [Integer]

unique_cells[R]

An array of unique cells. Multiple attributes of the cell are used in comparison each of these unique cells is parsed into the shared string table. @see Cell#sharable

xml_space[R]

The xml:space attribute @see Workbook#xml_space

Public Class Methods

new(cells, xml_space=:preserve) click to toggle source

Creates a new Shared Strings Table agains an array of cells @param [Array] cells This is an array of all of the cells in the workbook @param [Symbol] xml_space The xml:space behavior for the shared string table.

# File lib/axlsx/workbook/shared_strings_table.rb, line 36
def initialize(cells, xml_space=:preserve)
  @index = 0
  @xml_space = xml_space
  @unique_cells = {}
  @shared_xml_string = ""
  shareable_cells = cells.flatten.select{ |cell| cell.plain_string? || cell.contains_rich_text? }
  @count = shareable_cells.size
  resolve(shareable_cells)
end

Public Instance Methods

to_xml_string(str='') click to toggle source

Serializes the object @param [String] str @return [String]

# File lib/axlsx/workbook/shared_strings_table.rb, line 49
def to_xml_string(str='')
  Axlsx::sanitize(@shared_xml_string)
  str << ('<?xml version="1.0" encoding="UTF-8"?><sst xmlns="' << XML_NS << '"')
  str << (' count="' << @count.to_s << '" uniqueCount="' << unique_count.to_s << '"')
  str << (' xml:space="' << xml_space.to_s << '">' << @shared_xml_string << '</sst>')
end
unique_count() click to toggle source

The total number of unique strings in the workbook. @return [Integer]

# File lib/axlsx/workbook/shared_strings_table.rb, line 20
def unique_count
  @unique_cells.size
end

Private Instance Methods

resolve(cells) click to toggle source

Interate over all of the cells in the array. if our unique cells array does not contain a sharable cell, add the cell to our unique cells array and set the ssti attribute on the index of this cell in the shared strings table if a sharable cell already exists in our unique_cells array, set the ssti attribute of the cell and move on. @return [Array] unique cells

# File lib/axlsx/workbook/shared_strings_table.rb, line 63
def resolve(cells)
  cells.each do |cell|
    cell_hash = cell.value
    if index = @unique_cells[cell_hash]
      cell.send :ssti=, index
    else
      cell.send :ssti=, @index
      @shared_xml_string << '<si>' << CellSerializer.run_xml_string(cell) << '</si>'
      @unique_cells[cell_hash] = @index
      @index += 1
    end
  end
end