Comment faire pour contourner le bogue IE [1] lors de l'enregistrement d'un fichier Excel à partir d'un serveur Web?

StackOverflow https://stackoverflow.com/questions/120497

  •  02-07-2019
  •  | 
  •  

Question

J'ai remarqué qu'Internet Explorer ajoute un numéro entre crochets aux fichiers téléchargés sur Internet (généralement [1]). Cela crée un gros problème avec le téléchargement de feuilles de calcul Excel car les crochets ne constituent pas un caractère de nom de fichier valide dans le nom de la feuille de calcul Excel. Ce problème est spécifique à IE, d'autres navigateurs conservent le même nom de fichier.

Ainsi, si vous avez par exemple un tableau croisé dynamique actualisé automatiquement à l'ouverture du fichier, un message d'erreur indiquant le nom & "; fichier [1] .votreNomPivotTable &"; n'est pas valide.

Existe-t-il une solution à ce problème?

EDIT: il semble que quel que soit le nom de fichier suggéré par les directives HTTP , IE ajoute [1] dans tous les cas, ce qui pose problème! (Les réponses sur les noms de fichiers ne sont donc pas utiles dans ce cas.)

EDIT: J'ai essayé un code VBA pour enregistrer le fichier sous un autre nom lors de son ouverture. Cependant, cela ne fonctionne pas (même message d'erreur qu'auparavant). Pensez-vous qu'il existe un moyen de résoudre ce problème avec VBA?

Était-ce utile?

La solution

Je travaille avec VBA fourni par ce mec cool (pensez-le avec tendresse). Il renomme le fichier, puis rattache les pivots.

http: // php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/

Autres conseils

Je pense que cela se produit lorsque vous ouvrez la feuille de calcul dans IE et qu’elle l’enregistre dans un fichier temporaire. Et je pense que cela ne se produit que lorsque le nom de fichier de la feuille de calcul contient plus d'un point. Essayez-le avec un simple & Quot; sample.xls & Quot ;. Une autre solution consiste à demander aux utilisateurs de sauvegarder le fichier sur le bureau, puis de l'ouvrir.

Il s'agit d'une fonctionnalité intégrée à Internet Explorer.

Arrêtez d'utiliser & "Ouvrir &", commencez à utiliser & "Enregistrer &"; dans la fenêtre de téléchargement de fichier, sinon IE ajoutera " [1] " nom_fichier du fichier qu'il place dans un dossier temporaire.

Vous pouvez créer une application .NET avec System.IO .FileSystemWatcher qui intercepte l’événement de la création du fichier téléchargé ou quelque chose et renomme le fichier.

J'ai résolu ce problème en utilisant une méthode permettant de transmettre 3 paramètres: nom du fichier, extension du fichier (sans le .dot) et requête HTTP); puis en codant en UTF-8 le nom du fichier et son extension. Exemple de code:

public static String encoding(String fileName, String extension, HttpServletRequest request)
{
    String user = request.getHeader( "user-agent" );
    boolean isInternetExplorer = ( user.indexOf( "MSIE" ) > -1 );
    String var = "";
    try
    {           
    fileName = URLEncoder.encode( fileName, "UTF-8" );
        fileName = fileName.trim().replaceAll( "\\+", " " );
        extension = URLEncoder.encode( extension, "UTF-8" );
        extension = extension.trim().replaceAll( "\\+", " " );
        if ( isInternetExplorer )
        {
        disposition = "attachment; filename=\"" + fileName+"."+extension+"\"";
        }
        else
        {
        var = "attachment; filename*=UTF-8''" + fileName+"."+extension;
        }            
    }
    catch ( UnsupportedEncodingException ence )
    {
    var = "attachment; filename=\"" + fileName+"."+extension;
        ence.printStackTrace();
    }

    return var;
}

Cela a bien fonctionné dans mon cas. J'espère que cela vous aidera tous.

En fait, le code .NET correct est le suivant:

Response.AppendHeader("content-disposition", "attachment;filename=file.xls");
Response.ContentType = "application/vnd.ms-excel";

Remarque: AppendHeader , et non AddHeader , qui, à mon avis, ne fonctionne que sur le serveur Web de débogage et sur IIS7.

Ce qui suit a fonctionné pour moi:

private string EncodeFileName(string fileName)
    {
        fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", " ");
        if (HttpContext.Current.Request.UserAgent.ToLower().Contains("msie"))
        {
            var res = new StringBuilder();
            var chArr = fileName.ToCharArray();
            for (var j = 0; j < chArr.Length; j++)
            {
                if (chArr[j] == '.' && j != fileName.LastIndexOf("."))
                    res.Append("%2E");
                else
                    res.Append(chArr[j]);
            }
            fileName = res.ToString();
        }
        return "\"" + fileName + "\"";
    }

Vous pouvez simplement vous assurer que le rafraîchissement automatique est désactivé dans la boîte à options du pivot. Maintenant, même lorsqu'il est ouvert depuis le serveur, le pivot fonctionnera parfaitement

J'ai rencontré le même problème et proposé (imo) une meilleure solution ne nécessitant pas de VBA.

Si vous définissez " Content-Disposition " en-tête vers " pièce jointe; filename = < ... > " au lieu de " inline; filename = < ... > " les navigateurs normaux ouvriront une boîte de dialogue permettant de sauvegarder ou d'ouvrir un fichier avec un nom de fichier défini dans un en-tête, mais Internet Explorer se comportera de manière étrange. La boîte de dialogue de téléchargement de fichier s'ouvre. Si vous appuyez sur Enregistrer , un nom de fichier défini dans l'en-tête sera suggéré, mais si vous appuyez sur Ouvrir , le fichier sera sauvegardé dans un dossier temporaire. et ouvrez-le avec un nom identique à votre URN (sans "espace de noms"), par exemple si votre URI est http: //server/folder/file.html , IE enregistrera votre fichier. comme fichier.html (pas de crochets, woo hoo!). Cela nous amène à une solution:

Rédigez un script qui gère la demande de http: // serveur / dossier / * et quand vous devez servir. un fichier XLS vient simplement de rediriger vers ce script (utilisez votre nom de fichier au lieu d'un astérisque) avec Content-Disposition sur inline .

Mettez ces quatre lignes dans votre code:

response.reset();
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate,post-check=0, pre-check=0");
response.setHeader("Pragma", "public");

J'espère que cela vous aidera.

Dans .NET, je n'ai trouvé par expérience que cela semble fonctionner pour moi:

            Response.AddHeader("Content-Disposition", "attachment; filename=excel.xls");
            Response.AddHeader("Content-Type", "application/vnd.ms-excel");
            Response.ContentType = "application/vnd.ms-excel";

La duplication a une odeur, mais je n’ai jusqu’à présent jamais compris au fond de celle-ci (peut-être un article de Sebs explique-t-il). De plus, le & Quot; content-Disposition & Quot; la valeur semble très pointilleuse, utilisez un: au lieu d'un; ou omettez l'espace entre lui et 'nomfichier' et ça explose!

De même, si la compression est activée sur IIS, cela peut résoudre le problème:

Response.ClearHeaders()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top