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

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

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

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

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

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

Я попытался сохранить файл под другим именем с помощью макроса Excel, но проблема все еще существует, даже если имя файла изменилось ...

paulgreg 23.09.2008 16:50

Установите новый Internet Explorer. Тогда это не имеет отношения к веб-серверу.

Seb Nilsson 23.09.2008 17:17

Новый Internet Explorer? Что ты имеешь в виду ? Сейчас я использую IE 6, но дефект, похоже, проявляется и в IE 7: форумы.microsoft.com/MSDN/… и bytes.com/forum/thread751225.html

paulgreg 23.09.2008 18:20

Я пробовал много чего, в том числе макрос VBA для сохранения файла под другим именем перед обновлением сводной таблицы. У меня пока нет никаких успехов, но я думаю, что это, возможно, часть решения ... Как вы думаете?

paulgreg 24.09.2008 16:02
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
4
4
9 424
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

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

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

В .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; или опустите пробел между ним и 'filename', и он взорвется!

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

Response.ClearHeaders()

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

В моем случае я не могу использовать один лист, но, вы правы, проблема возникает только тогда, когда вы пытаетесь открыть файл напрямую, а не если вы его сохраните. Но это не лучший ответ, ориентированный на клиента ... :)

paulgreg 23.09.2008 16:47

Какая у вас настройка сервера? IIS? Апач? Используете CMS? Поможет ли перезапись URL?

Liam 23.09.2008 16:57

Мое веб-приложение основано на J2EE, работает на сервере веб-приложений IBM, за модифицированным сервером Apache IBM (IHS). Перезапись URL не поможет, потому что так работает IE. Я думаю больше о некоторых макросах VBA, которые могут меня спасти ...

paulgreg 26.09.2008 13:42

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

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

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

Ответ принят как подходящий

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

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

Большое спасибо, я думаю, что это решение. Я попробую это.

paulgreg 28.10.2008 12:23

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

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

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

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

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

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

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

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

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

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

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

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