Domanda

Ho notato che Internet Explorer aggiunge un numero tra parentesi quadre ai file scaricati da Internet (di solito [1]). Questo crea un grosso problema con il download di fogli di calcolo Excel poiché le parentesi quadre non sono un carattere di file valido all'interno del nome del foglio di lavoro di Excel. Questo problema è specifico di IE, altri browser mantengono lo stesso nome file.

Quindi, se hai una tabella pivot aggiornata automaticamente all'apertura del file, ad esempio, riceverai un messaggio di errore che dice il nome " file [1] .yourPivotTableName " non è valido.

C'è qualche soluzione a questo problema?

EDIT: sembra che qualunque sia il nome file suggerito dalle direttive HTTP , IE aggiunge [1] in tutti i casi, il che causa il problema! (Quindi, le risposte sui nomi dei file non sono utili in quel caso)

EDIT: ho provato del codice VBA per salvare il file con un altro nome quando verrà aperto. Tuttavia, non funziona (stesso messaggio di errore di prima). Pensi che ci sia un modo per risolverlo con VBA?

È stato utile?

Soluzione

L'ho fatto funzionare usando VBA fornito da questo bravo ragazzo (pensaci con affetto). Rinomina il file e quindi ricollega i perni.

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

Altri suggerimenti

Penso che ciò accada quando apri il foglio di calcolo in IE e IE lo salva in un file temporaneo. E penso che accada solo quando il nome del file del foglio di calcolo contiene più di un punto. Provalo con un semplice & Quot; sample.xls & Quot ;. Un'altra soluzione consiste nel dire agli utenti di salvare il file sul desktop e quindi aprirlo.

È una funzionalità integrata in Internet Explorer.

Smetti di usare " Apri " ;, inizia a usare " Salva " nella finestra di download del file, altrimenti IE aggiungerà " [1] " al nome file del file che inserisce in una cartella temporanea.

È possibile creare alcune applicazioni .NET utilizzando System.IO .FileSystemWatcher che rileva l'evento della creazione del file scaricato o qualcosa del genere e rinomina il file.

Ho risolto questo problema usando il metodo in cui passiamo 3 parametri: Nome file, estensione file (senza il .dot) e la richiesta HTTP); quindi eseguendo la codifica UTF-8 del nome file e dell'estensione. Codice di esempio:

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

Questo ha funzionato bene nel mio caso. Spero che possa aiutarti tutti.

In realtà, il codice .NET corretto è il seguente:

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

Nota: AppendHeader , non AddHeader , che penso funzioni solo nel web server di debug e IIS7.

Per me ha funzionato:

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

Potresti semplicemente assicurarti che nella casella delle opzioni per il pivot l'aggiornamento automatico sia disattivato. Ora anche quando viene aperto dal server il pivot funzionerà perfettamente

Ho riscontrato lo stesso problema e ho ideato (imo) una soluzione migliore che non necessita di VBA.

Se si imposta " Content-Disposition " intestazione in " allegato; filename = lt &; ... gt &; " anziché " inline; filename = lt &; ... gt &; " i normali browser apriranno una finestra di dialogo che permetterà di salvare o aprire un file con un nome file definito in un'intestazione, ma Internet Explorer si comporterà in un modo strano. Si aprirà la finestra di download del file e se si preme Salva verrà suggerito un nome file definito nell'intestazione, ma se si preme Apri verrà salvato il file in una cartella temporanea e aprilo con un nome che è uguale al tuo URN (senza "namespace"), ad es. se il tuo URI è http: //server/folder/file.html , quindi IE salverà il tuo file come file.html (senza parentesi, woo hoo!). Questo ci porta a una soluzione:

Scrivi uno script che gestisca la richiesta da http: // server / cartella / * e quando devi servire un file XLS reindirizza a quello script (usa il tuo nome file invece dell'asterisco) con Content-Disposition impostato su inline .

Inserisci queste quattro righe nel tuo codice:

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

Spero che questo aiuti.

In .NET ho scoperto per esperienza che solo questo sembra funzionare per me:

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

La duplicazione ha un odore, ma finora non sono mai arrivato al fondo (forse il post di Sebs lo spiega). Anche il & Quot; content-Disposition & Quot; il valore appare molto esigente usare a: anziché a; o ometti lo spazio tra esso e 'nomefile' e soffia!

Inoltre, se hai abilitato la compressione su IIS, ciò potrebbe risolvere le cose per te:

Response.ClearHeaders()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top