I\'ve currently got a spreadsheet type program that keeps its data in an ArrayList of HashMaps. You\'ll no doubt be shocked when I tell you that this hasn\'t proven ideal.
From your description, it seems that instead of an ArrayList of HashMaps you rather want a (Linked)HashMap of ArrayList (each ArrayList would be a column).
I'd add a double map from field-name to column-number, and some clever getters/setters that never throw IndexOutOfBoundsException.
You can also use a ArrayList (basically a jagged dinamically growing matrix) and keep the mapping to field (column) names outside.
Some columns will have a lot of repeated values
I doubt this matters, specially if they are Strings, (they are internalized) and your collection would store references to them.