Как обойти ошибку IE [1] при сохранении файла excel с веб-сервера? - PullRequest
4 голосов
/ 23 сентября 2008

Я заметил, что Internet Explorer добавляет число в квадратных скобках к файлам, загружаемым из Интернета (обычно [1]). Это создает большую проблему при загрузке электронных таблиц Excel, поскольку квадратные скобки не являются допустимым символом имени файла в имени листа Excel. Эта проблема специфична для IE, другие браузеры сохраняют одно и то же имя файла.

Таким образом, если у вас есть сводная таблица, автоматически обновляемая, например, при открытии файла, вы получите сообщение об ошибке, в котором говорится, что имя «file [1] .yourPivotTableName» недопустимо.

Есть ли решение этой проблемы?

РЕДАКТИРОВАТЬ: Кажется, что независимо от имени , предложенного директивами HTTP , IE добавляет [1] во всех случаях, которые вызывают проблему! (Таким образом, ответы об именах файлов в этом случае бесполезны)

РЕДАКТИРОВАТЬ: Я пытался некоторый код VBA, чтобы сохранить файл под другим именем, когда он откроется. Однако это не работает (то же сообщение об ошибке, что и раньше). Как вы думаете, есть способ исправить это с VBA?

Ответы [ 10 ]

2 голосов
/ 27 октября 2008

У меня все работает, используя VBA, предоставленный этим крутым парнем (думайте о нем с любовью). Он переименовывает файл, а затем снова присоединяет оси.

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

2 голосов
/ 23 сентября 2008

Это встроенная функция в Internet Explorer.

Прекратите использовать «Открыть», начните использовать «Сохранить» в окне загрузки файла, в противном случае IE добавит «[1]» к имени файла, который он помещает во временную папку.

Вы могли бы создать приложение .NET, используя System.IO.FileSystemWatcher , которое перехватывает событие создания загруженного файла или чего-либо еще и переименовывает файл.

2 голосов
/ 23 сентября 2008

Я думаю, что это происходит, когда вы открываете электронную таблицу в IE, а IE сохраняет ее во временный файл. И я думаю, что это происходит только тогда, когда имя файла электронной таблицы содержит более одной точки. Попробуйте это с простым «sample.xls». Другой обходной путь - попросить пользователей сохранить файл на рабочем столе, а затем открыть его.

1 голос
/ 08 октября 2014

Я решил эту проблему, используя метод, в котором мы передаем 3 параметра: имя файла, расширение файла (без .dot) и запрос HTTP); затем выполняем кодировку UTF-8 имени файла и расширения. Пример кода:

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

В моем случае это работало очень хорошо. Надеюсь, это поможет вам всем.

0 голосов
/ 23 августа 2010

Я столкнулся с той же проблемой и нашел (imo) лучшее решение, не требующее VBA.

Если вы установите заголовок «Content-Disposition» равным «attachment; filename = <...>» вместо «inline; filename = <...>», то обычные браузеры откроют диалог, который позволит сохранить или открыть файл с именем файла, определенным в заголовке, но Internet Explorer будет вести себя странным образом. Откроется диалоговое окно загрузки файла, и если вы нажмете Сохранить , будет предложено имя файла, определенное в заголовке, но если вы нажмете Открыть , файл сохранится во временную папку и откроется имя с которым совпадает с вашим URN (без 'namespace'), например если ваш URI равен http://server/folder/file.html,, то IE сохранит ваш файл как file.html (без скобок, ууууу!). Это приводит нас к решению:

Напишите скрипт, который обрабатывает запрос от http://server/folder/*, и когда вам нужно отправить файл XLS, просто перенаправьте на этот скрипт (используйте ваше имя файла вместо звездочки), указав Content-Disposition встроенный .

0 голосов
/ 28 апреля 2010

Вставьте эти четыре строки в ваш код:

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

Надеюсь, это поможет.

0 голосов
/ 20 апреля 2010

Вы можете просто убедиться, что в поле параметров для сводной панели автоматическое обновление отключено. Теперь даже при открытии с сервера пивот будет работать отлично

0 голосов
/ 20 ноября 2008

У меня сработало следующее:

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 + "\"";
    }
0 голосов
/ 23 сентября 2008

В .NET я обнаружил из опыта, но мне кажется, что это работает:

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

Дублирование пахнет, но до сих пор я никогда не доходил до сути (возможно, пост Себса объясняет это). Кроме того, значение «content-Disposition» выглядит очень привередливым, используя a: вместо a; или пропустите пробел между ним и «filename», и он дует!

Кроме того, если у вас включено сжатие в IIS, это может помочь вам:

Response.ClearHeaders()
0 голосов
/ 23 сентября 2008

Собственно, правильный .NET-код выглядит следующим образом:

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

Примечание: AppendHeader , а не AddHeader , который, я думаю, работает только в отладочном веб-сервере и IIS7.

...