2016-03-21 10 views
3

Ich habe ein Stück Code, der derzeit in eine .xls Arbeitsmappe (HSSFWorkbook) ohne Problem geschrieben wird. Wenn ich jedoch versuche, denselben Code zu verwenden, um in eine .xlsx Arbeitsmappe zu schreiben (XSSFWorkbook), wird das Archiv beschädigt und kann in Excel nicht geöffnet werden.NPOI - Schreiben in Datei korrumpiert .xlsx Arbeitsmappe

Der folgende Code ist, was ich verwende, um auf die Arbeitsmappe zuzugreifen, die Arbeitsmappe zu bearbeiten und dann wieder in der Arbeitsmappe zu speichern. Ich nahm ursprünglich an, dass der Code, den ich verwendete, um die Arbeitsmappe zu bearbeiten, das Problem war, aber nach dem Auskommentieren bleibt das Problem bestehen.

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

Ich habe versucht, diesen Code gegen eine leere .xlsx Arbeitsmappe ausgeführt wird und die Datei beschädigt wird, und ist nicht mehr in der Lage zu öffnen.

Ich bin die letzte stabile Version von NPOI von nuget mit: NPOI 2.1.3.1

Antwort

4

Nachdem alles versucht, die auf NPOI's Codeplex ohne Erfolg erwähnt wurde, habe ich versucht, mit den FileStream Eigenschaften Messing und konnte die leere .xslx kennen zu sparen . Ich verwende den folgenden Code in die Datei zu schreiben zurück:

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

dies die primäre Frage der Speicherung eines zurück zu einem XssfWorkbook fixiert hat.

+2

Für zukünftige Leser: Beachten Sie, dass das Speichern einer leeren Arbeitsmappe (direkt nach 'new XSSFWorkbook();' auch die '.xlsx' Datei korrumpiert. Um dies zu vermeiden, erstellen Sie ein leeres Blatt in der Arbeitsmappe (' workbook.CreateSheet() ') vor dem Speichern der Arbeitsmappe – Houndolon

+0

Gut gefunden, ich war auch WTF, weil' FileMode.Open' mit '.xls' Dateien aber nicht' .xlsx' Dateien arbeitet. –

+0

Ich glaube nicht, dass 'FileShare.ReadWrite' ist eine gute Idee. –