要把一個長表格打印出來,要做到正確分頁,直接用HTML生成表格是不能滿足要求的:
1、如果把整個表格放在一頁,在打印時再自動分頁,則有可能在某一表格行中間分頁,而且只能有一個表格頭,不能每頁一個,因為你不知道會在哪里分頁;
2、如果按照固定的行數分頁,由于每行的高度不一樣,就會造成有的頁不能填滿,有的卻太滿自動分頁了。
原來考慮過一種方法:
利用Javascript動態生成表格,每次往表格的最后插入一行,然后檢查表格高度,如果高度超過了一頁的最大高度,則把這一行刪除,新建一個表格,把這一行插入到新的表格里面,如此循環,直到全部行插入完畢。但是,利用table的height屬性、style.height屬性都得不到表格的實際高度(只有設置了height屬性、style的height屬性才能取得這兩個值,但只是設置值,并不是實際值),于是就只能放棄了。
后來仔細查看了table的dom屬性,才知道它還有clientHeight,offsetHeight等屬性,這兩個才是表格的真正高度,它們之間的區別可看這里:
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區別不大。
構建這個頁面需要用到的:
table的insertRow(),deleteRow()方法,用來給表格增加、刪除一行(tr);
tr的insertCell()方法,用來給一行加入一格(td);
td的innerText屬性,用來給一格加入內容。
CSS分頁要用到page-break-before:always(或page-break-after:aways)的樣式,遇到使用了該樣式的標簽,就會在標簽前面(或后面)強制分頁,于是可以在兩個表格之間加一個這樣的分頁。
為了顯示而不打印,還要用到<style>標簽的media屬性,當設置
<style media="print">
.noprint {display:none}
</style>
時,用了noprint作為class的標簽就只會顯示而不打印出來。
對于IE,還可以使用WebBrowser控件,彈出“頁面設置”窗口、“打印預覽”窗口、直接打印等功能。對于其他瀏覽器,則只能調用window.print()函數了。
JSF生成的中文都是用&#unicode;來表示的,其中unicode是中文字符的UNICODE編碼,通過innerText生成表格內容時,必須把這些東西轉換成真正的中文,否則會直接把這些符號插入到表格中,慘不忍睹。javascript里有個String.fromCharCode()函數可以把Unicode編碼轉換成字符。另外,通過innerHTML加入內容也可把這些編碼正常顯示出來,但需要escape XML,以免把內容當作HTML標簽渲染。