웹 서버에서 Excel 파일을 저장하면서 [1] IE 버그를 해결하는 방법은 무엇입니까?
문제
Internet Explorer는 인터넷에서 다운로드 한 파일에 정사각형 괄호로 숫자를 추가한다는 것을 알았습니다 (일반적으로 [1]). 사각형 브래킷이 Excel 워크 시트 이름 안에 유효한 파일 이름 문자가 아니기 때문에 Excel 스프레드 시트를 다운로드하는 데 큰 문제가 발생합니다. 이 문제는 즉 구체적이며 다른 브라우저는 동일한 파일 이름을 유지하고 있습니다.
따라서 파일 열기에 피벗 테이블이 자동으로 반영된 경우 "파일 [1] .yourpivottablename"이라는 이름이 유효하지 않다는 오류 메시지가 표시됩니다.
그 문제에 대한 해결책이 있습니까?
편집 : 그것은 무엇이든지 보인다 HTTP 지침이 제안한 파일 이름, 즉, 모든 경우에 [1]을 추가하여 문제를 일으킨다! (따라서 파일 이름에 대한 답변은 도움이되지 않습니다)
편집 : 열면 다른 이름으로 파일을 저장하기 위해 VBA 코드를 시도했습니다. 그러나 작동하지 않습니다 (이전과 동일한 오류 메시지). VBA를 고칠 방법이 있다고 생각하십니까?
해결책
나는이 멋진 사람이 제공 한 VBA를 사용하여 일했습니다 (그를 좋아한다고 생각하십시오). 파일의 이름을 바꾸고 피벗을 다시 잡습니다.
http://php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/
다른 팁
IE에서 스프레드 시트를 열면 이런 일이 발생한다고 생각합니다. IE는 임시 파일로 저장한다고 생각합니다. 그리고 스프레드 시트의 파일 이름에 둘 이상의 점이있을 때만 발생한다고 생각합니다. 간단한 "sample.xls"로 시도하십시오. 또 다른 해결 방법은 사용자에게 파일을 데스크탑에 저장 한 다음 열도록 지시하는 것입니다.
Internet Explorer의 내장 기능입니다.
"Open"사용을 중지하고 파일 다운로드 창에서 "저장"을 시작하십시오. 그렇지 않으면 즉, 일부 임시 폴더에 배치하는 파일의 파일 이름에 [1]가 추가됩니다.
.NET 애플리케이션을 사용하여 빌드 할 수 있습니다 System.io.filesystemwatcher 다운로드 된 파일의 생성 이벤트 또는 파일 이름을 바꾸는 이벤트를 포착합니다.
파일 이름, 파일 확장 (.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";
메모: 부록, 아니다 애드 헤더, Debug Web-Server 및 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가 필요하지 않은 더 나은 솔루션을 생각해 냈습니다.
"inline; filename = <...> 대신"컨텐츠-방향 "헤더를"첨부 파일; filename = <...> "로 설정하면 일반 브라우저가 대화 상자를 열거나 열 수있는 대화 상자가 열리게됩니다. 헤더에 정의 된 파일 이름은 인터넷 익스플로러가 이상한 방식으로 행동합니다. 파일 다운로드 대화 상자를 열고 누르면 구하다 헤더에 정의 된 파일 이름을 제안하지만 누를 때 열려 있는 파일을 임시 폴더에 저장하고 이름으로 열립니다. 항아리와 동일합니다 ( '네임 스페이스'없음), 예를 들어 URI가 http : //server/folder/file.html, 즉, 즉 파일을 저장합니다 file.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";
복제 냄새가 나지만 지금까지 나는 그 바닥에 결코 얻지 못했습니다 (아마도 Sebs Post가 이것을 설명 할 수 있습니다). 또한 "내용화"값은 매우 까다로운 것으로 보입니다. a : 대신; 또는 'Filename'사이의 공간을 헌신하면 날아갑니다!
또한 IIS에서 압축을 활성화 한 경우 다음을 해결할 수 있습니다.
Response.ClearHeaders()