Le contenu illisible dans le fichier Excel généré avec EPPlus
Je vais avoir un petit problème lorsque je créer un fichier Excel à partir d'un modèle, à l'aide de la EPPlus de la bibliothèque. Le fichier a une première feuille de calcul qui contient les données utilisées pour le remplissage des tableaux croisés dynamiques dans les fiches suivantes.
Quand j'ouvre le fichier généré, j'obtiens le message d'erreur suivant :
"Excel a trouvé du contenu illisible dans 'sampleFromTemplate.xlsx'. Voulez-vous récupérer le contenu de ce classeur ? - Je vous faire confiance à la source de ce classeur, cliquez sur Oui."
J'ai évidemment cliquez sur oui, puis obtenir un résumé de la réparation effectuée sur le fichier, et un lien vers un format xml fichier journal contenant ceci :
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error095080_01.xml</logFileName>
<summary>Errors were detected in file 'C:\TEMP\sampleFromTemplate.xlsx'</summary>
<repairedRecords summary="Following is a list of repairs:">
<repairedRecord>Repaired Records: Table from /xl/tables/table1.xml part (Table)</repairedRecord>
</repairedRecords>
</recoveryLog>
C'est apparemment causée par une plage nommée ("Table1") que je définis dans mon code pour indiquer que les données pour être utilisés pour les tableaux croisés dynamiques. Il y a déjà un "Nom de Table" dans le modèle appelé "Table1", mais je n'arrive pas à y accéder par le biais de la ExcelPackage.Feuille de calcul.Les noms de collection. Étant nouveau EPPlus et pas très expérimenté avec Excel, je ne comprends pas d'où je fais mal. Voici le bout de code où j'générer le fichier :
private string GenerateFromTemplate(string fileName, string templateName, DataTable tab)
{
FileInfo newFile = new FileInfo(string.Format("C:\\MyPath\\{0}.xlsx", fileName));
FileInfo templateFile = new FileInfo(string.Format("C:\\MyPath\\{0}.xlsx", templateName));
try
{
using (ExcelPackage pkg = new ExcelPackage(newFile, templateFile))
{
ExcelWorksheet sheet = pkg.Workbook.Worksheets["MyDataSheet"];
ExcelRange range = sheet.Cells[string.Format("A1:U{0}", dt.Rows.Count)];
pkg.Workbook.Names.Add("Table1", range as ExcelRangeBase);
int sheetRowIndex = 2;
foreach (DataRow row in this.dt.Rows)
{
sheet.Cells[sheetRowIndex, 1].Value = row["Row1"];
sheet.Cells[sheetRowIndex, 2].Value = row["Row2"];
[...]
sheet.Cells[sheetRowIndex, 21].Value = row["Row21"];
sheetRowIndex++;
}
pkg.Save();
return newFile.FullName;
}
}
catch (IOException ex) { return ex.Message; }
}
Noter que les tableaux croisés dynamiques sont correctement renseignées, de toute façon, alors pourquoi est-ce qui se passe ?
Merci 🙂
Table1
sont habituellement réservés pour les les tableaux Excel (bien qu'il est possible d'utiliser des noms tels que pour les non-table des plages). Qu'advient-il si vous appelez la gamme de quelque chose comme Foo1
.Je n'ai pas l'erreur, mais mon pivot tables ne fonctionnent plus. J'ai oublié de dire que le "Table1" plage nommée existe déjà dans le modèle. Je vais modifier ma question tout de suite...
OriginalL'auteur ZipionLive | 2014-01-03
Vous devez vous connecter pour publier un commentaire.
Je viens de tomber sur ce problème moi-même et il fixe, en mettant ma solution ici si quelqu'un devait l'utiliser:
Ce fut à l'aide de asp.net pour des raisons évidentes, il n'est pas applicable autrement.
Mon problème n'était pas de la plage de tableau, Epplus généré le fichier, mais plutôt que la réponse du serveur a été l'ajout de la page de réponse pour le fichier excel, évidemment, de rendre le fichier non valide. La fin de la réponse du serveur immédiatement après l'envoi du fichier réparé mon problème, quelque chose à la hauteur de:
Résolu mon problème!
Merci, c'était super.
Résolu mon problème 🙂
Réponse.Fin() fixe mon problème. Merci pour la réponse. (:
OriginalL'auteur uaise
Le problème n'est pas résolu, mais maintenant, je sais exactement pourquoi. Cette "Table1" chose n'était pas une plage nommée, mais une table, à laquelle je peux accéder à travers les "Tables" de la collection de la feuille de calcul.
Maintenant, le problème est que les deux Tables de la collection et des objets de Table en EPPlus sont en lecture seule donc je ne peux pas définir la table de dimension à partir de mon code, et ne peux le supprimer ou d'en ajouter une nouvelle à l'adapter à mes besoins. EPPlus l'auteur a déjà mentionné qu'il pourrait un jour être mis en œuvre (ici et ici) bus que les messages sont presque 3 ans, je pense qu'il y a peu d'espoir de voir cela se produire...
De toute façon, j'espère que cela aidera quelqu'un rencontre le même problème.
[EDIT] j'ai enfin trouvé un moyen de contourner le problème : la ExcelTable objet a une écriture de la propriété appelée "TableXml", qui contient la définition xml de la table avec - bien sûr - son aire de répartition. Voici son contenu dans mon cas :
Ce qui nous intéresse ici sont les "ref" attributs dans la "table" et "filtre automatique" nœuds, que l'évolution de leurs valeurs permet de redéfinir la portée de notre table.
J'ai procédé de cette façon :
Et maintenant mon fichier Excel est correctement généré avec "Table1" mise en place de la portée réelle de mes données !
OriginalL'auteur ZipionLive
J'ai passé environ 4 heures à résoudre ce problème, mon problème & solution ne sont pas dans le post, je l'écris pour les futurs visiteurs,
Mon problème a été causé par une répétition de colonnes dans la feuille excel. Après l'ajout de l'espace à une colonne, le problème est résolu.
La partie intéressante est, L'erreur n'est jamais venu quand j'ai généré un tableau croisé dynamique dans MS excel, elle n'est venue lorsque j'ai utilisé epplus pour générer un tableau croisé dynamique dans excel fichier. Faire le bug en plus difficile à trouver
OriginalL'auteur Raj Kamal
Je suis tombé sur cette quand j'ai eu un bug qui a ajouté un supplément de délimiteur de colonne après chaque ligne:
Supplémentaire onglet après la dernière colonne brisé le résultant de feuille de calcul Excel dans cette même façon, et en la retirant résolu le problème. Remarque, je suis en utilisant le
LoadFromText
pour charger la feuille entière en une seule fois à partir des données de texte. Cela peut ne pas être le cas des OP problème, mais peut-être que les futurs chercheurs trouverez ce utile.OriginalL'auteur Joshua Frank
Eu ce problème lors de l'édition des classeurs avec des Tableaux qui ont une mise en forme particulière (Enroulements de police a été utilisé pour montrer un symbole spécial) dans leurs en-têtes. A supprimer la mise en forme de corriger le message.
OriginalL'auteur Mikhail Orlov