A lot depends on the data. I have one client that does a variety of imports from their clients. Some scripts they can run themselves. These are imported into a temp table and extensive error checking is done on each record. If an error is found the record is flagged and ignored. An additional variable ($Errors) is set and checked at the end of the script. If there are errors I send them to the temp table and show the flagged errors.
I would recommend (not listed) option 3. Do not let users freely import spreadsheets.
Keep data imports totally scripted and behind the scenes. If a user wants to do an spreadsheet import, that spreadsheet should be programmatically generated for consistency and the only way to import it is via a script tightly controlled by the program.
If you're sure about the format, you could use either of your two methods depending on project factors.