axlsx:acts_as_xlsx:我如何只为一个单元格添加样式?

时间:2013-09-11 14:29:45

标签: format axlsx

我看到col_style和row_style以及add_conditional_formatting的方法,但无法弄清楚如何只设置一个单元格。在我的示例中,col 1是日期,列2是百分比。当我突出显示行的背景时,我会丢失日期/百分比格式,因为Randy解释说一个单元格只能有1种样式。如何在必要时将date_with_background样式分配给该行中的第一个单元格?

xlsx_package = Stuff.all.to_xlsx
xlsx_package.workbook.worksheets.first.tap do |sheet|

  sheet.col_style 0, date_format, {row_offset: 1}
  sheet.col_style 1, percent_format, {row_offset: 1}

  list_of_my_stuff.each_with_index do |item,index|
    if needs_background?(item)
      sheet.row_style index+1, with_background
    else
      sheet.row_style index+1, no_background
    end
  end
end

4 个答案:

答案 0 :(得分:4)

我也希望设置一个单元格的样式,而不是在创建表格时进行前进,而是实际编辑它。如果合并一堆单元格,这非常有用。在axlsx文档中并没有真正强调它,但你可以直接访问单元格及其样式。

这样的事情:

wb = xlsx_package.workbook

wb.styles do |s|

  title_style = s.add_style :sz => 20, :alignment => { :horizontal=> :center }, :border => { :style => :thick, :color => "000000", :edges => [:left, :right, :top, :bottom] }

  wb.add_worksheet(name: "Standard Chart") do |sheet|

    #make a 30x30 spread sheet testbench of one space cells
    30.times { sheet.add_row Array.new(30, " ") }

    #merge some particular cells into a 4x4 block
    sheet.rows[7].cells[5].merge sheet.rows[10].cells[8]

    #set values for our merged cell and one on either side
    sheet.rows[7].cells[4].value = 'foo'
    sheet.rows[7].cells[5].value = "I am cell #{sheet.rows[7].cells[5].r}"
    sheet.rows[7].cells[9].value = 'bar'

    #style ONLY our merged cell
    sheet.rows[7].cells[5].style = title_style
  end

end #end styles

xlsx_package.use_shared_strings = true

希望有人帮助^ _ ^

答案 1 :(得分:1)

看起来你直接使用acts_as_xlsx而不是axlsx。 虽然您可以转置'list_of_my_stuff'并使用'percent_highlight_style'迭代第二列,但我认为您真的想要做的事情超出了这么简单的宝石。

替代方案

axlsx是acts_as_xlsx包装的父gem。您可能希望在应用程序中创建一些视图对象或报告生成类,这些类可以获取您想要序列化的数据并根据需要应用标题和样式。

rails_axlsx是基于axlsx的另一个宝石,它允许您创建视图并更多地控制电子表格的生成方式,并且可能比直接转到axlsx更容易。

答案 2 :(得分:0)

要将样式应用于一个单元格,当您调用add_row时,可以在结尾处指定样式数组。将你的风格放在第一个,然后用零填充。我认为如果你在数组中只有一个样式,它可能也可以工作,因为你想要它在第一列,但我不确定。免费尝试。

示例:

my_style = sheet.add_style :b=>true

sheet.add_row ["One","Two","Three"],:styles=>[my_style].fill(1..2,nil)

答案 3 :(得分:0)

而不是将整个formatter = formatter.withLocale(Locale.ENGLISH); 包裹在sheet中,您可以创建如下的样式

styles

并使用如下风格

wb = xlsx_package.workbook
header_style = wb.styles.add_style(
  { alignment:
      { horizontal: :center,
        vertica: :center,
        wrap_text: true
      },
    b: true,
    bg_color: '00',
    fg_colog: 'ff'
  })

希望这有助于某人。