jQuery如果excel单元格值为负,则将文本着色为红色

Posted

技术标签:

【中文标题】jQuery如果excel单元格值为负,则将文本着色为红色【英文标题】:jQuery if excel cell value is negative, color text red 【发布时间】:2021-02-17 06:40:00 【问题描述】:

我正在使用 Datatables 库来呈现 html 表格,然后单击按钮输出一个 Excel 文档。这是我目前拥有的代码:

    $(document).ready( function () 
      $('#mainTable').DataTable(
        fixedHeader: false,
        dom: 'Bfrtip',
        buttons: [
          
            extend: 'copy', 
            exportOptions: 
              columns: ':not(:first-child)',
              rows: ':visible'
            
          ,
          
            extend: 'excelHtml5',
            title: 'Profit and Loss Report', 
            messageTop: `Ran on $(new Date()).toLocaleString() for period <xsl:value-of select="P_PERIOD_NUM"/> - FY<xsl:value-of select="P_PERIOD_YEAR"/>`,
            messageBottom: `Companies: <xsl:value-of select="P_COMP_CHILD"/> Cost Centers: <xsl:value-of select="P_CC_CHILD_1"/><xsl:value-of select="P_CC_CHILD_2"/>`,
            // Function iterates over each row and applies styling if conditions are met
            customize: function (xlsx) 
                var sheet = xlsx.xl.worksheets['sheet1.xml'];
                var rows = $('row:gt(2)', sheet);
                rows.each(function () 
                  // bold all rows where first cell ends with : (totals, % or revs)
                  if ($('c:first-of-type is t', this).text().endsWith(':')) $('c', this).attr('s', '2');
                  // highlight red all rows that start with - (negative numbers)
                  $('c', this).each(function() 
                    if ($('v', this).text().startsWith('-')) 
                        $(this).attr('s', '11');
                    
                  );
                );
            
          ,
          
            extend: 'pdfHtml5', 
            title: 'Profit and Loss Report', 
            orientation: 'landscape', 
            pageSize: 'LEGAL',
            messageTop: `Ran on $(new Date()).toLocaleString() for period <xsl:value-of select="P_PERIOD_NUM"/> - FY<xsl:value-of select="P_PERIOD_YEAR"/>`,
            messageBottom: `Companies: <xsl:value-of select="P_COMP_CHILD"/> Cost Centers: <xsl:value-of select="P_CC_CHILD_1"/><xsl:value-of select="P_CC_CHILD_2"/>`
           
        ],
        "ordering": false,
        paging: false
      );

如您所见,我有一个函数可以遍历 excel 文件的每一行。第一个 if 语句在第一个单元格字符串的末尾查找 ':'。求和行使用此字符,因此它们是粗体的。

但是,我遇到的问题是这段代码:

if ($('v', this).text().startsWith('-')) 
  $(this).attr('s', '11');

if 语句按预期工作;它选择以 - (负数)开头的每个单元格。 if 语句的主体是问题所在。我想用红色字体来显示负数。值为“11”的属性“s”表示白色文本和红色背景。这和我所得到的一样接近。我找不到任何实际上只是将文本设置为红色的东西。

编辑:我在这里找到了 excel s 属性的值列表,以防万一有用:https://datatables.net/reference/button/excelHtml5

【问题讨论】:

@RoryMcCrossan 我设法将字体更改为适当的颜色。我为您在下面看到的问题添加了自己的答案。我必须做的是用我自己的自定义值覆盖默认字体/填充/边框。然后我可以像正常一样使用“s”属性来引用这些。 很高兴被证明是错误的 :) 很高兴你让它工作了 - 尽管由于 Excel 格式绝对是一场噩梦,那是一些该死的丑陋代码。 【参考方案1】:

编辑:如果你只需要有一种红色字体值,那么你可以替换其中一种预设字体:

var styles = xlsx.xl['styles.xml'];
// change white font to red for negative numbers
$('fonts font:nth-child(2) color', styles).attr('rgb', 'FFFF0000');
// reference this font with $('c').attr('s', '1');

好的,所以我实际上设法完成了这项工作。您必须使用自定义字体/填充/边框值。这些值在“styles.xml”文件中可用。请看下面的代码:

            customize: function (xlsx) 
                // add in custom font for negative numbers
                var styles = xlsx.xl['styles.xml']
                $('fonts', styles).empty();
                $('fonts', styles).attr('count', '3');
                $('fonts', styles).append(`
                  <font>
                    <sz val="11"/>
                    <color rgb="00000000"/>
                    <name val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                  </font>
                  <font>
                    <b/>
                    <sz val="11"/>
                    <color rgb="00000000"/>
                    <name val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                  </font>
                  <font>
                    <sz val="11"/>
                    <color rgb="FFFF0000"/>
                    <name val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                  </font>
                `);
                $('fills', styles).empty();
                $('fills', styles).attr('count', '2');
                $('fills', styles).append(`
                <fill>
                  <patternFill patternType="none"/>
                </fill>
                <fill>
                  <patternFill patternType="gray125"/>
                </fill>
                `);
                $('borders', styles).empty();
                $('borders', styles).attr('count', '1');
                $('borders', styles).append(`
                <border>
                  <left/>
                  <right/>
                  <top/>
                  <bottom/>
                  <diagonal/>
                </border>
                `);
                var sheet = xlsx.xl.worksheets['sheet1.xml'];
                var rows = $('row:gt(2)', sheet);
                rows.each(function () 
                  // bold all rows where first cell ends with : (totals, % or revs)
                  if ($('c:first-of-type is t', this).text().endsWith(':')) $('c', this).attr('s', '1');
                  // highlight red all rows that start with - (negative numbers)
                  $('c', this).each(function() 
                    if ($('v', this).text().startsWith('-')) 
                        console.log($('v', this).text());
                        $(this).attr('s', '2');
                    
                  );
                );
            

这里我去掉了默认字体、填充和边框。我添加了三种字体,标准黑色字体、加粗黑色字体和红色字体。

我还添加了标准填充和边框。

然后我可以使用“s”属性来引用这些。基础价值只是不同。

【讨论】:

以上是关于jQuery如果excel单元格值为负,则将文本着色为红色的主要内容,如果未能解决你的问题,请参考以下文章

匹配两列中的单元格值,如果匹配,则将另一个值复制到空白单元格

从 Excel 中的另一个单元格控制单元格值

根据每个表格行中的单元格值更改按钮文本 - Jquery

Excel在单元格值中转义引号或撇号

将 Excel 格式化为文本格式

使用特殊字符搜索单元格值时 VLOOKUP 的 Excel VBA 替代方案