workbook = new XSSFWorkbook(sm);
我用的是NPOI的方式导入Excel2007,运行到这句代码时,就报以下错误:
未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
版本不一致
三步:
1、删除原有引用ICSharpCode.SharpZipLib
2、重新引用Version=0.86.0.518的ICSharpCode.SharpZipLib
3、重新编译项目
workbook = WorkbookFactory.Create(sm);//使用接口,自动识别excel2003/2007格式
现把解决方法总结一下:
1.开始时出现的错误:
未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
这个错误的确是由于引用的NPOI.dll版本不正确造成的,我在NPOI官网找到了最新版本的NPOI.dll,版本2.2.0.0。里面有dotnet2和dotnet4两种,每种都包含有5个dll文件,我将我的程序里原来引用的NPOI.dll移除,将dotnet4中的5个dll全部引用上,结果还是出现相同的错误,再移除,换成dotnet2中的5个dll,这次错误变成“EOF in header”了。
2.现在NPOI.dll版本已经没有问题了,出现“EOF in header”的错误是由于我采用的方法有问题,我当时的代码如下:
IWorkbook workbook = null; try { workbook = new HSSFWorkbook(sm);//2003 } catch (Exception) { workbook = new XSSFWorkbook(fm);//2007 }
原本是想在识别文件格式为2003失败时,就用catch将文件作为2007格式识别的,
可是依然运行到workbook = new XSSFWorkbook(fm);//2007这句就走不下去了,此时提示的错误就是
“EOF in header”。在网上试了很多方法,将sm的资源在catch中先进行释放并关闭的操作也试了,还是一样。
3.又换了种思路,直接将文件的路径传过来,代码如下:
ISheet sheet = null; FileStream fs = null; try { fs = new FileStream(path, FileMode.Open, FileAccess.Read); HSSFWorkbook wk = new HSSFWorkbook(sm); sheet = wk.GetSheet("Sheet1"); } catch (Exception) { fs = new FileStream(path, FileMode.Open, FileAccess.Read); XSSFWorkbook wk = new XSSFWorkbook(sm); sheet = wk.GetSheet("Sheet1"); }
到这里又遇到了新的问题,如何获取FileUpload在客户端的包括路径的文件全名。
最简单的方式就是:IE------工具------Internet选项------安全-----自定义级别------将文件上传到服务器时包含本地目录路径启用 ,然后就可以用fileupload.postfile.filename就可以获取路径了。
在IE下测试通过,2003和2007的文件都可以正常识别了。
4.换用360浏览器,又不行了,360浏览器还是获取不到文件的路径。
最后的解决办法,就是把上面的代码全部干掉。换成下面这句:
IWorkbook workbook = null; workbook = WorkbookFactory.Create(sm);//使用接口,自动识别excel2003/2007格式
整个世界都干净了。
总结这个方法给有需要的人进行参考。