windwow.print()用于打印当前窗口的内容,很简便,可当内容特殊并且打印有特殊需求的时候就要绕个圈了。下面是需要打印的表格:

当数据量少的时候像上面的表格一样,中间的内容只有5条数据,打印出来在纸上会有空白,不太好。中间内容是不确定的可能几十条,可能上百条,这样循环在界面上展示是没有问题的,但是当使用火狐打印时会按照表格的大小成倍的缩小,最后打印到一张纸上,字体和表格都会很小,当使用其他浏览器时它会自动将内容打印到下一张纸上,因为打印到纸上不可能没有边距,所以在纸与纸衔接的时候会存在数据丢失打印不出来的情况。

经过测试,当每页17条数据的时候打印出来可以满页填充,既不会所以为了使打印出来的表格更靠谱,更为用户着想一些,在界面显示的时候显示的条目为实际的条目,打印时如果数据量少就进行自动空白填充,如果数据量大在保留标题、表格上半部分和下半部分的同时进行分页填充打印,打印完成后再恢复原来的页面。

实现思路:

1.使用打印分页css,相当于分页符,总是在此div后分页

ps:关于page-break-after的使用:http://www.w3school.com.cn/cssref/pr_print_page-break-after.asp   需要特别注意的是它应用于:position 值为 relative 或 static 的非浮动块级元素。当时absolute的时候是不起作用的。

2.将界面分为两个div,一个div中用于进行界面展示,另一个div进行打印填充,两个div

一个为界面展示时的样式,另一个为打印时的样式,单击打印时页面div隐藏,对另外一个div进行填充,打印方法执行完成后,页面div显示,另一个div隐藏。

3.将页面div分为几部分:

第一部分为标题内容部分,第二部分为表格上半部分是固定的,第三部分为数据部分,每页的内容是不同的, 第四部分为表格下半部分,最后为表格下面的内容部分是固定的。

页面展示div代码展示:

********资料凭单

${currentDate}NO:

姓    名

电    话

单    位

类    别

社内 军内 地方

内    容

用    途

类    别

新闻 宣传 商业

序    号

底片号/画报号

年    代

尺    寸

价    格

${varStatus.index+1}

"/>

${item.pictureInfo.width}*${item.pictureInfo.height}

${varStatus.index+1}

${varStatus.index+1}

总    计

实    收

大    写:

组    长

意    见

分管副主任

意    见

主    任

意    见

接    待:制    作:收    银:

地    址:北京市阜外大街34号

***********

电    话:***********

军    线:***********

打印js拼接布局代码展示:

function doPrint() {

//隐藏按钮,避免按钮被打印出来

$("#btnPre").hide();

$("#btnNext").hide();

$("#btnon").hide();

$("#btnBack").hide();

$("#btnPreView").hide();

var html_bak = document.getElementById("dataPanel").innerHTML;

preparePrintTable();

window.print();

document.getElementById("dataPanel").innerHTML = html_bak;

$("#dataPanel").show();

$("#dataPrint").html();

$("#dataPrint").hide();

$("#btnPre").show();

$("#btnNext").show();

$("#btnon").show();

$("#btnBack").show();

$("#btnPreView").show();

}

