我使用C#里面的NPOI库打开一个excel文件,结果总是报告
解析Excle文件
Wrong Local header signature: 0x41C
错误。拿着这个错误在网上搜索了半天,没有一个是0x41C
的,请问谁知道这个错误怎么解决吗?
Excel文件是 .xlsx 格式使用office是可以打开的。
打开的代码
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HPSF;
file = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (0 < fileName.IndexOf(".xlsx"))
{
// 2007+
workbook = new XSSFWorkbook(file);
}
else if (0 < fileName.IndexOf(".xls"))
{
// 2003
workbook = new HSSFWorkbook(file);
}
else
{
return;
}
试试把文件另存为一遍之后再读取
另存为之后倒是可以的,但是每次都要求先把文件另存为一次似乎也说不过去呀。
@cnblogs_lei:
我先说结论:原因在于文件真正的类型和文件后缀名不匹配
你的.xlsx文件能通过office打开,但实际上这个文件真正的类型不是.xlsx(可能是.xls, .csv等等其他能用office打开的excel文件,只是通过重命名改成的.xlsx),但是你的代码又是通过文件名后缀来判断用哪个workbook的,由于真正的类型不是.xlsx所以才报错。另存为是office把这个文件转换成了真正的.xlsx文件。
@复制粘贴机器人: 我明白你的意思了。我尝试将文件重命名为 .xls 之后也是打开失败了,重命名为 .csv 之后使用notepad++打开直接是乱码的。那可能还是其他的什么被excel支持的数据格式。
这个文件是从小米的IOT后台导出来的记录文件,也不知道他们实际用的什么格式最终保存为 .xlsx 了,我本地只是想做个工具来方便我们内部解析、查看数据而已。
@cnblogs_lei: https://github.com/nissl-lab/npoi/issues/1150
能否提供下你项目里bin目录下的ICSharpCode.SharpZipLib.dll
的文件版本
理论上这些文件格式都有可能,可以一个个新建文件试一下看是哪种文件类型报41C
将文件对照了进行各种后缀名的重命名,然后去执行解析:
try
{
file = new FileStream(fileName, FileMode.Open, FileAccess.Read);
// 直接先按照2007+打开,然后尝试2003
try
{
Console.WriteLine("excel 2007");
workbook = new XSSFWorkbook(file);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("excel 2003");
workbook = new HSSFWorkbook(file);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
实际上会报错:
解析Excle文件
excel 2007
Wrong Local header signature: 0x41C
excel 2003
Invalid header signature; read 0xBDC70600B80BE308, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
升级 NPOI 版本。某些旧版本的 NPOI 可能在读取 .xlsx 文件时存在一些 bug。尝试将 NPOI 更新到最新版本,以确保使用了修复了这个问题的版本。
NPOI的版本是最新的了。实在搞不定,到网上找了下,使用 EPPlus 这个库就行了。
C#读写Excel的四种方案
xlsx 类型的时候获取IWorkbook 对象是不要使用流进行创建,直接使用文件路径进行创建即可解决