关于c#:使用NPOI有问题的.xlsx文件损坏 – Excel无法打开文件’file.xlsx’,因为文件格式或文件扩展名无效

您所在的位置:网站首页 xlsx文件打不开了 关于c#:使用NPOI有问题的.xlsx文件损坏 – Excel无法打开文件’file.xlsx’,因为文件格式或文件扩展名无效

关于c#:使用NPOI有问题的.xlsx文件损坏 – Excel无法打开文件’file.xlsx’,因为文件格式或文件扩展名无效

2024-07-10 19:29| 来源: 网络整理| 查看: 265

在读取或修改某些用户创建的.xlsx文件时,我收到以下错误消息:

1We found a problem with some content in 'test.xlsx'. Do you want us to try to recover as much as we can? If you trust the source of this workbook, click Yes.

单击"是"会收到另一条消息:

1Excel cannot open the file 'test.xlsx' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.

这里是一个有问题的.xlsx文件的例子(在放入npoi之前)。

这是同一个文件,在这里被iWorkbook.Write(filestream);读取和写回后,文件已经损坏。

使用以下代码创建新的.xlsx文件没有问题:

2

那很好。

即使打开一个有问题的子.xlsx文件,将其设置为iWorkbook并将其写回该文件也可以:

12345678string newPath = @"C:\MyPath\test.xlsx"; using (FileStream fs = new FileStream(newPath, FileMode.Open, FileAccess.ReadWrite)) {     IWorkbook wb = new XSSFWorkbook(fs);     wb.Write(fs);     fs.Close(); }

但是,在运行了从中读取的代码之后,会得到isheets、irows、icells等。它会损坏.xlsx文件。即使我特别删除了修改工作簿的任何内容。不使用NPOI创建、设置、样式等。

我不能真的包含我的代码,因为它只是令人困惑,但是为了完整性,我在这个测试中实际上只使用了来自NPOI的以下类型和函数:

123456789IWorkbook XSSFWorkbook ISheet IRow ICell .GetSheetAt .GetRow .GetCell .LastRowNum

所以其中一个导致了腐败。我希望最终能再次设置值,使其像.xls一样工作。

有人经历过吗?哪些NPOI功能可能导致腐败?如有任何意见,我们将不胜感激。

编辑:使用NPOI v2.2.1。

相关讨论 你能把这些.xlsx文件上传到某个地方吗?这样我们就可以看一看了。 谢谢你的回复。以ufile.io/2B349为例进行了编辑和添加。 好的,那么这个文件有什么问题?在确认它不包含任何宏或其他宏之后,我在Excel中打开了它。您确定这与版本无关吗?我有Excel 2016。 这是使用NPOI读取之前的文件。我也可以在运行后上传损坏的文件…坚持住。 这是读写后的文件:ufile.io/9ac96我尝试了Excel2010和2013,至今没有取得好的效果。 好的,你能试试这个吗,运行生成一个损坏文件的代码,但是在运行目标文件之前确保你已经删除了它,看看是否有帮助。 我想我们可能在这里找到了解决办法。午餐后我将对其进行更多的测试,但这可能是因为我正在重写以前打开以读取的文件,现在正在用文件流保存该文件。如果我也覆盖了文件,那么使用FileAccess.ReadWrite也会成功。我会继续改变这一切。交叉我的手指!

我认为问题是你读的和写的都是同一个FileStream。您应该使用单独的流进行读写。尝试如下:

1234567891011121314151617181920string newPath = @"C:\MyPath\test.xlsx"; // read the workbook IWorkbook wb; using (FileStream fs = new FileStream(newPath, FileMode.Open, FileAccess.Read)) {     wb = new XSSFWorkbook(fs); } // make changes ISheet s = wb.GetSheetAt(0); IRow r = s.GetRow(0) ?? s.CreateRow(0); ICell c = r.GetCell(1) ?? r.CreateCell(1); c.SetCellValue("test2"); // overwrite the workbook using a new stream using (FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write)) {     wb.Write(fs); } 相关讨论 到底在哪里结束IP从"V"。卡尔森。我认为有一些数据的左上方,npoi不写回correctly和freaked退出Excel。《后npoi文件的大小是一个小小的平衡与NO的变化。做你所说的perfectly厂。

我也有同样的问题。在我的例子中,问题不在于NPOI本身,而在于它的依赖关系sharpziplib。

我使用了NPOI 2.3.0和SharpZiplib 1.0.0。它的错误与你的情况相同。生成的Excel大小为0字节。在我使用NPOI(一个服务层)的项目和MVC项目(我在这里也有sharpziplib包)中,我将sharpziplib降级为0.86.0。

我还手动删除了web.config中以前为sharpziplib创建的程序集依赖项:

123456  .......            

我希望这能帮助别人。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3