Ячейка формата драгоценного камня Ruby Spreadsheet перестает работать на третьем листе

Я пытаюсь установить цвет фона для таблицы. он хорошо работает с этим кодом. Но если в моей книге более 3 листов, set_format не будет работать в 4-й ячейке строки третьего листа (8). Все форматирование не будет работать с этого момента. каждый созданный файл xls имеет тот же результат. он останавливается на этой конкретной ячейке, вся остальная часть книги больше не имеет стилей. Любое предложение?

пожалуйста, смотрите прикрепленное изображение.

def make_xls
      book = Spreadsheet::Workbook.new
      sheet = book.create_worksheet 
      4.times { |x| sheet.column(x).width = 30 }
      4.times { |x| sheet.row(0).set_format(x, title_format) }
      4.times { |x| sheet.row(1).set_format(x, header_format) }
      4.times { |x| sheet.row(7).set_format(x, title_format) }
      4.times { |x| sheet.row(8).set_format(x, header_format) }

      insert_values..
   end

  def title_format
    Spreadsheet::Format.new(
      weight: :bold,
      pattern: 1,
      pattern_fg_color: :silver
    )
  end

  def header_format
    Spreadsheet::Format.new(
      color: :white,
      pattern: 1,
      pattern_fg_color: :xls_color_48,
      weight: :bold
    )
  end

отсутствует формат четвертой ячейки

Любое предложение приветствуется, я использую электронную таблицу (1.2.6), RoR6.


person noobs    schedule 05.06.2020    source источник


Ответы (1)


Не следует создавать несколько форматов. Вместо этого создайте их один раз и повторно используйте при необходимости.

Проблема в следующем:

4.times { |x| sheet.row(0).set_format(x, title_format) }

создает 4 новых формата, затем

4.times { |x| sheet.row(7).set_format(x, title_format) }

создает еще 4. Несмотря на то, что все они выглядят одинаково, на самом деле это 8 отдельных форматов. Итак, только в коде, который вы разместили, вы создали 16 отдельных стилей в этой книге.

Excel может обрабатывать только такое количество форматов, прежде чем он действительно расстроится (обычно это приводит к повреждению)

Часть Note на этом сайте (в разделе Причина) не применяется к программному добавлению стилей при программном добавлении стилей будет создана отдельная ссылка для каждого нового стиля без определения того, существует ли такой стиль уже

Вместо этого попробуйте следующее:

  TITLE_FORMAT = Spreadsheet::Format.new(weight: :bold,pattern: 1,pattern_fg_color: :silver)
  HEADER_FORMAT =  Spreadsheet::Format.new(color: :white,pattern: 1,pattern_fg_color: :xls_color_48,weight: :bold)

  def make_xls
      book = Spreadsheet::Workbook.new
      sheet = book.create_worksheet 
      4.times { |x| sheet.column(x).width = 30 }
      4.times { |x| sheet.row(0).set_format(x, TITLE_FORMAT) }
      4.times { |x| sheet.row(1).set_format(x, HEADER_FORMAT ) }
      4.times { |x| sheet.row(7).set_format(x, TITLE_FORMAT) }
      4.times { |x| sheet.row(8).set_format(x, HEADER_FORMAT ) }
   end

И посмотрите, поможет ли это

person engineersmnky    schedule 05.06.2020
comment
Спасибо! что сделал это. Я изменил шаблон на @_title_format ||= Spreadsheet::Format.new. Это была моя ошибка, надо было подумать, но когда-то метод абстрагировался от части кода, с глаз долой, из сердца вон. - person noobs; 07.06.2020