首页 > 解决方案 > CAxlsx中包含字符串的单元格的ConditionalFormatting

问题描述

使用 CAxlsx gem ( https://github.com/caxlsx/caxlsx ),我正在尝试向一系列单元格添加条件格式,如果单元格包含字符,则应在其中应用样式-。这是我目前正在使用的片段。

worksheet.add_conditional_formatting(range,
      type: :containsText,
      formula: "-",
      dxfId: @styles[:invalid],
      priority: 1)

不幸的是,这似乎不起作用。当单元格不包含文本而是负数时,它似乎确实应用了样式,但这不是我的用例。文档也严重缺乏,并且没有提供很多关于在这种情况下应该做什么的解释。(例如,有一种cellIs类型,containsText可以使用运算符,但也有一种containsText类型,没有解释它们之间的区别 -在我的情况下似乎都不起作用。)任何指针都将不胜感激,所以到目前为止,这只是反复试验。

标签: rubyformattingconditional-statementscaxlsx

解决方案


假设您的范围类似于"A1:A4" 您正在寻找的公式是NOT(ISERROR(SEARCH("-",A1)))文档

例子:

require 'axlsx'
package = Axlsx::Package.new
workbook = package.workbook
s = workbook.styles.add_style({b:true, type: :dxf})
rows = ['a','b-c','d','e-f']
workbook.add_worksheet do |sheet|
  rows.each do |row| 
    sheet.add_row [row]
  end
  sheet.add_conditional_formatting("A1:A4", { :type => :containsText,
    :operator => :containsText,
    :formula => 'NOT(ISERROR(SEARCH("-",A1)))',
    :dxfId => s,
    :priority => 1 })
end

package.serialize('conditional_test.xlsx')

我发现确定适当公式的最简单方法是:

  • 手动新建excel工作簿
  • 填写适当数量的单元格
  • 在excel中有条件地格式化它们
  • 保存此工作簿并关闭
  • 将扩展名更改为 .zip(因为 xlsx 只是压缩的 XML 文件)
  • 打开 zip 文件并导航到 /xl/worksheets/sheet1.xml
  • 打开此文件,它将显示用于条件格式的公式,例如
<x14:conditionalFormattings>
  <x14:conditionalFormatting xmlns:xm="http://schemas.microsoft.com/office/excel/2006/main">
    <x14:cfRule type="containsText" priority="1" operator="containsText" id="{E75522C8-BC6E-4142-B282-D21DF586C852}">
      <xm:f>NOT(ISERROR(SEARCH("-",A1)))</xm:f>
      <xm:f>"-"</xm:f>
      <x14:dxf>
        <font>
           <color rgb="FF9C0006"/>
        </font>
        <fill>
          <patternFill>
            <bgColor rgb="FFFFC7CE"/>
          </patternFill>
        </fill>
      </x14:dxf>
    </x14:cfRule>
    <xm:sqref>A1:A4</xm:sqref>
  </x14:conditionalFormatting>
</x14:conditionalFormattings>

推荐阅读