Use tables. That's right! Bring on the downvotes! :-)
Tables are for tabular data. Tabular data is typically when cells have the same kind of data as other cells in in the same column, and related data for cells in the same row (or vice versa). If you have a form like:
First name: |___________|
Last name: |___________|
Can't we make that look more like tabular data by adding column headings:
╔═════════════╦═════════════╗
║ Field Name ║ Field value ║
╠═════════════╬═════════════╣
║ First name: ║ |_________| ║
╠═════════════╬═════════════╣
║ Last name: ║ |_________| ║
╚═════════════╩═════════════╝
Since the columns are the same type: labels and inputs, and the rows relate: labels correspond to fields, then this is tabular data! Use a table! Hooray, how easy! (but leave out the column headings and borders, of course – they were just for illustration)
The tables for layout issue really comes into play when you have only a single row. Ie, you are trying to create columns:
╔══════════════════╦═════════════════════════════╦══════════════╗
║ Left column ║ Center column ║ Right column ║
║ ║ ║ ║ ◄── Only one row
║ ║ ║ ║
╚══════════════════╩═════════════════════════════╩══════════════╝
Or when your tables are riddled with rowspans and colspans and nested tables. This is usually a pretty good sign that you are using tables for layout.
╔════════════════════════════════════════════════════════════════════╦════════════════╗
║ ║ User name ║
║ Page Header (colspan=3, rowspan=2) ╠════════════════╣
╠═════════════════╦════════════════════════════════════════════╦═════╩════════════════╣
║ Nav (rowspan=2) ║ Content ║ Side bar (colspan=2) ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ╠════════════════════════════════════════════╩══════════════════════╣
║ ║ Footer (colspan=3) ║
╚═════════════════╩═══════════════════════════════════════════════════════════════════╝
(This was actually how we did it in 1998 - back in the IE4/NS4 days. Yikes!)
But if you are presenting a grid where columns always need to line up and rows always need to line up, chances are you are presenting tabular data. A table may be appropriate in this case.
If you have 4 columns, I'm guessing you've got two columns of fields and inputs:
First name: |___________| Phone number: |___________|
Last name: |___________| Email address: |___________|
In this case, use two tables. Otherwise you would be using tables for layout, because all the cells in the row wouldn't correspond to each other.
╔═════════════╦═════════════╗ ╔════════════════╦═════════════╗
║ First name: ║ |_________| ║ ║ Phone number: ║ |_________| ║
╠═════════════╬═════════════╣ ╠════════════════╬═════════════╣
║ Last name: ║ |_________| ║ ║ Email address: ║ |_________| ║
╚═════════════╩═════════════╝ ╚════════════════╩═════════════╝