如何使用NPOI多次保存XLS文件(每次修改后一次)

时间:2016-12-27 16:45:09

标签: c# excel npoi

我是NPOI的新手,我有一个问题,我无法找到“简单”的答案/解决方案。 (我不想关闭并打开文件5次。)

我需要编辑一个XLS文件,(假设我要修改从0到1的5个单元格),但我必须在每次修改后保存文件(意味着5次)。

我注意到第一个更改已保存,但是当我打开xls文件时,我看不到其余的修改。我注意到文件的大小类似于5 *(第一次更改时文件的大小)。

我的代码类似于:

public void SetCell(int row, int col, CellData xlsCell)
{
    ISheet sheet = mXLSWorkBooK.GetSheet(("mySheet1"));
    sheet.SetActive(true);

    ICell cell;
    cell = sheet.CreateRow(row).CreateCell(col);
    cell.SetCellType(CellType.String);
    cell.SetCellValue(xlsCell.Text);

    mXLSWorkBooK.Write(mfile);
    mfile.Flush();
} 

我将此方法称为5次。

2 个答案:

答案 0 :(得分:0)

您可能误解了IWorkbook.Write(stream)的工作原理。此方法不会写出增量更改;它总是写出整个工作簿。如果您每次都重用现有的流(这就是您正在执行的操作),那么您将把整个工作簿内容附加到流的末尾,从而创建一个损坏的文件。 (这也解释了每次编写文件时文件大小增加的原因。)这不是NPOI的预期使用模式。相反,您应该每次使用新流并写入该流,覆盖该文件。我建议制作一个这样的辅助方法:

public static void SaveWorkbook(IWorkbook wb, string fileName)
{
    using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
    {
        wb.Write(fs);
    }
}

然后在需要保存文件时调用该辅助方法。

答案 1 :(得分:0)

感谢重播。 我发现了我的错误!

当我使用cell = sheet.CreateRow(row).CreateCell(col)时,对于当前行中的“下一个”单元格,我实际上擦除了行并从头开始创建了新单元格,所以最终state是每行中的一个单元格。