NPOI — запись в файл повреждает книгу .xlsx

У меня есть фрагмент кода, который в настоящее время без проблем записывает в рабочую книгу .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, и файл был поврежден, и его больше нельзя было открыть.

Я использую последнюю стабильную версию NPOI от nuget: NPOI 2.1.3.1


person James C. Taylor IV    schedule 21.03.2016    source источник


Ответы (1)


Перепробовав все, что упоминалось в NPOI Codeplex, но безрезультатно, я попытался возиться со свойствами FileStream и смог получить пустой .xslx для сохранения. Я использую следующий код для обратной записи в файл:

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

Это устранило основную проблему сохранения задней части в XssfWorkbook.

person James C. Taylor IV    schedule 23.03.2016
comment
Для будущих читателей: обратите внимание, что сохранение пустой книги (сразу после new XSSFWorkbook();) также повреждает файл .xlsx. Чтобы избежать этого, создайте пустой лист в книге (workbook.CreateSheet()) перед сохранением книги. - person bklaric; 18.08.2016
comment
Хорошая находка, я тоже был WTF, потому что FileMode.Open работает с .xls файлами, но не с .xlsx файлами. - person Sacha K; 10.11.2016
comment
Я получал поврежденные файлы, потому что не использовал объект Filestream в блоке Using (вместо этого я вызывал для него Close()). Я предполагаю, что он не сбросил файл должным образом. - person Daz; 26.03.2019