function preparePrintTable() {

//隐藏原表格

$("#dataPanel").hide();

var pageItemNum = 17;

//满页数

var pages=parseInt('${applicationInfo.dataInfo.size()}' / pageItemNum);

$("#dataPrint").html();

var newTableDiv;

var html_tbl;

html_tbl = "";

var head_comp;

var head_table_comp;

var tail_table_comp;

var tail_comp;

var newTable;

//获取原table的class和style属性

var tbl_cls = $("#table").attr("class");

var tbl_sty = $("#table").attr("style");

head_comp = document.getElementById("topContent").outerHTML;

tail_comp = document.getElementById("footerContent").outerHTML;

head_table_comp = document.getElementById("firstContent").outerHTML;

tail_table_comp = document.getElementById("thirdContent").outerHTML;

for(i=0; i < pages ; i++){ //last page will be handled in the way;

//创建新的table

newTable = document.createElement("table");

newTable.setAttribute('class',tbl_cls);

newTable.setAttribute('style',tbl_sty);

//添加中间数据部分

var newTableTrs="";

for(j=i*pageItemNum; j < (i+1)*pageItemNum; j++){

if(document.getElementById("tr_" + j) == null) {

break;

}

newTableTrs += document.getElementById("tr_" + j).outerHTML;

console.log("newTableTrs="+newTableTrs);

}

//添加表格内容

newTable.innerHTML=head_table_comp+newTableTrs+tail_table_comp;

//表格内容部分div

newTableDiv = document.createElement("div");

newTableDiv.innerHTML=head_comp+newTable.outerHTML+tail_comp;

//换行符

sep = document.createElement("div");

sep.setAttribute("style","page-break-after:always");

//添加换行符调节第二页标题位置

var br = document.createElement("br");

var newDiv=newTableDiv.outerHTML+sep.outerHTML+br.outerHTML;

html_tbl += newDiv;

}

//prepare last page;

var leftItemNum = parseInt('${applicationInfo.dataInfo.size()}' % pageItemNum);

if(leftItemNum > 0) {

newTable = document.createElement("table");

newTable.setAttribute('class',tbl_cls);

newTable.setAttribute('style',tbl_sty);

//添加中间数据部分

var newTableTr="";

var newTableEmtTrs="";

for(j=pages * pageItemNum; j < ${applicationInfo.dataInfo.size()}; j++){

if(document.getElementById("tr_" + j) == null) {

break;

}

newTableTr += document.getElementById("tr_" + j).outerHTML;;

}

var emptyTr;

var emptyTd;

for(k=0; k < pageItemNum - leftItemNum; k++){

newTableEmtTrs +=createEmptyTr(j + k);

}

console.log("newTableEmtTrs="+newTableEmtTrs);

var tbody_comp = createEmptyTr(pageItemNum - leftItemNum);

newTable.innerHTML=head_table_comp+newTableTr+newTableEmtTrs+tail_table_comp;

newTableDiv = document.createElement("div");

newTableDiv.innerHTML=head_comp+newTable.outerHTML+tail_comp;

html_tbl += newTableDiv.outerHTML;

}

document.getElementById("dataPrint").innerHTML = html_tbl;

$("#dataPrint").show();

}

function createEmptyTr(idx) {

var emptyTr;

var emptyTd;

emptyTr = document.createElement("tr");

emptyTr.setAttribute("style","word-wrap:break-word;width: 10%;border-left-width:5px;text-align:center");

emptyTd = document.createElement("td");

emptyTd.setAttribute("style","word-wrap:break-word;width: 10%;border-left-width:5px;text-align:center");

emptyTd.innerHTML="  ";

var tra= emptyTd.outerHTML;

emptyTd = document.createElement("td");

emptyTd.setAttribute("style","text-align:center");

var trb= emptyTd.outerHTML;

emptyTd = document.createElement("td");

emptyTd.setAttribute("style","text-align:center");

var trc= emptyTd.outerHTML;

emptyTd = document.createElement("td");

emptyTd.setAttribute("style","text-align:center");

var trd= emptyTd.outerHTML;

emptyTd = document.createElement("td");

emptyTd.setAttribute("style","text-align:center");

var tre= emptyTd.outerHTML;

emptyTr.innerHTML=tra+trb+trc+trd+tre;

return emptyTr.outerHTML;

}

ps:之所以使用innerHTML和outerHTML是因为使用IE或者360浏览器时append方法不兼容报错,不然拼接内容时直接append就可以了,像

head_table_comp = document.getElementById("firstContent");

newTable.append(head_table_comp);

这样就可以,如果对浏览器要求不高的话使用append的方式比较好。

去掉web打印时自带的页眉页脚以及url:

最后效果图:

小结:

进行分页打印的时候也是走一步一个坑,开始分页div添加进去了,但是并没有分页,火狐自动缩小,解决了火狐的问题,发现IE和360js代码不兼容,前台经常会因为种种需求拼接界面,在这个过程中锻炼了自己逻辑思维和前台代码拼接的能力,写此博客作为自己项目成长的印记以及分享。

