Wie um die [1] IE Fehler arbeiten, während eine Excel-Datei von einem Webserver zu speichern?

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

  •  02-07-2019
  •  | 
  •  

Frage

Ich habe bemerkt, dass der Internet Explorer aus dem Internet heruntergeladen eine Zahl in eckigen Klammern, um Dateien hinzufügt (in der Regel [1]). Dadurch entsteht ein großes Problem mit dem Download Excel-Tabellen als eckige Klammern nicht ein gültiger Dateinamen Zeichen innerhalb Excel-Arbeitsblatt Namen sind. Das Problem ist, IE spezifische, anderer Browser gleiche Dateinamen halten.

Also, wenn Sie eine Pivot-Tabelle automatisch aktualisiert auf Datei Öffnen zum Beispiel haben, erhalten Sie eine Fehlermeldung, dass der Name „Datei [1] .yourPivotTableName“ nicht gültig ist.

Gibt es eine Lösung für dieses Problem?

EDIT: Es scheint, dass das, was der Dateiname von HTTP-Richtlinien vorgeschlagen , IE fügt [1] in allen Fällen, die das Problem verursachen! (So, Antworten zu Dateinamen sind nicht hilfreich in diesem Fall)

EDIT: Ich habe einige VBA-Code versucht, Datei unter einem anderen Namen zu speichern, wenn es wird geöffnet. Allerdings funktioniert es nicht (gleiche Fehlermeldung als zuvor). Glauben Sie, dass es eine Möglichkeit gibt, dass mit VBA zu beheben?

War es hilfreich?

Lösung

Ich habe es von diesem kühlen Kerl zur Verfügung gestellt mit VBA arbeiten (man denkt an ihn vernarrt). Es benennt die Datei und dann reattaches die Zapfen.

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

Andere Tipps

Ich denke, dass dies geschieht, wenn Sie die Tabelle in IE öffnen und IE speichert sie in eine temporäre Datei. Und ich denke, es geschieht nur, wenn die Tabelle der Dateiname mehr als einen Punkt in ihm hat. Versuchen Sie es mit einem einfachen „sample.xls“. Eine andere Lösung ist es, Benutzern zu sagen, die Datei auf dem Desktop zu speichern und dann öffnen.

Es ist eine integrierte Funktion im Internet Explorer.

Stop „Öffnen“ verwenden, starten Sie „Speichern“ in der Datei-Download-Fenster verwenden, sonst wird IE anhängen „[1]“, um den Dateinamen der Datei, die es in einem temporären Ordner platziert.

Sie könnten einige .NET-Anwendung erstellen mit System.IO .FileSystemWatcher , die das Ereignis von der Erstellung der heruntergeladenen Datei fängt oder etwas und benennt die Datei.

ich dieses Problem gelöst haben Methode unter Verwendung von denen wir drei Parameter übergeben: Dateiname, Dateierweiterung (ohne .dot) und die HTTP-Anforderung); dann macht die UTF-8-Kodierung des Dateinamens und der Erweiterung. Beispielcode:

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

Das funktionierte gut in meinem Fall. Hoffe, es wird Ihnen helfen, alle.

Eigentlich ist der richtige .NET-Code lautet wie folgt:

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

. Hinweis: AppendHeader , nicht AddHeader , die ich denke, nur im Debug-web-Server und IIS7 funktioniert

Im Folgenden hat für mich gearbeitet:

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 + "\"";
    }

Sie könnten nur sicherstellen, dass für die Dreh im Optionsfeld der automatische Aktualisierung ausgeschaltet ist. Nun, auch wenn vom Server der Dreh geöffnet wird perfekt funktionieren

Ich habe das gleiche Problem gestoßen und kam mit (imo) einer besseren Lösung, die keine VBA benötigt.

Wenn Sie „Content-Disposition“ Header „attachment; filename = <...>“ anstelle von „inline; filename = <...>“ die normalen Browser Dialog öffnen, oder öffnen Sie können sparen eine Datei mit einem Dateinamen in einem Header definiert, aber Internet Explorer in Art seltsamer Art und Weise verhalten. Es wird Dateidownload-Dialog öffnen, und wenn Sie drücken Sie Speichern wird es einen Dateinamen vorschlagen, die im Header definiert ist, aber wenn Sie drücken Öffnen wird es Datei in einen temporären Ordner speichern und öffnen sie sie mit einem Namen, der ist die gleiche wie Ihre URN (ohne ‚namespace‘), zB wenn Ihr URI http: //server/folder/file.html , so wird IE Ihre Datei speichern wie file.html (keine Klammern, woo hoo!). Dies führt uns zu einer Lösung:

ein Skript schreiben, die Anforderung verarbeitet von http: // server / Ordner / * und wenn Sie benötigen dienen eine XLS-Datei in dem Skript umleiten nur (der Dateinamen anstelle von Sternchen verwenden) mit Content-Disposition auf inline .

Setzen Sie diese vier Zeilen im Code:

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

Hope, das hilft.

In .NET ich aus Erfahrung gefunden haben, nur das scheint für mich zu arbeiten:

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

Die Vervielfältigung riecht, aber bisher habe ich nie auf den Grund es (vielleicht Sebs Post erklärt dies). Auch der „Content-Disposition“ Wert erscheint sehr pingelig Verwendung a: statt a; oder ommit den Raum zwischen ihm und ‚Dateiname‘ und es bläst!

Auch wenn Sie die Komprimierung auf IIS aktiviert haben dieses Problem beheben kann Dinge für Sie:

Response.ClearHeaders()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top