Problème de corruption de files .xlsx avec NPOI – Excel ne peut pas ouvrir le file 'file.xlsx' car le format de file ou l'extension de file n'est pas valide

Lors de la lecture ou de la modification de certains files .xlsx créés par l'user, j'ai le message d'erreur suivant:

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. 

En cliquant sur Oui, je reçois un autre message:

 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. 

Exemple d'un problème. Fichier xlsx ici (avant mise en NPOI).

Voici le même file, maintenant corrompu après avoir été lu et écrit avec iWorkbook.Write(filestream); ici .

Je n'ai aucun problème à créer un nouveau file .xlsx avec le code suivant:

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

Cela fonctionne bien.

Même l'ouverture d'un des files .xlsx enfant problème, la mise en place d'un IWorkbook et l'écriture dans le file fonctionne:

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

Cependant, après avoir parcouru le code qui en lit, obtient des fiches IS, des IRows, des ICells, etc., elle corrompt le file .xlsx. Même si j'ai supprimé spécifiquement tout ce qui modifie le classur. No Creates, Sets, Styles, etc. avec NPOI.

Je ne peux pas vraiment inclure mon code parce que ce serait juste une confusion, mais dans un souci d'exhaustivité, je n'utilise que les types et fonctions suivants de NPOI au cours de ce test:

 IWorkbook XSSFWorkbook ISheet IRow ICell .GetSheetAt .GetRow .GetCell .LastRowNum 

Donc, l'une de ces causes est la corruption. J'aimerais finalement définir les valeurs à nouveau et le faire fonctionner comme je l'ai pour .xls.

Quelqu'un at-il connu cela? Quelles sont les fonctions de NPOI qui pourraient causer la corruption? Toute consortingbution serait appréciée.

Modifier: Utilisation de NPOI v2.2.1.

Je pense que le problème est que vous lisez et écris le même FileStream . Vous devriez faire la lecture et l'écriture en utilisant des stream distincts. Essayez-le comme ceci:

 ssortingng newPath = @"C:\MyPath\test.xlsx"; // read the workbook IWorkbook wb; using (FileStream fs = new FileStream(newPath, FileMode.Open, FileAccess.Read)) { wb = new XSSFWorkbook(fs); } // make changes ISheet s = wb.GetSheetAt(0); IRow r = s.GetRow(0) ?? s.CreateRow(0); ICell c = r.GetCell(1) ?? r.CreateCell(1); c.SetCellValue("test2"); // overwrite the workbook using a new stream using (FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write)) { wb.Write(fs); }