【问题标题】:How to apply CSS page-break to print a table with lots of rows?如何应用 CSS 分页符来打印包含大量行的表格?
【发布时间】:2012-02-01 12:24:21
【问题描述】:

我的网页中有一个动态表,有时包含很多行。我知道有 page-break-beforepage-break-after CSS 属性。 如果需要,我应该将它们放在我的代码中的什么位置以便强制分页?

【问题讨论】:

    标签: html css printing css-tables page-break


    【解决方案1】:

    您可以使用以下内容:

    <style type="text/css">
       table { page-break-inside:auto }
       tr    { page-break-inside:avoid; page-break-after:auto }
    </style>
    

    有关详细信息,请参阅 W3C 的 CSS Print Profile 规范。

    另外请参考Salesforce developer forums

    【讨论】:

    • 如果您正在尝试使用像 bootstrap 这样的框架,请注意使用类似 .spanX(带有浮动样式的样式)之类的东西会破坏 page-break-* 属性,我自己为此浪费了很多时间细微差别。
    • 这适用于 UIWebView,所以我认为它现在也适用于 Safari
    • David 感谢分享与 safari 或 charome 一起使用的解决方案。 JonEasy 您可以使用 David 的解决方案,以防此解决方案不适用于 Safari。 @Maxence 很高兴它有所帮助。抱歉,我几个月没有活动,所以无法及早回复。
    • 此解决方案不会在其单元格边界之间干净地破坏多行单元格,而是在中间将它们分解。不过,我找到了一个适用于所有当前浏览器(Safari、FF 和 Chrome)的解决方案:stackoverflow.com/a/47498775/43615
    • @Saif 这个答案是几年前提供的,它可能不符合较新版本的浏览器。但你可能会从中得到一些提示。
    【解决方案2】:

    无论您想在哪里申请休息,tabletr,您都需要为 ex 上课。 page-break 与 CSS 如下所述:

    /* class works for table row */
    table tr.page-break{
      page-break-after:always
    } 
    
    <tr class="page-break">
    
    /* class works for table */
    table.page-break{
      page-break-after:always
    }
    
    <table class="page-break">
    

    它会按照你的要求工作

    或者,您也可以使用div 结构:

    CSS:

    @media all {
     .page-break  { display: none; }
    }
    
    @media print {
     .page-break  { display: block; page-break-before: always; }
    }
    

    分区:

    <div class="page-break"></div>
    

    【讨论】:

    • 这只有在您提前知道一个页面上可以容纳多少行时才有效(因为您必须直接在标记中声明分页符)。如果表行中的数据有可能换行到第二行,这可能很困难(或不可能)。那么多种页面尺寸(A4、美国信函、美国法律)呢?
    • 在使用多行单元格和多列时,此解决方案对我不起作用。不过,我找到了解决方案:stackoverflow.com/a/47498775/43615 - 它还处理了@aapierce 提到的问题。
    • 无法在 Chrome v64 中使用破坏性 tr
    【解决方案3】:

    我已经四处寻找解决此问题的方法。我有一个 jquery 移动网站,它有一个最终打印页面,它结合了几十个页面。我尝试了上面的所有修复,但我唯一能开始工作的是:

    <div style="clear:both!important;"/></div>
    <div style="page-break-after:always"></div> 
    <div style="clear:both!important;"/> </div>
    

    【讨论】:

    • 如果该 html 放在两个 TR 标签 ( CHROME ) 之间,这在表格中是有效的。如果该 html 放在两个 TR 标记 ( FIREFOX ) 之间,这在表格中不起作用。在 FileFox 工作 CSS Rule-> table tr:nth-child(10) {page-break-after: always;page-break-inside: Avoid;}
    【解决方案4】:

    很遗憾,上面的示例在 Chrome 中不适合我。

    我想出了以下解决方案,您可以在其中指定每个页面的 PX 最大高度。然后,当行等于该高度时,这会将表格拆分为单独的表格。

    $(document).ready(function(){
    
        var MaxHeight = 200;
        var RunningHeight = 0;
        var PageNo = 1;
    
        $('table.splitForPrint>tbody>tr').each(function () {
    
            if (RunningHeight + $(this).height() > MaxHeight) {
                RunningHeight = 0;
                PageNo += 1;
            }
    
            RunningHeight += $(this).height();
    
            $(this).attr("data-page-no", PageNo);
    
        });
    
        for(i = 1; i <= PageNo; i++){
    
            $('table.splitForPrint').parent().append("<div class='tablePage'><hr /><table id='Table" + i + "'><tbody></tbody></table><hr /></div>");
    
            var rows = $('table tr[data-page-no="' + i + '"]');
    
            $('#Table' + i).find("tbody").append(rows);
        }
        $('table.splitForPrint').remove();
    
    });
    

    您的样式表中还需要以下内容

        div.tablePage {
            page-break-inside:avoid; page-break-after:always;            
        }
    

    【讨论】:

    • 当表格有一大行时不做任何事情。
    【解决方案5】:

    这对我有用:

    <td>
      <div class="avoid">
        Cell content.
      </div>
    </td>
    ...
    <style type="text/css">
      .avoid {
        page-break-inside: avoid !important;
        margin: 4px 0 4px 0;  /* to keep the page break from cutting too close to the text in the div */
      }
    </style>
    

    来自这个帖子:avoid page break inside row of table

    【讨论】:

    • 这在一定程度上起作用。表示它在底部的行中停止切割数据。行其仍在切割。但至少比实际问题好
    【解决方案6】:

    如果您知道要在一个页面上显示多少个,您可以随时执行此操作。它会在每 20 个项目后开始一个新页面。

    .row-item:nth-child(20n) {
        page-break-after: always;
        page-break-inside: avoid;
    }
    

    【讨论】:

    • 这对我不起作用:(我使用的是 CHOME 83.0.4103.116
    【解决方案7】:

    我最终意识到,我的大量内容溢出了表格并且没有正确破坏,根本不需要放在表格中。

    虽然这不是技术解决方案,但它解决了我在不再需要桌子时简单地结束桌子的问题;然后开始一个新的页脚。

    希望它对某人有所帮助......祝你好运!

    【讨论】:

      【解决方案8】:

      这是一个例子:

      通过css:

      <style>
        .my-table {
          page-break-before: always;
          page-break-after: always;
        }
        .my-table tr {
          page-break-inside: avoid;
        }
      </style>
      

      或直接在元素上:

      <table style="page-break-before: always; page-break-after: always;">
        <tr style="page-break-inside: avoid;">
          ..
        </tr>
      </table>
      

      【讨论】:

      • 这成功地使用了 4 个页面,实际上是一个 2 页表,并且似乎与 Safari (6) 和 Chrome (24) 中没有 css 的效果相同。
      【解决方案9】:

      你应该使用

      <tbody> 
        <tr>
        first page content here 
        </tr>
        <tr>
        ..
        </tr>
      </tbody>
      <tbody>
        next page content...
      </tbody>
      

      还有 CSS:

      tbody { display: block; page-break-before: avoid; }
      tbody { display: block; page-break-after: always; }
      

      【讨论】:

      • 手动将表格分页不是一个很好的解决方案,除非内容自然应该打印在单独的页面上(例如,每年打印一页的财务信息。)你不知道预先确定一个打印页面可以容纳多少内容。
      猜你喜欢
      • 1970-01-01
      • 2014-03-24
      • 2010-10-28
      • 2010-12-18
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多