lib/axlsx/workbook/shared_strings_table.rb in axlsx-1.0.18 vs lib/axlsx/workbook/shared_strings_table.rb in axlsx-1.1.0

- old
+ new

@@ -1,11 +1,11 @@ # encoding: UTF-8 module Axlsx # 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. + # 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. class SharedStringsTable @@ -13,59 +13,57 @@ # The total number of strings in the workbook including duplicates # Empty cells are treated as blank strings # @return [Integer] attr_reader :count - # The total number of unique strings in the workbook. + # The total number of unique strings in the workbook. # @return [Integer] def unique_count @unique_cells.size end # 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. + # each of these unique cells is parsed into the shared string table. # @see Cell#sharable attr_reader :unique_cells # 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 def initialize(cells) - cells = cells.flatten.reject { |c| c.type != :string || c.value.start_with?('=') } + cells = cells.flatten.reject { |c| c.type != :string || c.value.nil? || c.value.start_with?('=') } @count = cells.size @unique_cells = [] + @shared_xml_string = "" resolve(cells) end - - # Generate the xml document for the Shared Strings Table + # Serializes the object + # @param [String] str # @return [String] - def to_xml - builder = Nokogiri::XML::Builder.new(:encoding => ENCODING) do |xml| - xml.sst(:xmlns => Axlsx::XML_NS, :count => count, :uniqueCount => unique_count) { - @unique_cells.each do |cell| - xml.si { cell.run_xml(xml) } - end - } - end - builder.to_xml(:save_with => 0) + def to_xml_string + '<?xml version="1.0" encoding="UTF-8"?><sst xmlns="' << XML_NS << '" count="' << @count.to_s << '" uniqueCount="' << unique_count.to_s << '">' << @shared_xml_string << '</sst>' end private - - # Interate over all of the cells in the array. - # if our unique cells array does not contain a sharable cell, + + # 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 def resolve(cells) cells.each do |cell| - index = @unique_cells.index { |item| item.shareable(cell) } + cell_hash = cell.shareable_hash + index = @unique_cells.index do |item| + item == cell_hash + end if index == nil cell.send :ssti=, @unique_cells.size - @unique_cells << cell + @shared_xml_string << '<si>' << cell.run_xml_string << '</si>' + @unique_cells << cell_hash else cell.send :ssti=, index end end - end + end end end