DataTables是jQuery JavaScript库的插件。它是一个高度灵活的工具,基于渐进增强的基础,它将为任何HTML表添加高级交互控件。不要与[datatable]一起使用它。
jQuery 数据表导出到 Excel,并带有单元格(<td>)背景色
PFB 是我的代码示例: https://codepen.io/avinash-reddy95/pen/eYzORmJ。 $(文档).ready(函数() { var 表 = $('#example').</desc> <question vote="0"> <p>PFB 是我的代码示例: <a href="https://codepen.io/avinash-reddy95/pen/eYzORmJ" rel="nofollow noreferrer">https://codepen.io/avinash-reddy95/pen/eYzORmJ</a>.</p> <pre><code><script type="text/javascript"> $(document).ready(function () { var table = $('#example').DataTable({ "paging": false, "info": false, searching: false, dom: 'Bfrtip', buttons: [ { extend: 'excelHtml5', title: 'custom' } ] }); }); </script> </code></pre> <p>我正在使用 jQuery datable 来呈现表格并使用 dataTable 导出到 Excel 功能。我能够成功导出 Excel,但如果单元格有任何背景颜色,我想导出到带有单元格背景颜色的 Excel。</p> <p>在上面的示例中,“薪水”、“年龄”、“日期”列的某些单元格颜色为红色,我想用这些颜色导出。有人可以帮我解决这个问题吗?</p> </question> <answer tick="false" vote="0"> <p>此方法可自动创建新的 Excel 样式 - 其中一种样式可用于重新创建具有红色背景的 HTML 表格单元格。</p> <p>起点是这样的数据表:</p> <p><a href="https://i.sstatic.net/jbpsI.png" rel="nofollow noreferrer"><img src="https://cdn.txt58.com/i/AWkuc3N0YXRpYy5uZXQvamJwc0kucG5n" alt="enter image description here"/></a></p> <p>最终结果是这样的:</p> <p><a href="https://i.sstatic.net/a86Fw.png" rel="nofollow noreferrer"><img src="https://cdn.txt58.com/i/AWkuc3N0YXRpYy5uZXQvYTg2RncucG5n" alt="enter image description here"/></a></p> <p>在我的例子中,我选择将那些红色背景的单元格的 Excel 字体设置为白色,只是为了演示目的,但一个小小的更改就会恢复原来的黑色。</p> <p>这是代码:</p> <p></p><div data-babel="false" data-lang="js" data-hide="false" data-console="true"> <div> <pre><code>$(document).ready(function() { var table = $('#example').DataTable( { dom: "Brftip", buttons: [{ extend: 'excelHtml5', customize: function(xlsx) { // set up new styles: let styles = xlsx.xl['styles.xml']; let stylesCount = parseInt($( 'cellXfs', styles ).attr("count"), 10); addCellColorStyles(styles, stylesCount); // use new styles: let sheet = xlsx.xl.worksheets['sheet1.xml']; //$( 'row c', sheet ).attr( 's', (stylesCount + 1).toString() ); highlightCells(sheet, stylesCount); } }] } ); var myFontColors = [ '548235', // idx 0 - mustard 'ffc000', // idx 1 - dark green '000000', // idx 2 - black 'ffffff' // idx 3 - white ]; var myFillColors = [ '548235', // idx 0 - mustard 'ffc000', // idx 1 - dark green 'ff0000' // idx 2 - red ]; var myCellStyles = [ { fontIdx: 0, fillIdx: 1 }, // idx 0 - mustard on green { fontIdx: 1, fillIdx: 0 }, // idx 1 - green on mustard { fontIdx: 2, fillIdx: 2 }, // idx 2 - black on red { fontIdx: 3, fillIdx: 2 } // idx 3 - white on red ]; function addCellColorStyles(styles, stylesCount) { // add font styles: let fontsCount = parseInt($( 'fonts', styles ).attr("count"), 10); myFontColors.forEach((color) => { $( 'fonts', styles ).append( fontTmplt(color.toUpperCase()) ); }); $( 'fonts', styles ).attr("count", (fontsCount + myFontColors.length).toString()); // add fill styles: let fillsCount = parseInt($( 'fills', styles ).attr("count"), 10); myFillColors.forEach((color) => { $( 'fills', styles ).append( fillTmplt(color.toUpperCase()) ); }); $( 'fills', styles ).attr("count", (fillsCount + myFillColors.length).toString()); // add cell styles: myCellStyles.forEach((style) => { $( 'cellXfs', styles ).append( cellXfTmplt(fontsCount + style.fontIdx, fillsCount + style.fillIdx) ); }); $( 'cellXfs', styles ).attr("count", (stylesCount + myCellStyles.length).toString()); } function highlightCells(sheet, stylesCount) { $( '#example' ).dataTable().api().rows( { search: 'applied' } ) .every( function ( rowIdx, tableLoop, rowLoop ) { var xlRow = rowLoop +3; // +1 for DT zero index; +1 for title row; +1 for row heading in Excel $.each( $( 'td', $(this.node()) ), function( index, trNode ) { var bgColor = $(trNode).css("background-color"); if ( bgColor && bgColor === 'rgb(255, 0, 0)' ) { // just handle red backgrounds let xlCol = createXlColLetter(index); let xlRef = xlCol + xlRow; let cellSelector = 'c[r=' + xlRef + ']'; let cellStyle = 3; // 3 is my custom style index for white on red let cellStyleID = (stylesCount + cellStyle).toString(); $(cellSelector, sheet).attr( 's', cellStyleID ); } } ); } ); } // to build an Excel column letter reference from an // integer (1 -> A, 2 -> B, 28 -> AB, and so on...); function createXlColLetter( n ){ var ordA = 'A'.charCodeAt(0); var ordZ = 'Z'.charCodeAt(0); var len = ordZ - ordA + 1; var s = ""; while( n >= 0 ) { s = String.fromCharCode(n % len + ordA) + s; n = Math.floor(n / len) - 1; } return s; } // style templates function fontTmplt(color) { return `<font><sz val="11" /><name val="Calibri" /><color rgb="${'FF' + color}" /></font>`; } function fillTmplt(color) { return `<fill><patternFill patternType="solid"><fgColor rgb="${'FF' + color}" /><bgColor indexed="64" /></patternFill></fill>`; } function cellXfTmplt(fontIdx, fillIdx) { return `<xf numFmtId="0" fontId="${fontIdx}" fillId="${fillIdx}" borderId="0" applyFont="1" applyFill="1" applyBorder="1" />`; } } );</code></pre> <pre><code><!doctype html> <html> <head> <meta charset="UTF-8"> <title>Cell Colors Demo</title> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.12.1/css/jquery.dataTables.min.css"/> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/buttons/2.2.3/css/buttons.dataTables.min.css"/> <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jszip/2.5.0/jszip.min.js"></script> <script type="text/javascript" src="https://cdn.datatables.net/1.12.1/js/jquery.dataTables.min.js"></script> <script type="text/javascript" src="https://cdn.datatables.net/buttons/2.2.3/js/dataTables.buttons.min.js"></script> <script type="text/javascript" src="https://cdn.datatables.net/buttons/2.2.3/js/buttons.html5.min.js"></script> <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css"> </head> <body> <div style="margin: 20px;"> <table id="example" class="display dataTable cell-border" style="width:100%"> <thead> <tr> <th>Name</th> <th>Position</th> <th>Office in Country</th> <th>Age</th> <th>Start date</th> <th>Salary</th> </tr> </thead> <tbody> <tr> <td>Tiger Nixon</td> <td>System Architect</td> <td>Edinburgh</td> <td>61</td> <td>2011/04/25</td> <td>$320,800</td> </tr> <tr> <td>Garrett Winters</td> <td>Accountant</td> <td>Tokyo</td> <td>63</td> <td>2011/07/25</td> <td>$170,750</td> </tr> <tr> <td>Ashton Cox</td> <td>Junior "Technical" Author</td> <td>San Francisco</td> <td>66</td> <td>2009/01/12</td> <td>$86,000</td> </tr> <tr> <td>Cedric Kelly</td> <td>Senior Javascript Developer</td> <td style="background-color: red">Edinburgh</td> <td>22</td> <td>2012/03/29</td> <td>$433,060</td> </tr> <tr> <td>Airi Satou</td> <td>Accountant</td> <td>Tokyo</td> <td style="background-color: red">33</td> <td>2008/11/28</td> <td>$162,700</td> </tr> <tr> <td>Donna Snider</td> <td>Customer Support</td> <td>New York</td> <td>27</td> <td>2011/01/25</td> <td>$112,000</td> </tr> </tbody> </table> </div> </body> </html></code></pre> </div> </div> <p></p> <p>部分代码与我最初的尝试相同,但也有一些差异。主要区别在于,此代码在 <pre><code>addCellColorStyles</code></pre> 函数中自动向 DataTables 创建的 Excel 工作表添加新样式。</p> <p>用户必须首先设置他们想要使用的背景颜色(参见<pre><code>myFillColors</code></pre>) - 以及可选的前景色(字体)颜色。</p> <p>然后将这些组合成新的样式,在 <pre><code>myCellStyles</code></pre>。</p> <p>因为我们要将样式添加到工作表中现有样式的列表中,所以我们必须跟踪样式计数 - 因此有逻辑可以做到这一点 - 并相应地调整自定义样式索引:</p> <pre><code>let cellStyle = 3; // 3 is my custom style index for white on red let cellStyleID = (stylesCount + cellStyle).toString(); </code></pre> <hr/> <p>总的来说,这种方法还假设电子表格的第 1 行有一个标题:</p> <pre><code>var xlRow = rowLoop +3; // +1 for DT zero index; +1 for title row; +1 for row heading in Excel </code></pre> <p>因此,如果标题被抑制,则需要将 <pre><code>+3</code></pre> 调整为 <pre><code>+2</code></pre>。</p> <hr/> <p>但通过这种方法,整个电子表格生成过程都是自动化的。</p> </answer> <answer tick="false" vote="-1"> <p>您对这样的细胞的使用(简化)...</p> <pre><code><td><a href="" style="background-color: red;"><i>$12,345</i></a></td> </code></pre> <p>...确实让事情变得更加复杂。</p> <p>要确定 HTML 使用的背景颜色,您可以迭代表格的单元格,然后以这种方式提取颜色。</p> <p>这是这样做的一个例子。</p> <p>假设您在一个函数中拥有所有这些逻辑:</p> <pre><code>customize: function ( xlsx ) { var sheet = xlsx.xl.worksheets['sheet1.xml']; highlightCells(sheet); } </code></pre> <p>功能是:</p> <pre><code> function highlightCells(sheet) { $( '#example' ).dataTable().api().rows( { search: 'applied' } ) .every( function ( rowIdx, tableLoop, rowLoop ) { var xlRow = rowLoop +2; // +1 for DT zero index; +1 for row heading in Excel $.each( $( 'td', $(this.node()) ), function( index, trNode ) { var bgColor = $('a', trNode).css("background-color"); if ( bgColor ) { var xlCol = createXlColLetter(index); var xlRef = xlCol + xlRow; console.log( 'xlRef = ' + xlRef + ": bgColor = " + bgColor ); var cellSelector = 'c[r=' + xlRef + ']'; console.log( cellSelector ); var cellStyleID = 10; // assume all are "rgb(255, 0, 0)" (red) $(cellSelector, sheet).attr( 's', cellStyleID ); } } ); } ); } </code></pre> <p>它还使用支持函数将列整数转换为 Excel 字母:</p> <pre><code> // to build an Excel column letter reference from an // integer (1 -> A, 2 -> B, 28 -> AB, and so on...); function createXlColLetter( n ){ var ordA = 'A'.charCodeAt(0); var ordZ = 'Z'.charCodeAt(0); var len = ordZ - ordA + 1; var s = ""; while( n >= 0 ) { s = String.fromCharCode(n % len + ordA) + s; n = Math.floor(n / len) - 1; } return s; } </code></pre> <p>主要功能使用此选择器定位单元格的背景颜色:</p> <pre><code>var bgColor = $('a', trNode).css("background-color"); </code></pre> <p>在上面的代码中,我假设它始终是红色的 (<pre><code>rgb(255, 0, 0)</code></pre>),因此我将格式化 ID 硬编码为 <pre><code>10</code></pre>。</p> <p>但是您可以使用 switch 语句来处理一系列颜色。</p> <p><strong>但是...</strong></p> <p>这对您来说可能仍然只是部分解决方案。</p> <p>如果您的单元格数据不是纯文本(例如 Excel 货币值或数字),则应用其中一种内置样式可能会强制 Excel 单元格丢失其数字格式。 DataTables 提供的每个内置样式都会覆盖您可能想要的任何其他样式。</p> <p>例如 - 如果我从这个 HTML 表开始:</p> <p><a href="https://i.sstatic.net/W5gH3.png" rel="nofollow noreferrer"><img src="https://cdn.txt58.com/i/AWkuc3N0YXRpYy5uZXQvVzVnSDMucG5n" alt="enter image description here"/></a></p> <p>...我最终会得到这个 Excel 工作表:</p> <p><a href="https://i.sstatic.net/3rqFJ.png" rel="nofollow noreferrer"><img src="https://cdn.txt58.com/i/AWkuc3N0YXRpYy5uZXQvM3JxRkoucG5n" alt="enter image description here"/></a></p> <p>您可以看到货币格式已丢失 - 因为样式 10 是 <em>普通文本,红色背景</em>。正常是指 Excel“通用”文本格式。</p> <p>您不能将 2 个或多个数据表样式应用到一个单元格。</p> <p>因此,这意味着您现在必须在 Excel 电子表格中提前准备好所需的所有样式,然后解压缩 Excel 文件,从相关 Excel 样式文件中获取相关 HTML,并将其应用到您的 DataTables Excel 文件中。</p> <p>这就是OP在<a href="https://stackoverflow.com/questions/62434346/datatables-excel-style-based-on-cell-class">我最初链接到的问题</a>中所做的事情。所以我认为这就是你在你的情况下也需要做的。</p> <p>完成此操作后,您仍然可以使用上面的示例代码 - 但您将使用来自样式表的样式 ID - 而不是 DataTables 中可用的内置样式 ID。</p> </answer> </body></html>
我使用 DataTables 插件制作了一个表格。 我创建了一个名为“日期”的列,其中包含一些日期。使用“日期”附近的按钮,我可以订购记录,但我必须使用这种格式...
我使用带有固定列的 jquery 数据表。一切正常,但我在滚动 x 时遇到问题。 正如你所看到的,我无法从固定列中删除滚动 x。有什么想法可以解决这个问题吗?
如何使用 JQuery pdfHtml5 将整个 DataTable 在 pdf 中居中
我喜欢使用 $('#tableId').DataTable() 和“pdfHtml5”按钮来生成 PDF。我只是不知道如何将生成的 PDF 中的信息居中。 只有两列的表格
我想导出到Excel。这是我的代码。 $('#tabelku').dataTable({ dom: 'Bfrtip', “纽扣”: [{ ...
我有一个javascript函数,可以使用jquery在表中插入新行。这是代码: $.each(数据,函数(i,项目){ $('#tb-articoli').dataTable().fnAddData( [ ...
我有一个以 YYYY-MM-DD 格式存储在数据库中的日期。我想用当前日期减去日期来计算年差。 我的代码如下所示: ... 我有一个以 YYYY-MM-DD 格式存储在数据库中的日期。我想用当前日期减去日期来计算年差。 我的代码如下所示: <table id="my_table"> <tr> <th>Name</th> <th>DOB</th> <th>Age</th> </table> 脚本 <script type="text/javascript"> $(function() { let table = $("#my_table").DataTable({ ajax: "{{route('my_table')}}", columns: [ {data:'Name',name:'Name',orderable:false}, {data:'DOB',name:'DOB',orderable:false}, {data:null,title : 'days', render: function ( data, type, row ) { var dbdate = moment(data.DOB, 'YYYY-MM-DD'); var now = moment(); return now.diff(dbdate, 'Age'); }}, ] }); }); </script> (我查看了这个链接,但是如果实现了计算代码,我的数据表将不会加载。) 没关系,测试了一些代码并找到了结果。 {data:null, render: function (data, type, row, meta){ const date=new Date(); let date2=new Date(row.DOB_E); return Math.floor((date-date2)/(365.25 * 24 * 60 * 60 * 1000)); }
jQuery:3.7.1 数据表:2.0.6 $(#dtTable).DataTable({ 分页:真实, 排序:真实, 服务器端:正确, 搜索: 真实, // 表的排序默认 [列,方向] 哦...
在我的数据表的createdRow函数中,我试图从最后一个TD中删除一个类。下面是该函数的代码。添加类只是一个测试,看看该函数是否被触发......
有人知道如何在 jQuery 数据表中默认显示所有行吗? 我已经尝试过这段代码,但它默认只显示 10 行。 $("#adminProducts").dataTable({ “aLengthMenu”:[100...
Yajra Laravel Datatables 阻止一列排序仅在对另一列进行排序时才起作用
我正在尝试创建一个数据表,如下所示,但我不希望打印第一列和最后一列,可排序甚至用于搜索,但这仅在我单击排序按钮进行排序时才有效...
我有一个 DataTables 实例,它在表的标题中附加一个选择。这是一个显示它的代码笔。 这是将选择添加到标题的代码的相关部分 初始化完成:
table.column(0).checkboxes.selected() 返回数据表的所有行
我是数据表新手,并且已经在数据表的每一行中实现了复选框。我为此遵循了这个示例。 我只想返回选定行的数据,但它返回所有数据...
我在 python 中计算这个表时遇到了麻烦,因为 x 轴和 y 轴有范围。有没有一种方法可以输入此表,而无需手动输入范围内的所有数字?例如...
我们对 DataTable v1.10.20 进行了动态设置,以便在数据为空时初始化数据表事件,因为当选择选择选项时,数据表将被特定数据填充。 现在我们更新了 jQuery
我使用数据表 1.10.18 有以下代码(是的,我知道,这是旧代码,更新数据表版本需要大量重写): ... 我使用数据表 1.10.18 有以下代码(是的,我知道,这是旧代码,更新数据表版本需要大量重写): <table id='testtable' class='datatable'> <tr><td>Within value</td><td>Second column</td></tr> <tr><td>Without value</td><td>Second column</td></tr> </table> <script> var testtable = $('#testtable').dataTable({ paging: true, bLengthChange: true, bPaginate: true, bFilter: false, bSort: false, autoWidth: true, sDom: 'lrtp', columns: [ { sTitle: 'ACTIVITY' }, { sTitle: 'DATE' } ] }); var table = $('#testtable').DataTable(); </script> 污垢简单,光秃秃的骨头。当我在控制台中运行 table.data() 时,我正确地获取了数据数组。所以信息是正确的,并且可以访问。但是,当我运行 table.column(0) 或任何导数函数时,我没有得到任何结果。我想做的是table.column(0).search('Within').draw()。当我尝试运行它时,没有任何变化。 据我所知,我正在做与https://datatables.net/examples/api/regex.html上完全相同的事情,除了我是静态而不是动态地做。我已经对我的代码进行了双重和三次检查,我不明白为什么 .column() 函数不起作用,或者它之后的任何内容。我做错了什么? 解决方案是删除以下选项: bFilter: false (或将其设置为 true,这是默认值)。 对于 DataTables 版本 1.10 及以上版本,旧的 bFilter 选项 现在已重命名为searching - 尽管旧名称仍然可以使用(如您的代码中所示)。 searching的文档阐明了此选项: 允许启用或禁用数据表的搜索功能。 因此您已在代码中禁用搜索(过滤)。这就是为什么您没有获得预期的 DataTables 结果。 还请注意: “当我运行 table.column(0) 或任何导数函数时,我没有得到任何结果” 正如您在屏幕截图中所示,您do得到了结果——您得到了一个返回的对象。您将其打印到控制台。 查看 column() 的 API 文档,它指出: 返回:结果集中具有选定列的 DataTables API 实例。 这正是您所得到的。 查看该列中的数据的一种方法是: console.log( table.column(0).data().toArray() ); 打印: Array [ "Within value", "Without value" ] 请注意,您不需要定义该 table 变量。您可能需要这样做的原因未在问题中显示,但您可以做更简单的事情: var testtable = $('#testtable').DataTable({ paging: true, bLengthChange: true, bPaginate: true, //bFilter: false, bSort: false, autoWidth: true, sDom: 'lrtp', columns: [{ sTitle: 'ACTIVITY' }, { sTitle: 'DATE' } ] }); testtable.column(0).search('Within').draw();<!doctype html> <html> <head> <meta charset="UTF-8"> <title>Demo</title> <script src="https://code.jquery.com/jquery-3.6.0.js"></script> <script src="https://cdn.datatables.net/1.10.18/js/jquery.dataTables.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.18/css/jquery.dataTables.css"> <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css"> </head> <body> <div style="margin: 20px;"> <table id='testtable' class='datatable'> <tr> <td>Within value</td> <td>Second column</td> </tr> <tr> <td>Without value</td> <td>Second column</td> </tr> </table> </div> </body> </html> 您可以自己运行上面的代码片段。 我改变了这个: var testtable = $('#testtable').dataTable({ 对此: var testtable = $('#testtable').DataTable({ 这是一个微妙的变化 - 小写d变为大写d。您可以在此处了解差异: 注意 $( selector ).DataTable() 和 $( selector ).dataTable() 之间的区别。前者返回一个 DataTables API 实例,而后者返回一个 jQuery 对象。 因此,您的代码没有返回 DataTables 实例 - 因此您需要使用 var table = $('#testtable').DataTable(); 创建一个实例。就我而言,我已经创建了一个 DataTables 实例并将其分配给 testtable。无需创建 table 变量。 S,我删除了它,并在各处使用了 testtable。
我正在做一个使用jQuery,MVC的项目。 为此,我正在使用 jquery 数据表,所以我需要添加一个可编辑的数据表,用户可以通过单击表行来添加数据......并且当我单击但是......
如何将 dt-render 函数与 yadcf-filter_match_mode: 'exact' 和分隔符结合起来?
我已经尝试和搜索了很长时间,但找不到解决方案。 字段值由分隔符分隔。为了更好地显示它,我用逗号替换它。然而,过滤器的行为...
我用DateTables创建了一个表格,起初表格本身定义的空格没有显示,这非常重要。我使用 html 标签 pre 修复了它。 现在我遇到的问题是...