try ... WIN32::OLE
Thanks for the suggestion. Actually, I just tested Win32::OLE earlier today. A simple script (not shown) found that the sheet names and contents were in the right order. The "desired" data was present and readable.
The only practical problem for me is that I'd be difficult to use this on the unix server (I don't even have wine there). If all else fails, I could switch things around to have the client (windows) computers do the parsing, but I'll waste some more time on this approach before giving up.
Just for curiosity, I'll try to figure out why Spreadsheet::ParseExcel::Simple fails. Is it a weird excel file or a real bug?