html表格打印填充分页,window.print()页面打印之表格内容分页填充进行分页打印相关推荐

  1. window.print()页面打印之表格内容分页填充进行分页打印

    windwow.print()用于打印当前窗口的内容,很简便,可当内容特殊并且打印有特殊需求的时候就要绕个圈了.下面是需要打印的表格: 当数据量少的时候像上面的表格一样,中间的内容只有5条数据,打印出 ...

  2. 如何设置打印的时候不加上页面链接_excel表格的这10个打印小技巧,办公室财务人员记得收藏...

    打印工作表是日常工作中最常见的一个工作,也是Excel在工作中最常用的一个地方,如何做到快速准确地打印文件呢.今天文理会计小编给大家从网上整理了几个打印文件的小技巧. 1.打印标题 打印的工作表的数据 ...

  3. window.print() 前端页面打印与预览PDF

    window.print()打印是浏览器自带的打印,实现原理是将html转换为pdf可以在线预览打印或者导出pdf,在任何网页上可通过Ctil+p快捷键调出浏览器打印程序,它可将整个网页打印出来,在我 ...

  4. window.print 打印页面指定区域

    这一阵子由于项目需要,需要在项目某页面下加一个打印的功能,在网上查过之后,知道了window.print 这个函数,这个函数可以很方便的打印当前窗口中的内容, 但是这个有时候并不能满足广大用户的需求: ...

  5. window.print() 前端实现网页打印详解

    前言 print作为浏览已经比较成熟的技术可以经常被用来打印页面的部分内容,我们可以在MDN上查看到相关的简单介绍. 一.print()方法 print() 方法用于打印当前窗口的内容.调用 prin ...

  6. window.print()实现打印指定内容——功能实现

    最近在做后台管理系统时,需要实现一个打印功能,打印的内容为页面上指定的dom.此时可以通过window.print()功能来实现: html部分 <button @@click="pr ...

  7. 网页打印的简单实现 + window.print

    网页打印的简单实现 最经在做一个web小项目的时候,需要从网页中打印出表格数据. 由于是第一次接触网页打印,所以从网络搜索了很久,鉴于项目要求的打印功能比较简单,最终放弃了诸多的开源项目,而是选择了利 ...

  8. window.print();html 打印 之 print.js

    插件地址:Print.js - Javascript library for HTML elements, PDF and image files printing. 最近顾客需要把html打印,用w ...

  9. window.print()打印网页局部内容

    用window.print()打印网页局部内容 今天客户让添加个打印证照功能,直接用window.print()打印的是整个页面,而用以下方法就可以只打印证明了 <!--window.print ...

最新文章

  1. 学习C++ 丨 类(Classes)的定义与实现!C/C++必学知识点!
  2. vs2013配置opencv2.4.9
  3. 总有人愿意为了你多做一些
  4. 自定义条件查询_数据查询不止有vlookup函数,自定义zlookup函数查询操作更高效...
  5. java 根据类名示例化类_Java即时类| plusMillis()方法与示例
  6. 【操作系统】库函数与系统调用的区别
  7. 65 年来,全英国向他道歉三次,图灵,计算机人不能忘记的男人
  8. java util.function.BiConsumer
  9. mysql 组复制 不一致_MySQL主从复制什么原因会造成不一致,如何预防及解决
  10. ACL2016最佳论文:通过交互学习语言游戏
  11. android常用的存储方式,Android数据的四种存储方式
  12. android逆向工程dex2jar使用
  13. 使用ImageJ软件计算信噪比(SNR)的小工具
  14. python自定义函数详解_python 自定义函数
  15. 计算机怎么清理CAD,怎么完全卸载cad
  16. xp启用计算机共享打印机,Win7如何共享xp的打印机
  17. 网页特殊符号HTML代码大全
  18. 靶机渗透之Typhoon实战
  19. 制作启动U盘重装系统
  20. 最常考的Java后台面试题(一)Java基础

热门文章

  1. 书论29 颜真卿《怀素上人草书歌序》
  2. 关于列columns的一些配置
  3. Excel 分组统计不重复项
  4. Android EventBus的实现原理
  5. 数据挖掘并不遥远( 转载)
  6. quartus 13.0 之四位全加器(不需要用modelism的歪门邪道)
  7. 莫纳什计算机硕士课程挂科率,莫纳什真的是挂科重灾区?
  8. ios设置音乐audio自动播放
  9. 自制原版mega2560(mega16U2 and mega2560 BootLoader 恢复再造)
  10. Oracle数据优化,超级全