QUOTE(ShadowyBob @ Oct 20 2006, 01:44 AM)

ChristianJ, sorry, I was premature with my enthusiasm. My borders were only 1px in width and I had thought I had cracked it with the following adaptation of your css:
CODE
.o, .i { border: 1px solid; }
.o { padding: 0; border-color: #909090 #606060 #606060 #909090; }
.i { margin: 0; border-color: #C0C0C0 #303030 #303030 #C0C0C0; }
followed in the body with
CODE
<td class="o i">
Above you apply both .o and .i on the same TD element, which means the .i values will overrride .o's. If you shorten the above CSS you'd get
CODE
td {
border: 1px solid;
padding: 0;
margin: 0;
border-color: #C0C0C0 #303030 #303030 #C0C0C0;
}
in other words just a single border. The idea was that .o would apply to an outer element in order to get double colors.
QUOTE
As I only want the 'outset' effect on the cells and not the table itself, I guess the <div> effect won't work here. An obvious (to me) method might be to nest cells within cells, but then I would agree with you about an html bloat.
You can't nest a TD directly inside a TD, but you can put a DIV in a TD.
CODE
<td class="o"><div class="i">text</div></td>
You may have to check that the DIV heights expand along with the TD, otherwise the effect is ruined. This might happen if there are more text lines in some cells than others, e.g. because the user increased text size and made the content wrap.