【问题标题】:NPOI - Writing to file corrupts .xlsx workbookNPOI - 写入文件会损坏 .xlsx 工作簿
【发布时间】:2016-03-21 21:53:20
【问题描述】:

我有一段代码正在写入.xls 工作簿 (HSSFWorkbook),没有问题。但是,当我尝试使用相同的代码写入 .xlsx 工作簿 (XSSFWorkbook) 时,存档已损坏,无法在 excel 中打开。

以下代码是我用来访问工作簿、编辑工作簿然后保存回工作簿的代码。我最初认为我用来编辑工作簿的代码是问题所在,但在将其注释掉后问题仍然存在。

IWorkbook workbook;
using (var file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    if (Path.GetExtension(fileName).Contains("xlsx"))
    {
        workbook = new XSSFWorkbook(file);
    }
    else
    {
        workbook = new HSSFWorkbook(file);
    }
}

//Code that edits workbook which is currently commented out

using (var file = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))
{
    workbook.Write(file);
}

我已尝试针对空白的.xlsx 工作簿运行此代码,但文件已损坏,无法再打开。

我正在使用来自 nuget 的最新稳定版 NPOI:NPOI 2.1.3.1

【问题讨论】:

    标签: c# xlsx npoi


    【解决方案1】:

    在尝试了NPOI's Codeplex 上提到的所有内容无济于事后,我尝试弄乱FileStream 属性并能够获得空白.xslx 进行保存。我正在使用以下代码写回文件:

    using (var file = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
    {
        workbook.Write(file);
    }
    

    这已经解决了将返回保存到 XssfWorkbook 的主要问题。

    【讨论】:

    • 对于未来的读者:请注意,保存一个空工作簿(紧跟在new XSSFWorkbook(); 之后也会损坏.xlsx 文件。为避免这种情况,请在保存之前在工作簿(workbook.CreateSheet())中创建一个空工作表工作簿。
    • 好发现,我也是 WTF,因为 FileMode.Open 正在处理 .xls 文件而不是 .xlsx 文件。
    • 我收到了损坏的文件,因为我没有在 Using 块中使用 Filestream 对象(而是在其上调用 Close())。我猜它没有正确刷新文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多