def map_headers!(mappings={}, &block)
header_cells = cell_matrix[0]
if block_given?
header_values = header_cells.map { |cell| cell.value } - mappings.keys
mappings = mappings.merge(Hash[*header_values.zip(header_values.map(&block)).flatten])
end
mappings.each_pair do |pre, post|
mapped_cells = header_cells.select{|cell| pre === cell.value}
raise "No headers matched #{pre.inspect}" if mapped_cells.empty?
raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map{|c| c.value}.inspect}" if mapped_cells.length > 1
mapped_cells[0].value = post
if @conversion_procs.has_key?(pre)
@conversion_procs[post] = @conversion_procs.delete(pre)
end
end
end