Как обойти ошибку [1] IE при сохранении файла Excel с веб-сервера?

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

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Есть ли какое-нибудь решение этой проблемы?

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Я решил эту проблему, используя метод, в котором мы передаем 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;
}

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

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

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

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

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

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

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

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

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

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

Поместите эти четыре строки в свой код:

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

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

По опыту я обнаружил, что в .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» кажется очень привередливым, используйте:вместо ;или опустите пробел между ним и «имя файла», и все будет в порядке!

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

Response.ClearHeaders()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top