웹 서버에서 Excel 파일을 저장하면서 [1] IE 버그를 해결하는 방법은 무엇입니까?

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

  •  02-07-2019
  •  | 
  •  

문제

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()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top