繁体   English   中英

Rails axlsx gem-公式无法转义

[英]Rails axlsx gem - Formula not escaping

有没有一种方法可以在呈现电子表格时忽略执行公式?

目前,即使我给出:formula => :false:type=> :stringsheet.add_row("=10+10")也会计算为20

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

我在Stop Excel中从自动将某些文本值转换为日期中找到了答案

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中打开类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

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

我找到了另一种方法。 答案中提到的方法中,尽管在打开电子表格时未执行该公式,但是会评估用户是否单击该公式然后使其模糊。 这可能不是最佳解决方案。

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

例如

= 9 + 9可以用= TEXT(“ 9 + 9”,“#”)代替,它将按原样打印,而无需评估。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM