Rails axlsxgem – 公式不逃避
有没有办法在呈现电子表格时忽略执行公式?
目前, sheet.add_row("=10+10")
将评估20,即使我给:formula => :false
或:type=> :string
唯一的方法是提供一个单引号,但这不是一个漂亮的方法。
我查看了有问题的gem的源代码,下面的代码在那里:
def is_formula? @type == :string && @value.to_s.start_with?('=') end
这意味着任何types为'='的string将被视为一个公式。 而唯一被接受的types是date,string,整数,浮点数等其他的代替:type =>:string,它不接受它。
作为替代scheme,我不得不在gem中打开类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
我意识到这是一个黑客的方式,但它影响系统范围的代码。 如果将来我需要任何复杂的东西,我总是可以改变一个中心的地方。
我在Stop Excel中find了一个答案, 可以自动将某些文本值转换为date
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
这导致:
我find了另一种方法。 在本答案中提到的方法中,虽然公式在电子表格打开时不会执行,但会评估用户是否点击它然后模糊。 这可能不是最好的解决scheme。
更好的解决scheme是在TEXT函数中包装所有的Excel函数。 这确保了公式不被执行。
例如
= 9 + 9可以用= TEXT(“9 + 9”,“#”)代替,并且它将被打印,没有评估。