EPPlus不保存对工作表的更改

时间:2014-03-05 17:32:58

标签: c# .net excel epplus

我有一个批处理作业循环遍历处理每个记录的电子表格。根据结果​​,我想在每条记录的最后一栏留下评论。

我可以通过在程序运行时监视此单元格中的值来判断适当的更改是否需要进行。但是,运行.Save()函数后,我打开电子表格,每列看起来与程序运行前的相同。

在保存更改方面,似乎他们构建EPPlus非常简单,所以我不确定我做错了什么。

以下是我打开电子表格的方式

if (File.Exists(path))
{
    try
    {
        //Connect to spreadsheet
        FileStream _stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite);
        FileInfo file = new FileInfo(path);

    }
    catch (IOException)
    {
        SendEmail.OkMail("Spreadsheet is currently in use. Please close and try again.");

        //Exit program
        Environment.Exit(0);
    }

    //Pull data into EPPlus object
    _package = new ExcelPackage();
    _package.Load(_stream);
    _sheet = _package.Workbook.Worksheets.First(); 
}
else
{
    //Notify user and exit program
    SendEmail.OkMail("Cannot find file in requested directory. Please check and try again.");

    //Exit program
    Environment.Exit(0);
}

此代码进行了适当的更改。在单步执行代码的这一部分时,我可以看到正确的值存储在名为ExcelWorkSheet的{​​{1}}对象的正确单元格中

_sheet

一旦我完成了电子表格的循环,我就会调用//Figure out what type of update occurred if (ignore == (_noUpdates - 1)) { _sheet.Cells[row, col + 11].Value = "Ignore"; } else if (add == (_adds - 1)) { _sheet.Cells[row, col + 11].Value = "Valid Add"; } else if (update == (_updates - 1)) { _sheet.Cells[row, col + 11].Value = "Valid Update"; } else if (autoterm == (_autotermed - 1)) { _sheet.Cells[row, col + 11].Value = "Valid Autoterm"; } 函数。这里什么也没发生。更改未保存。

.Save()

1 个答案:

答案 0 :(得分:7)

Load(Stream)方法不存储文件的路径,并且不保存传入的流以在保存时重复使用。当您调用Save()方法时,程序包不知道保存文件的位置,只需关闭程序包即可。

(这对我来说似乎是一个糟糕的设计;在这种情况下它可能会引发异常。)

尝试更改代码以使用带有FileInfo参数的构造函数:

FileInfo file = new FileInfo(path);
if (file.Exists)
{
    try
    {
        _package = new ExcelPackage(file);
        _sheet = _package.Workbook.Worksheets.First();
    }
    catch (IOException)
    {
        SendEmail.OkMail("Spreadsheet is currently in use. Please close and try again.");

        //Exit program
        Environment.Exit(0);
    }
}
else
{
    //Notify user and exit program
    SendEmail.OkMail("Cannot find file in requested directory. Please check and try again.");

    //Exit program
    Environment.Exit(0);
}