以多页分页打印所有数据

Posted

技术标签:

【中文标题】以多页分页打印所有数据【英文标题】:Print all data in multiple page pagination 【发布时间】:2017-01-08 19:56:42 【问题描述】:

我无法打印具有分页的数据表中的所有数据。我已经进行了研究,并在此链接中发现了同样的问题

Print <div id="printarea"></div> only?

Printing multiple pages with javascript

但是某些编码在我的项目中不起作用,或者我可能不理解编码。

这是我已经尝试过的示例编码..所以基本上我在数据库中有 19 个数据..但在这个页面中我将其限制为 15 个

所以当我点击按钮打印时,我不必去每一页打印数据表中的所有数据。

这是我用于按钮打印的代码

<div id="printableArea">
  <h1>Print me</h1>

Javascript

function printDiv(divName) 
 var printContents = document.getElementById(divName).innerhtml;
 var originalContents = document.body.innerHTML;

 document.body.innerHTML = printContents;

 window.print();

 document.body.innerHTML = originalContents;

【问题讨论】:

你是在AJAX中工作的分页在你点击两个之后加载数据还是隐藏和显示数据 如果可以使用数据表显示数据则使用this link打印所有数据 @NareshKumar.P .. 当我单击两个时,其余数据将出现 ..从 16 到 19 ..它还将限制每个数字分页仅 15 个数据。用 ajax 工作是什么意思? @VidhyadharGalande ...是的,您刚刚给我的这个链接...非常好..但这对我来说很难阅读代码,因为我仍然是初学者程序员。所以如果你能给我一个更简单的例子..那就太好了 我应该解释一下如何为一个表实现数据表 【参考方案1】:

因此,对于此表,如果您应用打印选项,它将打印所有可用的数据,因为如果它在分页下也按您的要求进行。

DataTables 是 jQuery JavaScript 库的插件。它是一个高度灵活的工具,基于渐进增强的基础,可以向任何 HTML 表格添加高级交互控件。

您可以根据自己的意愿将 Datatable 应用于任何表格。

要在您的页面上添加的 Js:

$(document).ready(function()
    $('#myTable').DataTable();
);

CSS:

<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css" />

JS:

<script src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script>

HTML 表格:

<div id="printableArea">    
<table id="myTable" class="display"  cellspacing="0">
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Position</th>
                    <th>Office</th>
                    <th>Age</th>
                    <th>Start date</th>
                    <th>Salary</th>
                </tr>
            </thead>
            <tfoot>
                <tr>
                    <th>Name</th>
                    <th>Position</th>
                    <th>Office</th>
                    <th>Age</th>
                    <th>Start date</th>
                    <th>Salary</th>
                </tr>
            </tfoot>
            <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>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>33</td>
                    <td>2008/11/28</td>
                    <td>$162,700</td>
                </tr>
                <tr>
                    <td>Brielle Williamson</td>
                    <td>Integration Specialist</td>
                    <td>New York</td>
                    <td>61</td>
                    <td>2012/12/02</td>
                    <td>$372,000</td>
                </tr>
                <tr>
                    <td>Herrod Chandler</td>
                    <td>Sales Assistant</td>
                    <td>San Francisco</td>
                    <td>59</td>
                    <td>2012/08/06</td>
                    <td>$137,500</td>
                </tr>
    </table>
</div>

因此,如果您为此表应用数据表,您将收到这样的输出。

输出:

【讨论】:

让我先试一试,然后告诉结果【参考方案2】:

试试这个代码

HTML 代码

 <div id="printableArea">    
        <table id="printableAreaTable" class="display"  cellspacing="0">
                <thead>
                <tr>
                    <th>ID</th>
                    <th>Name</th>                    
                    <th>Salary</th>
                </tr>
            </thead>          
            <tbody>
                <tr>
                    <td>1</td>
                    <td>ABC1</td>
                    <td>100000</td>                  
                </tr>
                <tr>
                    <td>2</td>
                    <td>ABC2</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>3</td>
                    <td>ABC23</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>4</td>
                    <td>ABC4</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>5</td>
                    <td>ABC5</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>6</td>
                    <td>ABC6</td>
                    <td>100000</td>
                </tr>
                <tr>
                   <td>7</td>
                    <td>ABC7</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>8</td>
                    <td>ABC8</td>
                    <td>100000</td>                  
                </tr>
                <tr>
                    <td>9</td>
                    <td>ABC9</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>10</td>
                    <td>ABC10</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>11</td>
                    <td>ABC11</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>12</td>
                    <td>ABC12</td>
                    <td>100000</td>
                </tr>
                <tr>
                    <td>13</td>
                    <td>ABC13</td>
                    <td>100000</td>
                </tr>
                <tr>
                   <td>14</td>
                    <td>ABC14</td>
                    <td>100000</td>
                </tr>
           </tbody>
        </table>
    </div>

javascript

   $(document).ready(function() 
    $('#printableAreaTable').DataTable( 
        dom: 'Bfrtip',
        buttons: [
            'print'
        ]
     );
 );

Js 文件

<script src="https://code.jquery.com/jquery-1.12.3.js"></script>
<script src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/1.2.2/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/1.2.2/js/buttons.print.min.js"></script>

cs 文件

<link href="https://cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css" rel="stylesheet" />
<link href="https://cdn.datatables.net/buttons/1.2.2/css/buttons.dataTables.min.css" rel="stylesheet" />

输出

【讨论】:

【参考方案3】:

最近对于大约 5000 行的分页网格也遇到了同样的问题。由于我们没有在浏览器中呈现完整的数据,因此调用print() 只会在视口中显示当前行。

我们最终要做的是将模型(支持网格的数据)发送回服务器,进行服务器端渲染(我们使用thymeleaf),然后将完整的 html 字符串发送回浏览器。现在我们可以即时创建一个iframe 并将内容写入其中并在iframe 上调用print()。最后,我们从 DOM 中移除 iframe。 success 回调中的客户端代码如下所示:

    var printIFrame = document.createElement('iframe');
    document.body.appendChild(printIFrame);
    printIFrame.style.position = 'absolute';
    printIFrame.style.top = -999;
    printIFrame.style.left = -999;
    var frameWindow = printIFrame.contentWindow || printIFrame.contentDocument || printIFrame;
    var wdoc = frameWindow.document || frameWindow.contentDocument || frameWindow;
    wdoc.write(res.data);
    wdoc.close();
    // Fix for IE : Allow it to render the iframe
    frameWindow.focus();
    try 
        // Fix for IE11 - printng the whole page instead of the iframe content
        if (!frameWindow.document.execCommand('print', false, null)) 
            // document.execCommand returns false if it failed -http://***.com/a/21336448/937891
            frameWindow.print();
        
        // focus body as it is losing focus in iPad and content not getting printed
        document.body.focus();
    
    catch (e) 
        frameWindow.print();
    
    frameWindow.close();
    setTimeout(function() 
        printIFrame.parentElement.removeChild(printIFrame);
    , 0); 

对于服务器端部分,您可以使用任何技术生成 html。如果你碰巧和我们有类似的堆栈(Java/Spring/Angular),看看我的另一个POST。希望这可以帮助在分页数据浏览器打印方面遇到类似问题的人。

【讨论】:

以上是关于以多页分页打印所有数据的主要内容,如果未能解决你的问题,请参考以下文章

一个视图中的 CI 多页分页,

mysql分页

使用Vue-CLI怎么实现多页分目录打包

单页分页问题中的多个角度材料表

用html横向、多页的分页打印,打印不出来,怎么办?

如何在 NextJS 中以多步形式传递数据?