Remove some unused information from the low level struct definitions to simplify things a little.
Use dimensions in sheet definitions instead of looping through rows/columns to find the dimensions.  This should restrict the main loop to only the range of cells that are actually in use, and drop the loop finding the maximum extent.  This should speed things up quite a bit.