amp@java

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

          要把一個長表格打印出來,要做到正確分頁,直接用HTML生成表格是不能滿足要求的:
          1、如果把整個表格放在一頁,在打印時再自動分頁,則有可能在某一表格行中間分頁,而且只能有一個表格頭,不能每頁一個,因為你不知道會在哪里分頁;
          2、如果按照固定的行數(shù)分頁,由于每行的高度不一樣,就會造成有的頁不能填滿,有的卻太滿自動分頁了。

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

          后來仔細查看了table的dom屬性,才知道它還有clientHeight,offsetHeight等屬性,這兩個才是表格的真正高度,它們之間的區(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的高度。對于要打印的表格,border一般只有2px,所以用clientHeight和offsetHeight區(qū)別不大。

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

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

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

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

          JSF生成的中文都是用&#unicode;來表示的,其中unicode是中文字符的UNICODE編碼,通過innerText生成表格內(nèi)容時,必須把這些東西轉(zhuǎn)換成真正的中文,否則會直接把這些符號插入到表格中,慘不忍睹。javascript里有個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 閱讀(9606) 評論(8)  編輯  收藏 所屬分類: JSF

          評論

          # re: Web表格打印頁面的生成 2006-11-08 02:18 emu
          1、如果把整個表格放在一頁,在打印時再自動分頁,則有可能在某一表格行中間分頁,而且只能有一個表格頭,不能每頁一個,因為你不知道會在哪里分頁;
          2、如果按照固定的行數(shù)分頁,由于每行的高度不一樣,就會造成有的頁不能填滿,有的卻太滿自動分頁了。

          ie在打印的時候不但可以在每頁自動添加,還可以自動添加表腳,當(dāng)然還可以自動判斷長度分頁,實現(xiàn)這些都不需要半點腳本。請看這個例子(使用了內(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%">這 是 一 個 測 試</th></tfoot>
          </TABLE>
          </BODY>
          <SCRIPT LANGUAGE="JavaScript">
          preview();
          </SCRIPT>
          </HTML>

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

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

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

          不過不用腳本生成表格的話還是有可能會把行攔腰截斷,上面那個不截斷,是因為行高比較小,我稍稍改了一下每行的內(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%">這 是 一 個 測 試</th></tfoot>
          </TABLE>
          </BODY>
          <SCRIPT LANGUAGE="JavaScript">
          preview();
          </SCRIPT>
          </HTML>  回復(fù)  更多評論
            

          # re: Web表格打印頁面的生成 2006-11-09 01:27 emu
          實際應(yīng)用當(dāng)中,就要考慮行高是否真的這么自由,分行是否真的這么不可接受了了。比如說,行高超過了一頁怎么辦,不得不分行的時候是否還需要保持每頁的表頭表腳,不用樣式而用腳本的話,表頭表腳要如何正確的呈現(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%">這 是 一 個 測 試</th></tfoot>
          </TABLE>
          </BODY>
          <SCRIPT LANGUAGE="JavaScript">
          preview();
          </SCRIPT>
          </HTML>   回復(fù)  更多評論
            

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

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

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

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

          # re: Web表格打印頁面的生成 2008-01-24 14:25 msung
          amp@java 你好,我遇到這個問題很久,由于數(shù)據(jù)太多,一個td里的東西在一個頁面下根本放不下,就會分開倆頁打,這就造成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>計劃信息打印</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) //這個也是查詢指定對象的高度。
          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的個數(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’的對象的高度賦值為850
          //并且給id為pp的對象插入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樣式,用于倆個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('')}月份工作月報</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">填報人&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>上月計劃</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>本月計劃</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ù)  更多評論
            

          主站蜘蛛池模板: 都昌县| 宁阳县| 华安县| 柳江县| 山西省| 武平县| 永州市| 龙山县| 荥阳市| 汉沽区| 盐源县| 莲花县| 贡山| 永善县| 闻喜县| 咸宁市| 寻乌县| 柞水县| 张家口市| 鄯善县| 通化市| 西林县| 馆陶县| 鄂尔多斯市| 宜良县| 玉溪市| 隆林| 黎城县| 永和县| 北京市| 焉耆| 赣州市| 长岭县| 乐亭县| 称多县| 陆河县| 大丰市| 定西市| 武冈市| 依安县| 博客|