jQuery DataTables导出pdf切断列

时间:2016-08-15 15:25:40

标签: jquery pdf datatables

我有一个包含大量列的数据集。

导出pdf时,不适合页面的列会被截断。

我尝试使用'方向'和'页面大小'选项,但还不够。

    buttons: [
                {
                    extend: 'pdfHtml5',
                    orientation: 'landscape',
                    pageSize: 'LEGAL'
                }
            ]

理想情况下,它应该执行以下操作之一:

  1. 将数据放在一页上(使字体非常小)
  2. 继续pdf
  3. 中另一页的数据

4 个答案:

答案 0 :(得分:9)

我设法通过设置pdf的选项来解决这个问题,如

 {
                extend : 'pdfHtml5',
                title : function() {
                    return "ABCDE List";
                },
                orientation : 'landscape',
                pageSize : 'LEGAL',
                text : '<i class="fa fa-file-pdf-o"> PDF</i>',
                titleAttr : 'PDF'
            } 

enter image description here

成了

enter image description here

答案 1 :(得分:3)

感谢@parlad,但是下面是完美的解决方案 -

{
            extend : 'pdfHtml5',
            title : function() {
                return "ABCDE List";
            },
            orientation : 'landscape',
            pageSize : 'A0',
            text : '<i class="fa fa-file-pdf-o"> PDF</i>',
            titleAttr : 'PDF'
        } 

pageSize:&#39; A0&#39;,诀窍:) 希望它对其他人有所帮助。

答案 2 :(得分:0)

CDN:

https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css
https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css
https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js
https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js
https://cdn.datatables.net/s/bs/jszip-2.5.0,pdfmake-0.1.18,dt-1.10.10,b-1.1.0,b-flash-1.1.0,b-html5-1.1.0,b-print-1.1.0,fh-3.1.0,sc-1.4.0/datatables.min.css
https://cdn.datatables.net/s/bs/jszip-2.5.0,pdfmake-0.1.18,dt-1.10.10,b-1.1.0,b-flash-1.1.0,b-html5-1.1.0,b-print-1.1.0,fh-3.1.0,sc-1.4.0/datatables.min.js

HTML:

<h1>Print test</h1>
<div class="data-table-container">
  <table class="table table-hover table-striped table-bordered data-table">
    <thead>
      <tr>
        <th class="text-right">No.</th>
        <th>Name</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="text-right">1</td>
        <td>Java</td>
      </tr>
      <tr>
        <td class="text-right">2</td>
        <td>HTML</td>
      </tr>
    </tbody>
    <tfoot>
      <tr>
        <td colspan="2" class="text-center">footer text</td>
      </tr>
    </tfoot>
  </table>
</div>

JavaScript:

$('table.data-table').DataTable({
  paging: false,
  columnDefs: [{
    targets: 'no-sort',
    orderable: false
  }],
  dom: '<"row"<"col-sm-6"Bl><"col-sm-6"f>>' +
    '<"row"<"col-sm-12"<"table-responsive"tr>>>' +
    '<"row"<"col-sm-5"i><"col-sm-7"p>>',
  fixedHeader: {
    header: true
  },
  buttons: {
    buttons: [{
      extend: 'print',
      text: '<i class="fa fa-print"></i> Print',
      title: $('h1').text(),
      exportOptions: {
        columns: ':not(.no-print)'
      },
      footer: true,
      autoPrint: false
    }, {
      extend: 'pdf',
      text: '<i class="fa fa-file-pdf-o"></i> PDF',
      title: $('h1').text(),
      exportOptions: {
        columns: ':not(.no-print)'
      },
      footer: true
    }],
    dom: {
      container: {
        className: 'dt-buttons'
      },
      button: {
        className: 'btn btn-default'
      }
    }
  }
});

Fiddle

答案 3 :(得分:0)

在这种情况下,有一种解决方案,如果将所有列设置为相等的长度,我检查了16列,发现所有列都正确显示。

您可以手动设置宽度,也可以在不知道列数的情况下动态设置宽度。

首先添加以下行:

$('.en-ajax-button').on('click', function(e){
     var tbl = document.getElementById('descriptive-table');
     var rCount = tbl.rows.length;
     var cCount = 3;
     var allArray = [];
     for (var i = 1; i <rCount; i++){
          var rowArray = [];
          for (var j = 0; j <cCount; j++){
              if (j != 2){
                   rowArray.push(tbl.rows[i].cells[j].children[0].value);
              } 
              else{
                   rowArray.push(tbl.rows[i].cells[j].children[0].children[0].checked);
              }
          }
          allArray.push(rowArray);
    }
    console.log(allArray);
});

现在您可以用其他方式设置表格宽度。选择您想要的那个。

方法1:

doc.content[0].layout = objLayout;

方法2: 如果要为不同的不同列设置固定宽度,则设置固定列大小:

//For equal column size
doc.content[0].table.widths = ["*", "*", "*", "*", "*", "*","*","*", "*"];

方法3:  动态设置相等的大小(如果有不同的表且列数不同)

doc.content[0].table.widths = ["5%", "5%", "8%", "8%", "8%", "8%","7%", "7%", "8%", "6%", "8%", "8%","7%", "7%"];