EPPlus не сохраняя изменений в рабочем листе

Обновить

December 2018

Просмотры

3.3k раз

2

У меня есть пакетное задание, что петли через таблицу обработки каждой записи по строкам. В зависимости от результатов, я хочу, чтобы оставить комментарий в последнем столбце каждой записи.

Я могу сказать, отслеживая значение в этой ячейке во время работы программы, что соответствующие изменения происходят , когда им необходимо. Однако, после выполнения .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объекта по имени_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()функции. Ничего не происходит , хотя здесь. Изменения не сохраняются.

//Save changes to spreadsheet.
_package.Save();

1 ответы

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);
}