2016-03-21 19 views
3

У меня есть фрагмент кода, который в настоящее время записывается в рабочую книгу .xls (HSSFWorkbook) без проблем. Однако, когда я пытаюсь использовать тот же код для записи в рабочую книгу .xlsx (XSSFWorkbook), архив становится поврежденным и не может быть открыт в excel.NPOI - Запись в файл развращает .xlsx workbook

Следующий код - это то, что я использую, чтобы получить доступ к книге, отредактировать книгу и затем сохранить ее обратно в книгу. Первоначально предполагалось, что код, который я использовал для редактирования рабочей книги, был проблемой, но после комментирования это проблема все еще сохраняется.

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

ответ

4

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

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

Это установило основной вопрос сохранение спины к XssfWorkbook.

+2

Для будущих читателей: обратите внимание, что сохранение пустой книги (сразу после 'нового XSSFWorkbook();' также искажает файл .xlsx'. Чтобы этого избежать, создайте пустой лист в книге ('workbook.CreateSheet() '), прежде чем сохранять книгу. – Houndolon

+0

Хорошая находка, я также был WTF, потому что' FileMode.Open' работает с файлами '.xls', но не с файлами' .xlsx'. –

+0

Я не думаю, что 'FileShare.ReadWrite' является хорошая идея. –

Смежные вопросы