【问题标题】:axlsx : acts_as_xlsx : how do i add style to only one cell?axlsx :acts_as_xlsx : 如何将样式仅添加到一个单元格?
【发布时间】:2013-09-11 14:29:44
【问题描述】:

我看到了 col_style 和 row_style 以及 add_conditional_formatting 的方法,但不知道如何只设置一个单元格。在我的示例中,第 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

【问题讨论】:

    标签: format axlsx


    【解决方案1】:

    我也想设置一个单元格的样式,而不是在创建表格时继续前进,而是实际编辑它。如果您合并一堆单元格,这将非常有用。在 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
    

    希望对某人有所帮助^_^

    【讨论】:

      【解决方案2】:

      而不是将整个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'
        })
      

      并像下面那样使用这种风格

      heet.add_row ['Name:', 'Address', 'city'], style: header_style
      sheet.rows[0].cells[0].style = header_style
      

      希望这对某人有所帮助。

      【讨论】:

        【解决方案3】:

        看起来您正在使用acts_as_xlsx 而不是直接使用axlsx。 虽然您可以转置您的“list_of_my_stuff”并应用“percent_highlight_style”迭代第二列,但我认为您确实在尝试做一些超出如此简单宝石的事情。

        替代方案

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

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

        【讨论】:

          【解决方案4】:

          要将样式仅应用于一个单元格,当您调用 add_row 时,您可以在末尾指定一组样式。将您的样式放在第一个样式中,其余部分用 nil 填充。我认为如果您在数组中只有一个样式,它也可能有效,就像您在第一列中想要的那样,但我不确定。放心试试吧。

          示例:

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

          【讨论】:

          • 将 :styles 选项传递给 add_row 时,行为会根据 :styles 值的数据类型而改变。如果它是一个数组,样式将按照数组的索引顺序应用于每个单元格。超出数组长度的单元格将不会被设置样式。您可以在该数组中的任何位置使用 nil 来不为元胞数据数组中的任何元素指定样式。如果 :styles 是整数,它将应用于行中的所有单元格。无论哪种方式,发布者都只能访问 row_style 和 col_style,因为它们使用的是acts_as_xlsx。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-24
          • 2022-01-04
          • 1970-01-01
          • 1970-01-01
          • 2021-09-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多