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.
有没有办法在呈现电子表格时忽略执行公式?
目前,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.