zoukankan      html  css  js  c++  java
  • 针对上次表格编辑的打印问题及解决方案

    对于上次的表格编辑,在打印过程中存在自动分页,表格不完整的问题,如下图:

    如果表格高度超过A4纸张的高度,则会对表格自动分页,无法打印出完整的表格。

    对此我想了很多办法:

    1.有什么办法可以让它强制不分页?

    2.有什么办法可以给标签分页?

    3.分割表格,让其行数固定在A4纸张高度内?

    经过查询资料:1.强制不分页不可行,2.有个样式page-break-before对打印分页有用,但是在table中无法使用,除非上下结构是独立的,3.最终选择的解决方案,给定行数,给他自动分页。

    选择第三个解决方案,无外乎是逻辑最麻烦的一种,因为这涉及到tr和td的rowspan的分割而且对于上次的表格编辑是嵌套的rowspan分割,更加麻烦

    实现思路:1.先找到要分割的tr,在分割的时候,先将当前tr的所在月份之前的表格提取,再将之后的表格提取,接下来就是对当前要分割的tr的月份列进行分割;

         2.判断当前tr有没有月份列,如果有月分列则提取月份列,如果没有月份列则向上查找月份列,再判断是否有类别列,如果有则提取,如果没有则向上找;

           3.将所在月份的当前tr的之前的行分割给之前的表格,将当前tr的之后的行分割给之后的表格;

    对照画了一张逻辑图:

    下面是代码:

      1 var prevRows = 0;
      2 var monthPrevRows = 0;
      3 var pc = "";
      4 var countnum = true;
      5 function myprint(xrows, tbl, printTitle) {//xrows是要分割的行数,tbl是传入table对象,printTitle是每页的标题
      6     //alert("a");
      7     prevRows = 0;
      8     monthPrevRows = 0;
      9     var tblRows = $(tbl).find("tbody").find("tr").length;
     10     if (tblRows <= xrows) {
     11         pc += "<div style='text-align:center;'>" + printTitle + "</div><table>" + $(tbl).html() + "</table>";
     12         toPrint(pc);
     13         return false;
     14     }
     15     var tableHead = $(tbl).find("thead");
     16     var xrows = parseInt(xrows);
     17     var tarTr = $(tbl).find("tbody").find("tr").eq(xrows - 1);
     18     //alert(tarTr.html());
     19     //获取当前子类TD
     20     var cTypeTd = findTypeTd(tarTr);
     21     //获取当前月TD
     22     var cMonthTd = findMonthTd(tarTr);
     23     /*分割月*/
     24     var cMonthTr = $(cMonthTd).parents("tr");
     25     prevRows = findPrevRows(cMonthTr, prevRows);
     26     var cMonthTdRowspan = $(cMonthTd).attr("rowspan");
     27     var cMonthTdRowspan_1 = xrows - prevRows;
     28     var cMonthTdRowspan_2 = cMonthTdRowspan - cMonthTdRowspan_1;
     29 
     30     ///
     31     var cMonthTd_1 = cMonthTr.find("td").eq(0).clone();
     32     var cMonthTd_2 = cMonthTr.find("td").eq(0).clone();
     33     $(cMonthTd_1).attr("rowspan", cMonthTdRowspan_1);
     34     $(cMonthTd_2).attr("rowspan", cMonthTdRowspan_2);
     35     ///
     36 
     37     var cMonthTr_1 = cMonthTr.clone();
     38     $(cMonthTr_1).find("td").eq(0).attr("rowspan", cMonthTdRowspan_1);
     39     var cMonthTr_2 = cMonthTr.clone();
     40     $(cMonthTr_2).find("td").eq(0).attr("rowspan", cMonthTdRowspan_2);
     41     //prevRows = 0;
     42     /*分割类*/
     43     var cTypeTr = $(cTypeTd).parents("tr");
     44     //alert(cTypeTr.html());
     45     monthPrevRows = findPrevRows(cTypeTr, monthPrevRows);
     46     var cTypeTdRowspan = $(cTypeTd).attr("rowspan");
     47     var cTypeTdRowspan_1 = xrows - monthPrevRows;
     48     var cTypeTdRowspan_2 = cTypeTdRowspan - cTypeTdRowspan_1;
     49     //alert(cTypeTd.html());
     50 
     51 
     52     if (prevRows != monthPrevRows) {
     53         var cTypeTr_1 = cTypeTr.clone();
     54         $(cTypeTr_1).find("td").eq(0).attr("rowspan", cTypeTdRowspan_1);
     55         var cTypeTr_2 = cTypeTr.clone();
     56         $(cTypeTr_2).find("td").eq(0).attr("rowspan", cTypeTdRowspan_2);
     57     } else {
     58         var cTypeTr_1 = cMonthTr_1;
     59         $(cTypeTr_1).find("td").eq(1).attr("rowspan", cTypeTdRowspan_1);
     60         var cTypeTr_2 = cMonthTr_2;
     61         $(cTypeTr_2).find("td").eq(1).attr("rowspan", cTypeTdRowspan_2);
     62     }
     63     //alert(monthPrevRows + "|" + prevRows);
     64     /*分割行*/
     65     var tbody_1 = document.createElement("tbody");
     66     for (var i = 0; i < prevRows; i++) {
     67         var itr = $(tbl).find("tbody").find("tr").eq(i).clone();
     68         $(tbody_1).append(itr);
     69     }
     70     var tbodytrrows = $(tbl).find("tbody").find("tr").length; //总Tr数
     71     var cmonthtrrows = $(cMonthTd).attr("rowspan"); //分割的月的rowspan数
     72     var statrnextrows = parseInt(prevRows) + parseInt(cmonthtrrows); //分割的月之前的行数(包含分割月)
     73     var nextRows = tbodytrrows - statrnextrows; //分割的月的之后的行数
     74 
     75     /////////////////////////////////////第一个分割表
     76     //alert(prevRows + "|" + monthPrevRows);
     77     if (prevRows != monthPrevRows) {
     78         $(tbody_1).append(cMonthTr_1);
     79         var monthprev = monthPrevRows - prevRows;
     80         for (var i = 0; i < monthprev - 1; i++) {
     81             cMonthTr = cMonthTr.next();
     82             var itr = cMonthTr.clone();
     83             $(tbody_1).append($(itr));
     84         }
     85         $(tbody_1).append(cTypeTr_1);
     86         for (var i = 0; i < cTypeTdRowspan_1 - 1; i++) {
     87             cTypeTr = cTypeTr.next();
     88             var itr = cTypeTr.clone();
     89             $(tbody_1).append($(itr));
     90         }
     91     } else {
     92         $(tbody_1).append(cTypeTr_1);
     93         for (var i = 0; i < cTypeTdRowspan_1 - 1; i++) {
     94             cTypeTr = cTypeTr.next();
     95             var itr = cTypeTr.clone();
     96             $(tbody_1).append($(itr));
     97         }
     98     }
     99     //            alert($(tbody_1).html());
    100     var table_1 = document.createElement("table");
    101     $(table_1).attr("class", "FormTable");
    102     $(table_1).append(tableHead.clone());
    103     $(table_1).append(tbody_1);
    104     ///////////////////////////////////////第二个分割表
    105     var tbody_2 = document.createElement("tbody");
    106     if (prevRows != monthPrevRows) {
    107         var trEle = $(tbl).find("tbody").find("tr").eq(xrows).clone();
    108         var tdEle = $(cTypeTr_2).find("td").eq(0);
    109 
    110         if (tdEle.attr("rowspan") != 0) {
    111             $(tdEle).insertBefore(trEle.find("td").eq(0));
    112         }
    113         if (cMonthTd_2.attr("rowspan") != 0) {
    114             $(cMonthTd_2).insertBefore(trEle.find("td").eq(0));
    115         }
    116         $(tbody_2).append(trEle);
    117     } else {
    118         var trEle = $(tbl).find("tbody").find("tr").eq(xrows).clone();
    119         var tdEle = $(cTypeTr_2).find("td").eq(0);
    120         var tdEle_ = $(cTypeTr_2).find("td").eq(1);
    121         if (tdEle_.attr("rowspan") != 0) {
    122             $(tdEle_).insertBefore(trEle.find("td").eq(0));
    123         }
    124         if (tdEle.attr("rowspan") != 0) {
    125             $(tdEle).insertBefore(trEle.find("td").eq(0));
    126 
    127         }
    128         $(tbody_2).append(trEle);
    129     }
    130     //            for (var i = cTypeTdRowspan_1; i < cTypeTdRowspan; i++) {
    131     //                cTypeTr = cTypeTr.next();
    132     //                var itr = cTypeTr.clone();
    133     //                $(tbody_2).append($(itr));
    134     //            }
    135 
    136     for (var i = xrows + 1; i < tbodytrrows; i++) {
    137         var itr = $(tbl).find("tbody").find("tr").eq(i).clone();
    138         $(tbody_2).append(itr);
    139     }
    140 
    141     var table_2 = document.createElement("table");
    142     $(table_2).attr("class", "FormTable");
    143     $(table_2).append(tableHead.clone());
    144     $(table_2).append(tbody_2);
    145     if (countnum) {
    146         pc += "<div style='text-align:center;'>" + printTitle + "</div><table class='FormTable'>" + $(table_1).html() + "</table>";
    147     } else {
    148         pc += "<div style='page-break-before:always;text-align:center;'>" + printTitle + "</div><table class='FormTable'>" + $(table_1).html() + "</table>";
    149     }
    150     if ($(table_2).find("tbody").find("tr").length > xrows) {
    151         countnum =false;
    152         prevRows = 0;
    153         monthPrevRows = 0;
    154         myprint(xrows, table_2,printTitle);
    155     } else {
    156         pc += "<div style='page-break-before:always;text-align:center;'>" + printTitle + "</div><table class='FormTable'>" + $(table_2).html() + "</table>";
    157         toPrint(pc);
    158     }
    159 
    160     //$(tbody_1).append(cTypeTr_1);
    161     //cTypeTr_2.insertBefore($(tbody_2).find("tr").eq(0));
    162 
    163 
    164 }
    165 
    166 function toPrint(printContent) {
    167     if(printContent.indexOf("page-break-before:always;")<100)
    168     {
    169         printContent=printContent.replace("page-break-before:always;", "");
    170     }
    171     var iss = $("#hlb").attr("checked");
    172     if (iss == "checked") {
    173         iss = "";
    174     } else {
    175         iss = ".hlb{display:none}";
    176     }
    177     var isss = $("#dk").attr("checked");
    178     if (isss != null) {
    179         if (isss == "checked") {
    180             isss = "";
    181         } else {
    182             isss = ".dk{display:none}";
    183         }
    184 
    185     }
    186     var printWindow = window.open('', '', '');
    187     printWindow.document.write('<html><head><link rel="stylesheet" href="../../style/Table.css" />' +
    188             '<style>#ddy{display:none}'+iss+isss+'</style></head><body>' + printContent + '</body></html>');
    189     setTimeout(function () {
    190         printWindow.focus();
    191         printWindow.print();
    192         printWindow.close();
    193     }, 200);
    194     pc = "";
    195 }
    196 
    197 function findPrevRows(tr, prevRows) {
    198     tr = $(tr).prev();
    199     if (tr.html() == null) {
    200         return prevRows;
    201     } else {
    202         prevRows++;
    203         return findPrevRows(tr, prevRows);
    204     }
    205 }
    206 
    207 function findTypeTd(tr) {
    208     //获取当前TR下的第一个TD
    209     var typetd = tr.find("td").eq(0);
    210     if (typetd.html().indexOf("月份") != -1) {
    211         return tr.find("td").eq(1);
    212     } else if (typetd.html().indexOf("typename") == -1) {
    213         tr = $(tr).prev(); //向上推一个TR
    214         return findTypeTd(tr); //传入
    215     } else {
    216         return typetd;
    217     }
    218 }
    219 function findMonthTd(tr) {
    220     //获取当前TR下的第一个TD
    221     var monthtd = tr.find("td").eq(0);
    222     //如果不包含"月份"关键字
    223     if (monthtd.html().indexOf("月份") == -1) {
    224         tr = $(tr).prev(); //向上推一个TR
    225         return findMonthTd(tr); //传入
    226     } else {
    227         return monthtd;
    228     }
    229 }

    最终的打印效果:

    可以将2月份的三行正确的分割出来,并且此代码做了递归操作,可以将分割之后的部分如果超过纸张长度再次分割。

  • 相关阅读:
    204. 计数质数
    面试题 16.06. 最小差
    8. ubantu系统相关
    7. 理论
    6. 图像处理
    5.git
    4.Torch量化
    3.Torch优化工具
    2.DB算法及代码问题分析
    1. 显卡相关问题
  • 原文地址:https://www.cnblogs.com/Kuleft/p/5091948.html
Copyright © 2011-2022 走看看