在读取或修改某些用户创建的.xlsx文件时,收到以下错误消息:
We 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.
点击是,会收到另一条消息:
Excel 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文件here(放入NPOI之前)。
这是同一个文件,在使用iWorkbook.Write(filestream);
here读取和回写后现已损坏。
使用以下代码创建新的.xlsx文件时没有问题:
string newPath = @"C:\MyPath\test.xlsx";
using (FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write))
{
IWorkbook wb = new XSSFWorkbook();
wb.CreateSheet();
ISheet s = wb.GetSheetAt(0);
IRow r = s.CreateRow(0);
r.CreateCell(0);
ICell c = r.GetCell(0);
c.SetCellValue("test");
wb.Write(fs);
fs.Close();
}
工作正常。
即使打开一个有问题的子.xlsx文件,将其设置为IWorkbook并将其写回文件也可以:
string 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,ICell等等......它会破坏.xlsx文件。 即使我专门删除了修改工作簿的任何内容。没有使用NPOI创建,设置,样式等。
我无法真正包含我的代码,因为它只会让人感到困惑,但为了完整起见,我在这次测试中只使用了NPOI的以下类型和函数:
IWorkbook
XSSFWorkbook
ISheet
IRow
ICell
.GetSheetAt
.GetRow
.GetCell
.LastRowNum
所以其中一个会导致腐败。我想最终再次设置值,让它像我对.xls一样工作。
有没有人经历过这个?什么是可能导致腐败的NPOI功能?任何输入将不胜感激。
编辑:使用NPOI v2.2.1。
答案 0 :(得分:5)
我认为问题在于您正在阅读和写入相同的FileStream
。您应该使用单独的流进行读写。
试试这样:
string 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);
}
答案 1 :(得分:2)
我有同样的问题。就我而言,问题不在于NPOI本身,而在于其依赖项SharpZipLib。
我使用了NPOI 2.3.0和SharpZipLib 1.0.0。并给出与您的情况相同的错误。生成的Excel大小为0字节。 在使用NPOI(服务层)的项目中以及在MVC项目中,我都将SharpZipLib降级到0.86.0(在这里我也有SharpZipLib软件包)。
我还在web.config中手动删除了先前为SharpZipLib创建的程序集依赖项:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
.......
<dependentAssembly>
<assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.0.999" newVersion="1.0.0.999" />
</dependentAssembly>
</assemblyBinding>
我希望这对某人有帮助。