<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    amp@java

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      99 隨筆 :: 0 文章 :: 228 評(píng)論 :: 0 Trackbacks

    要把一個(gè)長表格打印出來,要做到正確分頁,直接用HTML生成表格是不能滿足要求的:
    1、如果把整個(gè)表格放在一頁,在打印時(shí)再自動(dòng)分頁,則有可能在某一表格行中間分頁,而且只能有一個(gè)表格頭,不能每頁一個(gè),因?yàn)槟悴恢罆?huì)在哪里分頁;
    2、如果按照固定的行數(shù)分頁,由于每行的高度不一樣,就會(huì)造成有的頁不能填滿,有的卻太滿自動(dòng)分頁了。

    原來考慮過一種方法:
    利用Javascript動(dòng)態(tài)生成表格,每次往表格的最后插入一行,然后檢查表格高度,如果高度超過了一頁的最大高度,則把這一行刪除,新建一個(gè)表格,把這一行插入到新的表格里面,如此循環(huán),直到全部行插入完畢。但是,利用table的height屬性、style.height屬性都得不到表格的實(shí)際高度(只有設(shè)置了height屬性、style的height屬性才能取得這兩個(gè)值,但只是設(shè)置值,并不是實(shí)際值),于是就只能放棄了。

    后來仔細(xì)查看了table的dom屬性,才知道它還有clientHeight,offsetHeight等屬性,這兩個(gè)才是表格的真正高度,它們之間的區(qū)別可看這里:
    http://developer.mozilla.org/cn/docs/DOM:element.clientHeight
    http://developer.mozilla.org/en/docs/DOM:element.offsetHeight
    更直觀的可以看這里:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/om/measuring.asp


    簡單地說,clientHeight就是不包含border的高度,offsetHeight就是連border的高度。對(duì)于要打印的表格,border一般只有2px,所以用clientHeight和offsetHeight區(qū)別不大。

    構(gòu)建這個(gè)頁面需要用到的:

    table的insertRow(),deleteRow()方法,用來給表格增加、刪除一行(tr);
    tr的insertCell()方法,用來給一行加入一格(td);
    td的innerText屬性,用來給一格加入內(nèi)容。

    CSS分頁要用到page-break-before:always(或page-break-after:aways)的樣式,遇到使用了該樣式的標(biāo)簽,就會(huì)在標(biāo)簽前面(或后面)強(qiáng)制分頁,于是可以在兩個(gè)表格之間加一個(gè)這樣的分頁。
    為了顯示而不打印,還要用到<style>標(biāo)簽的media屬性,當(dāng)設(shè)置
    <style media="print">
    .noprint {display:none}
    </style>
    時(shí),用了noprint作為class的標(biāo)簽就只會(huì)顯示而不打印出來。

    對(duì)于IE,還可以使用WebBrowser控件,彈出“頁面設(shè)置”窗口、“打印預(yù)覽”窗口、直接打印等功能。對(duì)于其他瀏覽器,則只能調(diào)用window.print()函數(shù)了。

    JSF生成的中文都是用&#unicode;來表示的,其中unicode是中文字符的UNICODE編碼,通過innerText生成表格內(nèi)容時(shí),必須把這些東西轉(zhuǎn)換成真正的中文,否則會(huì)直接把這些符號(hào)插入到表格中,慘不忍睹。javascript里有個(gè)String.fromCharCode()函數(shù)可以把Unicode編碼轉(zhuǎn)換成字符。另外,通過innerHTML加入內(nèi)容也可把這些編碼正常顯示出來,但需要escape XML,以免把內(nèi)容當(dāng)作HTML標(biāo)簽渲染。


    posted on 2006-11-07 10:11 amp@java 閱讀(9604) 評(píng)論(8)  編輯  收藏 所屬分類: JSF

    評(píng)論

    # re: Web表格打印頁面的生成 2006-11-08 02:18 emu
    1、如果把整個(gè)表格放在一頁,在打印時(shí)再自動(dòng)分頁,則有可能在某一表格行中間分頁,而且只能有一個(gè)表格頭,不能每頁一個(gè),因?yàn)槟悴恢罆?huì)在哪里分頁;
    2、如果按照固定的行數(shù)分頁,由于每行的高度不一樣,就會(huì)造成有的頁不能填滿,有的卻太滿自動(dòng)分頁了。

    ie在打印的時(shí)候不但可以在每頁自動(dòng)添加,還可以自動(dòng)添加表腳,當(dāng)然還可以自動(dòng)判斷長度分頁,實(shí)現(xiàn)這些都不需要半點(diǎn)腳本。請(qǐng)看這個(gè)例子(使用了內(nèi)置打印控件來預(yù)覽,如果被瀏覽器禁止了需要手工使用打印預(yù)覽功能或者打印出來)

    <HTML>
    <HEAD>
    <SCRIPT LANGUAGE="JavaScript">
    function pageSetup(){try{WB.ExecWB(8,1)}catch(e){alert("您的瀏覽器不支持此功能")}}
    function preview(){try{WB.ExecWB(7,1)}catch(e){alert("您的瀏覽器不支持此功能")}}
    </SCRIPT>
    <style>
    td,th{border-bottom:1px solid black;width:70px}
    thead{display:table-header-group}
    tfoot{display:table-footer-group}
    </style>
    </HEAD>
    <BODY>
    <OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WB width=0 VIEWASTEXT></OBJECT>
    <TABLE cellspacing=0 align=center>
    <thead><th> 姓 名 </th><th> 地 址 </th><th> 籍 貫 </th><th>畢業(yè)學(xué)校</th><th> 年 齡 </th><th> 性 別 </th><th> 婚 否 </th></thead>
    <tbody align=center>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var n=100;
    for(var i=0;i<n;i++){
    document.write("<tr>");
    for(var j=0;j<7;j++)
    document.write("<td>"+Math.round(Math.random()*10000)+
    (Math.random()>.05?"":"<br>"+Math.round(Math.random()*10000))+
    (Math.random()>.02?"":"<br>"+Math.round(Math.random()*10000))+
    (Math.random()>.01?"":"<br>"+Math.round(Math.random()*10000))+
    "</td>");
    document.write("</tr>");
    }
    //-->
    </SCRIPT>
    </tbody>
    <tfoot><th colspan=7 align=center style="width:100%">這 是 一 個(gè) 測 試</th></tfoot>
    </TABLE>
    </BODY>
    <SCRIPT LANGUAGE="JavaScript">
    preview();
    </SCRIPT>
    </HTML>

    例子中特意使用腳本構(gòu)造了隨機(jī)高度的行。  回復(fù)  更多評(píng)論
      

    # re: Web表格打印頁面的生成 2006-11-08 02:25 emu
    這個(gè)例子在firefox下面使用的時(shí)候頁腳有顯示不完整的現(xiàn)象。不知道是否firefox的打印預(yù)覽功能的bug。為tbody添加上display: table-row-group樣式后有一些改觀但是沒有完全解決。  回復(fù)  更多評(píng)論
      

    # re: Web表格打印頁面的生成 2006-11-08 22:04 amp@java
    謝謝,我現(xiàn)在才知道還有display:table-header-group這個(gè)樣式。

    不過不用腳本生成表格的話還是有可能會(huì)把行攔腰截?cái)?,上面那個(gè)不截?cái)?,是因?yàn)樾懈弑容^小,我稍稍改了一下每行的內(nèi)容,就出現(xiàn)了:

    <HTML>
    <HEAD>
    <SCRIPT LANGUAGE="JavaScript">
    function pageSetup(){try{WB.ExecWB(8,1)}catch(e){alert("您的瀏覽器不支持此功能")}}
    function preview(){try{WB.ExecWB(7,1)}catch(e){alert("您的瀏覽器不支持此功能")}}
    </SCRIPT>
    <style>
    td, th{border-bottom:1px solid black;width:70px}
    thead{display:table-header-group}
    tfoot{display:table-footer-group}
    </style>
    </HEAD>
    <BODY>
    <OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WB width=0 VIEWASTEXT></OBJECT>
    <TABLE cellspacing=0 align=center border=1>
    <thead><th> 姓 名 </th><th> 地 址 </th><th> 籍 貫 </th><th>畢業(yè)學(xué)校</th><th> 年 齡 </th><th> 性 別 </th><th> 婚 否

    </th></thead>
    <tbody align=center>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var n=100;
    for(var i=0;i<n;i++){
    document.write("<tr>");
    for(var j=0;j<7;j++)
    document.write("<td>有可能在某一表格行中間分頁在某一表格行中間分頁</td>");
    document.write("</tr>");
    }
    //-->

    </SCRIPT>
    </tbody>
    <tfoot><th colspan=7 align=center style="width:100%">這 是 一 個(gè) 測 試</th></tfoot>
    </TABLE>
    </BODY>
    <SCRIPT LANGUAGE="JavaScript">
    preview();
    </SCRIPT>
    </HTML>  回復(fù)  更多評(píng)論
      

    # re: Web表格打印頁面的生成 2006-11-09 01:27 emu
    實(shí)際應(yīng)用當(dāng)中,就要考慮行高是否真的這么自由,分行是否真的這么不可接受了了。比如說,行高超過了一頁怎么辦,不得不分行的時(shí)候是否還需要保持每頁的表頭表腳,不用樣式而用腳本的話,表頭表腳要如何正確的呈現(xiàn)?

    <HTML>
    <HEAD>
    <SCRIPT LANGUAGE="JavaScript">
    function pageSetup(){try{WB.ExecWB(8,1)}catch(e){alert("您的瀏覽器不支持此功能")}}
    function preview(){try{WB.ExecWB(7,1)}catch(e){alert("您的瀏覽器不支持此功能")}}
    </SCRIPT>
    <style>
    td, th{border-bottom:1px solid black;width:70px}
    thead{display:table-header-group}
    tfoot{display:table-footer-group}
    </style>
    </HEAD>
    <BODY>
    <OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WB width=0 VIEWASTEXT></OBJECT>
    <TABLE cellspacing=0 align=center border=1>
    <thead><th> 姓 名 </th><th> 地 址 </th><th> 籍 貫 </th><th>畢業(yè)學(xué)校</th><th> 年 齡 </th><th> 性 別 </th><th> 婚 否 </th></thead>
    <tbody align=center>
    <SCRIPT LANGUAGE="JavaScript">
    document.write("<tr>");
    for(var j=0;j<7;j++)
    document.write("<td>"+(new Array(10).join("有可能在某一表格行中間分頁在某一表格行中間分頁"))+"</td>");
    document.write("</tr>");
    </SCRIPT>
    </tbody>
    <tfoot><th colspan=7 align=center style="width:100%">這 是 一 個(gè) 測 試</th></tfoot>
    </TABLE>
    </BODY>
    <SCRIPT LANGUAGE="JavaScript">
    preview();
    </SCRIPT>
    </HTML>   回復(fù)  更多評(píng)論
      

    # re: Web表格打印頁面的生成 2006-11-09 09:32 amp@java
    行高超過一頁的情況是極少的,但一般3-4行文字的高度是經(jīng)常有的,這樣的高度就足以造成一行分兩頁,我的應(yīng)用中就遇到過,打印出來有點(diǎn)奇怪。使用腳本生成表格之后,每頁一個(gè)完整的表格,而且基本能滿一頁,看起來舒服點(diǎn)。

    腳本可以生成任意HTML,當(dāng)判斷表格高度滿一頁的時(shí)候,就利用 page-break-before:always 樣式生成一個(gè)分頁符,再新建一個(gè)表格,這個(gè)表格就在下一頁了,可以通過腳本往里面加入新的內(nèi)容,表格的表頭和表腳都可以用腳本生成。另外,用innerHTML就可以在某標(biāo)簽范圍內(nèi)加入任意HTML語句,所以還可以生成其他的內(nèi)容。  回復(fù)  更多評(píng)論
      

    # re: Web表格打印頁面的生成 2008-01-08 12:09 as
    怎么知道打印頁面的高度啊?  回復(fù)  更多評(píng)論
      

    # re: Web表格打印頁面的生成[未登錄] 2008-01-13 00:29 amp@java
    @as
    一般都是A4紙,所以就按照A4紙的高度來定  回復(fù)  更多評(píng)論
      

    # re: Web表格打印頁面的生成 2008-01-24 14:25 msung
    amp@java 你好,我遇到這個(gè)問題很久,由于數(shù)據(jù)太多,一個(gè)td里的東西在一個(gè)頁面下根本放不下,就會(huì)分開倆頁打,這就造成tr分成倆頁,特別難看,下面是我的代碼。你有什么好方法。能避免這準(zhǔn)分頁。

    <#assign ww=JspTaglibs["/WEB-INF/webwork.tld"] />
    <html>
    <style type="text/css">
    <!--
    a { font-family: "宋體"; font-size: 10pt; text-decoration: none; }
    a:link { font: 12pt "宋體"; color: #336699; text-decoration: none; }
    a:active { font: 12pt "宋體"; color: #336699; text-decoration: none; }
    a:visited { font: 12pt "宋體"; color: #336699; text-decoration: none; }
    a:hover { font: 12pt "宋體"; color: #FF4333; text-decoration: none; }
    td { font-size:12pt }
    .td_css {
    BORDER-RIGHT: #000000 1px solid;
    BORDER-BOTTOM: #000000 1px solid;
    }

    .table_css{
    BORDER-top: #000000 1px solid;
    BORDER-left: #000000 1px solid
    }
    .prin{
    font: 15pt "宋體"; color: #FFFFF; text-decoration: none;
    }
    .pageEnd {page-break-before:always}
    -->
    </style>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>計(jì)劃信息打印</title>
    <meta content="no-cache">
    <script language='javascript' src='../../scripts/checkform.js' ></script>
    <script language="javascript" src="../../scripts/Calendar.js"></script>
    <script language="javascript" src="../include/Common.js"></script>
    <script type="text/javascript">

    function fReturn(){
    history.go(-1);
    }
    function select(key){
    // alert(document.getElementById('PM').style.display);
    findObj(key).style.display='';

    }

    //直接打印
    function doPrint() {
    //alert(findObj('antable').clientHeight);
    //alert(document.all.table.rows(0).cells(0).offsetHeight) //這個(gè)也是查詢指定對(duì)象的高度。
    bdhtml=window.document.body.innerHTML;
    sprnstr="<!--startprint-->";
    eprnstr="<!--endprint-->";
    prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17);
    prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));
    window.document.body.innerHTML=prnhtml;
    var table1=document.all.tags("table") //找出所有table
    //alert(table1);
    var tabnumber=table1.length; //table的個(gè)數(shù)
    //alert(tabnumber);
    for(var i=0;i<=tabnumber;i++){ //循環(huán)遍歷table
    //alert(table1[i].id); //輸出table的id
    //下面是找出table的id為table的table,并且查出table的高度,如果他的高度高于899,就給它里面的id為‘one’的對(duì)象的高度賦值為850
    //并且給id為pp的對(duì)象插入pageEnd的樣式,然后跳出循環(huán)。
    if(table1[i].id=="table"){
    //var frameheight=table1[i].rows(0).cells(0).offsetHeight
    var frameheight = findObj('table').clientHeight;
    if(frameheight>899){
    document.getElementById('one').height='850'
    //alert(document.getElementById('one').height);
    //alert(document.getElementById('PP').className);
    document.getElementById('PP').className='pageEnd'; //插入pageEnd樣式,用于倆個(gè)table的分頁。
    document.getElementById('two').height='850'
    //alert(document.getElementById('PP').className);
    }
    continue;
    }
    if(table1[i].id=="antable"){
    var frameheight = findObj('antable').clientHeight;
    if(frameheight>899){
    document.getElementById('three').height='850'
    document.getElementById('QQ').className='pageEnd';
    document.getElementById('four').height='850'
    }
    break;
    }
    }
    window.print();
    }

    </script>

    </head>
    <body>
    <div>
    <input type="button" name="Submit" value="返回" class="button" onClick="fReturn()">
    <input type="button" name="button" value="打印" class="button" onClick="doPrint()">

    </div>
    <!--startprint-->
    <table id="table" width="95%" align="center" border="0" cellspacing="1" cellpadding="1" >
    <tr>
    <td colspan="4" align="center"><font size="5" face="黑體_GB2312">${(plan.month)?default('')}月份工作月報(bào)</font></td>
    </tr>
    <tr>
    <td colspan="4" align="center" height="20"></td>
    </tr>
    <tr>
    <td bgcolor="#FFFFFF" width="12%">部門:</td>
    <td bgcolor="#FFFFFF" width="30%">&nbsp;&nbsp;${(plan.department)?default('')}</td>
    <td bgcolor="#FFFFFF" width="20%" align="right">日期:</td>
    <td bgcolor="#FFFFFF" width="30%" align="left">&nbsp;${(plan.mitTime)?default('')}</td>
    </tr>
    <tr><td colspan="4">
    <table id="one" width="100%" cellpadding="1" cellspacing="0" class="table_css" bgcolor="#000000">
    <tr>
    <td bgcolor="#FFFFFF" class=td_css align=center width="12%" height="30">填報(bào)人&nbsp;</td>
    <td bgcolor="#FFFFFF" class=td_css align=center width="30%">&nbsp;${(plan.realName)?default('')}</td>
    <td bgcolor="#FFFFFF" class=td_css align=center width="20%">簽發(fā)人&nbsp;</td>
    <td bgcolor="#FFFFFF" class=td_css align=center width="30%">&nbsp;${(plan.checkUserid)?default('')}</td>
    </tr>
    <tr>
    <td height="300" align="center" bgcolor=#FFFFFF class=td_css>上月計(jì)劃</td>
    <td align='left' valign='top' colspan='6' bgcolor=#FFFFFF class=td_css>${(plan.summarize)?default('')}&nbsp;</td>
    </tr>
    </table>
    </td></tr>
    <tr id="pp"><td colspan="4">
    <table id="two" width="100%" cellpadding="1" cellspacing="0" class="table_css" bgcolor="#000000">
    <tr>
    <td width="13%" height="300" align="center" bgcolor=#FFFFFF class=td_css>本月計(jì)劃</td>
    <td align='left' valign='top' colspan='6' bgcolor=#FFFFFF class=td_css>${(plan.program)?default('')}&nbsp;</td>
    </tr>
    </table>
    </td></tr>
    </table>
    </div>
    <!--endprint-->
    </body>
    </html>
      回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 四虎精品成人免费视频| 免费国产黄网站在线观看可以下载| 麻豆91免费视频| 最近中文字幕高清免费中文字幕mv | 亚洲成a人片在线观看精品| 免费一级全黄少妇性色生活片 | 国产91色综合久久免费分享| 日本黄页网站免费| 91嫩草私人成人亚洲影院| 免费亚洲视频在线观看| 精品久久久久久久久免费影院| 亚洲一区二区三区无码中文字幕| 亚洲综合av一区二区三区| 精品一区二区三区无码免费视频 | 精品国产免费观看久久久| 久久精品国产亚洲av日韩| A毛片毛片看免费| 全部免费毛片免费播放| 亚洲最大福利视频| 国产精品视_精品国产免费| 亚洲白色白色在线播放| 91视频精品全国免费观看| 亚洲国产精品无码久久久久久曰| 亚洲欧美成人av在线观看| 美女内射毛片在线看免费人动物| 亚洲成A∨人片在线观看不卡| 一级毛片在播放免费| 又粗又硬又黄又爽的免费视频 | g0g0人体全免费高清大胆视频| 毛片基地免费观看| 亚洲国产av一区二区三区丶| 久久综合国产乱子伦精品免费| 亚洲一本之道高清乱码| 国产四虎免费精品视频| 亚洲福利视频网址| 国产伦一区二区三区免费| 色综合久久精品亚洲国产| 四虎影在线永久免费观看| a毛片免费全部播放完整成| 亚洲人成电影在线观看网| 四虎影视在线永久免费观看|