开始,我们使用的是老版本的 NPOI 来处理 Excel,为了自动识别 2007(及以上版本,下同)、2003 版本,使用如下代码:
try { UserModel = new NPOI.XSSF.UserModel.XSSFWorkbook(stream); // 2007 格式 } catch (Exception) { UserModel = new NPOI.HSSF.UserModel.HSSFWorkbook(stream); // 2003 格式 }
基本运转正常,能够正常识别 2007、2003 格式,但是由于 NPOI 是老版本,所以某些 2007 中的方法还是 Not NotImplementedException(),没办法,只好升级 NPOI 的版本(新版本的 NPOI 不再支持 .NET 2.0),升级 NPOI 后,还是使用的上述代码来判断是哪种格式,但是在遇到 2003 时,提示如下错误:
Invalid header signature; read System.Char[], expected System.Char[] - Your file appears not to be a valid OLE2 document
解决办法如下:
try { UserModel = new NPOI.XSSF.UserModel.XSSFWorkbook(stream); // 2007 格式 } catch (Exception) { stream.Position = 0; // 增加这句 UserModel = new NPOI.HSSF.UserModel.HSSFWorkbook(stream); // 2003 格式 }
或者使用下面的方法:
NPOI.SS.UserModel.WorkbookFactory.Create(stream)
当然,如果遇到 Excel 格式被破坏,或者不是真 Excel 格式,也会遇到上述错误,这种就没办法用上述方法解决了。