I have thought of a fifth solution that might be ideal. Datainserts seem to start at the bottom row and work up. I loop that says "while my row insertion cell array is not empty, keep trying to insert and on failure (catch) delete the last row".
This is not ideal as a lot of rows will may need to be deleted until the error one is reached but is at least a start. Let me know if anyone has any ideas.