Я заметил, что Internet Explorer добавляет число в квадратных скобках к файлам, загружаемым из Интернета (обычно [1]). Это создает большую проблему при загрузке электронных таблиц Excel, поскольку квадратные скобки не являются допустимым символом имени файла внутри имени листа Excel. Эта проблема специфична для IE, другие браузеры сохраняют то же имя файла.
Так, например, если у вас есть сводная таблица, которая автоматически обновляется при открытии файла, вы получите сообщение об ошибке, в котором указано, что имя «file [1] .yourPivotTableName» недопустимо.
Есть ли решение этой проблемы?
Обновлено: Кажется, что независимо от имя файла, предложенное директивами HTTP IE добавляет [1] во всех случаях, которые вызывают проблему! (Итак, ответы о именах файлов в этом случае бесполезны)
Обновлено: Я пробовал код VBA, чтобы сохранить файл под другим именем, когда он откроется. Однако это не работает (то же сообщение об ошибке, что и раньше). Как вы думаете, есть способ исправить это с помощью VBA?
Установите новый Internet Explorer. Тогда это не имеет отношения к веб-серверу.
Новый Internet Explorer? Что ты имеешь в виду ? Сейчас я использую IE 6, но дефект, похоже, проявляется и в IE 7: форумы.microsoft.com/MSDN/… и bytes.com/forum/thread751225.html
Я пробовал много чего, в том числе макрос VBA для сохранения файла под другим именем перед обновлением сводной таблицы. У меня пока нет никаких успехов, но я думаю, что это, возможно, часть решения ... Как вы думаете?


Собственно правильный .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". Другой обходной путь - попросить пользователей сохранить файл на рабочий стол, а затем открыть его.
В моем случае я не могу использовать один лист, но, вы правы, проблема возникает только тогда, когда вы пытаетесь открыть файл напрямую, а не если вы его сохраните. Но это не лучший ответ, ориентированный на клиента ... :)
Какая у вас настройка сервера? IIS? Апач? Используете CMS? Поможет ли перезапись URL?
Мое веб-приложение основано на J2EE, работает на сервере веб-приложений IBM, за модифицированным сервером Apache IBM (IHS). Перезапись URL не поможет, потому что так работает IE. Я думаю больше о некоторых макросах VBA, которые могут меня спасти ...
Это встроенная функция в Internet Explorer.
Прекратите использовать «Открыть», начните использовать «Сохранить» в окне загрузки файла, иначе IE добавит «[1]» к имени файла, который он помещает во временную папку.
Вы можете создать какое-нибудь приложение .NET, используя System.IO.FileSystemWatcher, которое улавливает событие создания загруженного файла или чего-то еще и переименовывает файл.
У меня он работает с использованием VBA, предоставленного этим классным парнем (подумайте о нем с любовью). Он переименовывает файл, а затем снова присоединяет точки поворота.
http://php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/
Большое спасибо, я думаю, что это решение. Я попробую это.
У меня сработало следующее:
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;
}
В моем случае это сработало отлично. Надеюсь, это поможет вам всем.
Я попытался сохранить файл под другим именем с помощью макроса Excel, но проблема все еще существует, даже если имя файла изменилось ...