Génération d'un fichier excel avec EPPlus est un échec
Quand j'essaie de générer un fichier Excel à l'aide de EPPlus, Excel me donner le message d'erreur suivant:
Excel ne peut pas ouvrir le fichier 'myfilename.xlsx" parce que le format du fichier ou l'extension de fichier n'est pas valide. Vérifiez le fichier n'a pas été endommagé et que l'extension du fichier correspond au format du fichier.
Voici mon code:
public ActionResult Index()
{
using (ExcelPackage package = new ExcelPackage())
{
//I populate the worksheet here. I'm 90% sure this is fine
//because the stream file size changes based on what I pass to it.
var stream = new MemoryStream();
package.SaveAs(stream);
string fileName = "myfilename.xlsx";
string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
var cd = new System.Net.Mime.ContentDisposition
{
Inline = false,
FileName = fileName
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(stream, contentType, fileName);
}
}
Une idée de ce que je fais mal?
Le message d'erreur indique
Répondu hier. Je suppose que c'est le même problème.
xlsx, c'était une faute de frappe. Je vais modifier la question.
J'ai trouvé ce code a fonctionné quand j'ai mis le flux de position à 0 et j'ai trouvé ça plus propre que la solution retenue.
myfilename.xslx
alors que votre code montre myfilename.xlsx
. Qui êtes-vous vraiment?Répondu hier. Je suppose que c'est le même problème.
xlsx, c'était une faute de frappe. Je vais modifier la question.
J'ai trouvé ce code a fonctionné quand j'ai mis le flux de position à 0 et j'ai trouvé ça plus propre que la solution retenue.
OriginalL'auteur Matt Grande | 2012-03-07
Vous devez vous connecter pour publier un commentaire.
Tout ce que vous devez faire est de réinitialiser le flux de position.
stream.Position = 0;
Vous ne devrais pas écrire directement à la Réponse, ce n'est pas le MVC. Il ne suit pas la bonne MVC pipeline et bien le serrer les couples de votre action de contrôleur de code de l'objet de Réponse.
Lorsque vous ajoutez un nom de fichier comme le 3e paramètre dans
File()
, MVC ajoute automatiquement le bonContent-Disposition
- tête... donc vous ne devriez pas avoir besoin de l'ajouter manuellement.Court de il est, c'est ce que vous voulez:
OriginalL'auteur Charlino
Votre code ne montre pas
stream
être écrit à laHttpResponse
- sans doute être fait dans leFile
méthode qui vous n'avez pas posté.D'une manière qui fonctionne est la suivante:
File
méthode fait partie deASP.Net MVC
. Je vais essayer de cette façon!Étrange, il dit maintenant "Excel a trouvé du contenu illisible dans 'myfilename.xlsx'. Voulez-vous récupérer le contenu de ce classeur? Si vous faites confiance à la source de ce classeur, cliquez sur Oui." Si je clique sur Oui, cela semble fonctionner, mais je n'ai aucune idée de ce que donne cette erreur.
J'ai vu que le message d'erreur avant, autant que je me souvienne, il s'est passé lors de la Réponse.Clear() a été omis. Une autre possibilité est qu'une EPPlus bug résultats à des données non valides dans le fichier. Vous pouvez tester ce qui est fait par l'enregistrement du fichier sur le serveur, et de voir si vous recevez le même message d'erreur lors de l'ouverture sur le serveur.
Aussi lors de l'utilisation de la
File
méthode, vous pouvez avoir besoin à la première position de votre MemoryStream le début du flux (stream.Position = 0
).Ahh, la "Excel a trouvé du contenu illisible" était de ma faute. J'ai essayé de définir une largeur de Colonne de 0.
OriginalL'auteur Joe
Similaire à la réponse de Joe, j'ai encore dû appeler
Response.ClearHeaders()
:OriginalL'auteur Ewald Stieger