This technique is for IE5.5+ only. Note that the flip filters use ActiveX so the headers will read from top to bottom if the user has wisely limited their ActiveX security settings. I recommend this solution only if you have an easily-impressed boss.
table {
table-layout: fixed
}
thead td{
position:relative;
top: expression(document.getElementById("data").scrollTop-1);
writing-mode: tb-rl;
filter: flipv() fliph(); /*read bottom up*/
padding-bottom: 10px;
text-align: left;
white-space: nowrap;
}
| XX Code Stuff | YY Code | DDR Code | Small Numbers |
| Table footer repeats on print | |||
| X0 | Y0 | D 00 | 0 |
| X1 | Y1 | D 11 | 1 |
| X2 | Y2 | D 22 | 2 |
| X3 | Y3 | D 33 | 3 |
| X4 | Y4 | D 44 | 4 |
| X5 | Y5 | D 55 | 5 |
| X6 | Y6 | D 66 | 6 |
| X7 | Y7 | D 77 | 7 |
| X8 | Y8 | D 88 | 8 |
| X9 | Y9 | D 99 | 9 |
| X10 | Y10 | D 1010 | 10 |
| X11 | Y11 | D 1111 | 11 |
| X12 | Y12 | D 1212 | 12 |
| X13 | Y13 | D 1313 | 13 |
| X14 | Y14 | D 1414 | 14 |
| X15 | Y15 | D 1515 | 15 |
| X16 | Y16 | D 1616 | 16 |
| X17 | Y17 | D 1717 | 17 |
| X18 | Y18 | D 1818 | 18 |
| X19 | Y19 | D 1919 | 19 |
| X20 | Y20 | D 2020 | 20 |
| X21 | Y21 | D 2121 | 21 |
| X22 | Y22 | D 2222 | 22 |
| X23 | Y23 | D 2323 | 23 |
| X24 | Y24 | D 2424 | 24 |
| X25 | Y25 | D 2525 | 25 |
| X26 | Y26 | D 2626 | 26 |
| X27 | Y27 | D 2727 | 27 |
| X28 | Y28 | D 2828 | 28 |
| X29 | Y29 | D 2929 | 29 |
| X30 | Y30 | D 3030 | 30 |
| X31 | Y31 | D 3131 | 31 |
| X32 | Y32 | D 3232 | 32 |
| X33 | Y33 | D 3333 | 33 |
| X34 | Y34 | D 3434 | 34 |
| X35 | Y35 | D 3535 | 35 |
| X36 | Y36 | D 3636 | 36 |
| X37 | Y37 | D 3737 | 37 |
| X38 | Y38 | D 3838 | 38 |
| X39 | Y39 | D 3939 | 39 |
| X40 | Y40 | D 4040 | 40 |