针对上次表格编辑的打印问题及解决方案

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

如果表格高度超过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月份的三行正确的分割出来,并且此代码做了递归操作,可以将分割之后的部分如果超过纸张长度再次分割。

posted @ 2015-12-31 15:46  kuleft  阅读(504)  评论(0编辑  收藏  举报