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”,“#”)代替,并且它将被打印,没有评估。