Rails axlsx gem - 公式不转义

Rails axlsx gem - Formula not escaping

有没有办法在呈现电子表格时忽略执行公式?

目前,sheet.add_row("=10+10") 将评估 20,即使我给出 :formula => :false:type=> :string

唯一的 hacky 方法是提供单引号,但这不是一个很好的方法。

我在 Stop Excel from automatically converting certain text values to dates

中找到了答案
require 'axlsx'
Axlsx::Package.new do |p|
  p.workbook.add_worksheet(:name => 'DATA') do |sheet|
    sheet.add_row(['="10+10"', 'Maybe this is the best solution'])
    sheet.add_row(["'10+10", 'Hack with single quote'])
  end    
  p.serialize('test.xlsx')
end

这导致:

我查看了问题gem的源代码,有如下代码:

def is_formula?
   @type == :string && @value.to_s.start_with?('=')
end

这意味着任何带有“=”的字符串类型都将被视为公式。唯一接受的类型是日期、字符串、整数、浮点数等。任何其他代替 :type => :string 的类型,它都不接受。

作为替代方案,我必须在 gem 中打开 class cell_serializer.rb 并以自定义方式重新实现该方法以摆脱 cell.is_formula?查看。

def string_type_serialization(cell, str='')
      if cell.is_formula?
        formula_serialization cell, str
      elsif !cell.ssti.nil?
        value_serialization 's', cell.ssti.to_s, str
      else
        inline_string_serialization cell, str
      end
 end

重新实现的方法:

def string_type_serialization(cell, str='')
        if !cell.ssti.nil?
          value_serialization 's', cell.ssti.to_s, str
        else
          inline_string_serialization cell, str
        end
end

我意识到这是一种 hacky 方式,但它会影响系统范围的代码。如果我以后需要任何复杂的东西,我总是可以在一个中心位置进行更改。

我找到了另一种方法。在 答案中提到的方法中,虽然在电子表格打开时不会执行公式,但如果用户单击它然后模糊掉,则会对其进行评估。这可能不是最好的解决方案。

更好的解决方案是将任何 excel 函数包装在 TEXT 函数中。这样可以确保不执行公式。

例如

= 9 + 9 can be substituted with =TEXT("9+9","#"), and it will be printed as it is, without evaluation.