【问题标题】:datatables print customize cell color数据表打印自定义单元格颜色
【发布时间】:2020-09-08 14:05:10
【问题描述】:

我想在打印表格时更改表格单元格的颜色。打印自定义函数被调用并正常工作,但颜色没有改变..

当我渲染初始表格时,我调用 rollCallback 来设置单元格颜色

rowCallback: function(row, data, index){
                    if(data.scores <= 1){
                        $(row).find('td:eq(2)').css('background-color', 'red');
                    }
                    if(data.scores > 1  && data.scores <=2 ){
                        $(row).find('td:eq(2)').css('background-color', 'yellow');
                    }
                    if(data.scores > 2){
                        $(row).find('td:eq(2)').css('background-color', 'green');
                    }
                   
                }

在打印按钮中。我使用相同的代码再次渲染背景颜色

{
                    extend : 'print',
                    text : '<i class="fa fa-print fa-lg"></i>',
                    titleAttr : 'Print',
                    exportOptions : {
                        columns : [0,1,2,4]
                    },
                    customize: function(win,conf,table) {
                        

                        table.rows().every(function(index,element) {
                        
                            if(this.data().scores <= 1)
                            {
                                     $(this).find('td:eq(2)').css('background-color', 'red');
                            }
                             if(this.data().scores > 1  && this.data().scores <=2 )
                            {
                                     $(this).find('td:eq(2)').css('background-color', 'yellow');
                            }
                             if(this.data().scores > 2)
                            {
                                     $(this).find('td:eq(2)').css('background-color', 'green');
                            }
                
                    
                        });

    
                            
                            

                    }
                    
                }

颜色不变.. 我正在使用 jquery-3.5.1 数据表-1.10.21 按钮-1.6.3

使用@andrewjames 回答我得到了更好的结果.. 预览现在有颜色.. 但是当从浏览器使用 ctrl-print 时,我再次失去了样式。

【问题讨论】:

  • 打印预处理器会从打印视图中去除所有手动添加的类和样式 - 如您所见。 this question 中描述了一种解决方法。
  • @andrewjames 我在我的问题中包含了您提供的链接中提到的自定义功能。那对我不起作用。我要做的就是改变单元格的背景颜色。在您证明的示例中,他正在执行类似的方法调用来更改字体大小
  • 我使用其他答案中的方法添加了一个示例 - 希望它有助于澄清。如果我误解了您需要做什么,当然可以告诉我。

标签: datatables


【解决方案1】:

这是我在其他答案中提到的方法,但适用于您的具体情况。

在我的测试数据中,我只有 3 列,所以我对您的代码做了一个小改动 - 我将这个 columns : [0,1,2,4] 更改为这个 columns : [ 0, 1, 2 ]

这是我的起始表:

以下是我添加的一些额外样式:

  <style>
    td.bg_red {
      background-color: red;
    }
    td.bg_yellow {
      background-color: yellow;
    }
    td.bg_green {
      background-color: green;
    }
  </style>

我使用了以下嵌入式测试数据(而不是 ajax 数据源):

var dataSet = [
    { "name" : "Tiger Nixon", 
      "office": "London",
      "scores" : 1 },
    { "name" : "Donna Snider", 
      "office": "New York",
      "scores" : 2 },
    { "name" : "Airi Satou", 
      "office": "Tokyo",
      "scores" : 3 }
];

这是 DataTables 的定义:

<script type="text/javascript">

var dataSet = [
    { "name" : "Tiger Nixon", 
      "office": "London",
      "scores" : 1 },
    { "name" : "Donna Snider", 
      "office": "New York",
      "scores" : 2 },
    { "name" : "Airi Satou", 
      "office": "Tokyo",
      "scores" : 3 }
];

  $(document).ready(function() {
  
    $('#example').DataTable({
      dom: 'Bfrtip',

      data: dataSet,
      columns: [
          { title: "Name", data: "name" },
          { title: "Office", data: "office" },
          { title: "Score", data: "scores" }
      ],

      rowCallback: function(row, data, index){
        if(data.scores <= 1){
          $(row).find('td:eq(2)').addClass("bg_red");
        }
        if(data.scores > 1  && data.scores <=2 ){
          $(row).find('td:eq(2)').addClass("bg_yellow");
        }
        if(data.scores > 2){
          $(row).find('td:eq(2)').addClass("bg_green");
        }             
      },
      
      buttons: [
        {
          extend: 'print',
          //autoPrint: false, // useful for testing
          exportOptions: {
            //columns : [0,1,2,4],
            columns : [ 0, 1, 2 ],
            format: {
              body: function ( inner, rowidx, colidx, node ) {
                if (node.classList.contains('bg_red')) {
                  return '<span class="bg_red">' + inner + '</span>';
                } else if (node.classList.contains('bg_yellow')) {
                  return '<span class="bg_yellow">' + inner + '</span>';
                } else if (node.classList.contains('bg_green')) {
                  return '<span class="bg_green">' + inner + '</span>';
                } else {
                  return inner;
                }
              }
            }
          },
          customize: function ( win, butt, tbl ) {
            $(win.document.body).find('span.bg_red').parent().css('background-color', 'red');
            $(win.document.body).find('span.bg_yellow').parent().css('background-color', 'yellow');
            $(win.document.body).find('span.bg_green').parent().css('background-color', 'green');
          }
      } ]
      
    }); 

  });
</script>

这里是打印预览:

这使用与我在 cmets 中提到的其他答案中描述的相同技术,但适用于您的特定场景。它起作用的原因与该答案中描述的相同。

更新

您可能需要调整打印机设置才能看到实际打印输出的颜色。例如,使用谷歌浏览器:

【讨论】:

  • 适用于预览.. 现在打印时(ctrl-p)它会失去样式.. chrome 和 safari 都会发生
  • 2 分,如果他们有帮助的话:(1) 你可能不需要autoPrint: false。它对调试比其他任何东西都更有用。 (2) 在我的打印机上,我遇到了同样的问题,因为我的打印机默认设置为不显示背景图形。我有一个打印机设置来控制它 - 然后我在打印时得到颜色。也许你有类似的东西?我认为它可能因打印机而异(以及打印机驱动程序)。谷歌浏览器的网络打印机也有一个“背景图形”复选框 - 做同样的事情。
  • 我添加到问题中的图像显示了浏览器如何处理打印控件。他们调用另一个浏览器预览(我假设)并且样式丢失了。或者我还在做某事错了..我确实在 chrome 上启用了背景图形..但我仍然松散了样式
  • 这很烦人。如果您在 Google 打印中使用“目标:另存为 PDF”会怎样?我猜你会遇到同样的问题......不幸的是,我想不出一种方法来重现我这边的问题。 (顺便说一下,我没有使用 Mac。我使用的是 Windows 10。)
  • 这很烦人.. 但是,感谢您花一些时间来处理这个..
猜你喜欢
  • 2012-07-10
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多