При чтении или изменении некоторых файлов .xlsx, созданных пользователем, я получаю следующее сообщение об ошибке:
We found a problem with some content in 'test.xlsx'. Do you want us to try to recover as much as we can? If you trust the source of this workbook, click Yes.
Нажав Да, я получаю другое сообщение:
Excel cannot open the file 'test.xlsx' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.
Пример проблемного файла .xlsx здесь (до помещения в NPOI).
Вот тот же файл, поврежденный после чтения и записи с помощью iWorkbook.Write(filestream);
здесь.
У меня нет проблем с созданием нового файла .xlsx со следующим кодом:
string newPath = @"C:\MyPath\test.xlsx";
using (FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write))
{
IWorkbook wb = new XSSFWorkbook();
wb.CreateSheet();
ISheet s = wb.GetSheetAt(0);
IRow r = s.CreateRow(0);
r.CreateCell(0);
ICell c = r.GetCell(0);
c.SetCellValue("test");
wb.Write(fs);
fs.Close();
}
Это прекрасно работает.
Работает даже открытие одного из проблемных дочерних файлов .xlsx, установка его в IWorkbook и запись обратно в файл:
string newPath = @"C:\MyPath\test.xlsx";
using (FileStream fs = new FileStream(newPath, FileMode.Open, FileAccess.ReadWrite))
{
IWorkbook wb = new XSSFWorkbook(fs);
wb.Write(fs);
fs.Close();
}
Однако после выполнения кода, который читает из него, получает ISheets, IRows, ICells и т. д., он повреждает файл .xlsx. Несмотря на то, что я специально удалил все, что изменяет книгу. Никаких операций создания, установки, стилей и т. д. с NPOI.
Я не могу включить свой код, потому что это может только сбить с толку, но для полноты картины я действительно использую только следующие типы и функции из NPOI во время этого теста:
IWorkbook
XSSFWorkbook
ISheet
IRow
ICell
.GetSheetAt
.GetRow
.GetCell
.LastRowNum
Так что один из них вызывает коррупцию. Я хотел бы в конечном итоге снова установить значения и заставить его работать, как у меня для .xls.
Кто-нибудь испытал это? Какие функции NPOI могут привести к повреждению? Мы будем признательны за любой вклад.
Редактировать: Использование NPOI v2.2.1.
FileAccess.ReadWrite
, если я перезаписываю файл. Я буду играть с изменением этого больше. Скрестив пальцы! - person justiceorjustus   schedule 12.12.2016