要把一個(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)簽渲染。