programing

출력 시 EPLUS 오류가 발생합니다.응답에 대한 XLSX

muds 2023. 8. 9. 21:06
반응형

출력 시 EPLUS 오류가 발생합니다.응답에 대한 XLSX

EPLUS를 사용하여 몇 가지를 만드는 데 이상한 문제가 있습니다.XLSX 파일.패키지를 생성한 다음 응답으로 출력하는 중입니다.

다음과 같이 패키지를 만들었습니다.

var file = new FileInfo(@"C:\Test.xlsx");
ExcelPackage package = new ExcelPackage(file);
//...code to output data...//
package.Save();

이렇게 하면 파일이 로컬 C: 드라이브에 올바르게 저장되며, 열었을 때 잘 작동합니다.오류나 기타 사항이 없으며 포맷이 올바른 등입니다.

그러나 이제 이 파일을 응답 스트림에 출력하려고 하므로 코드를 다음과 같이 수정했습니다.

ExcelPackage package = new ExcelPackage();
//...code to output data...//
MemoryStream result = new MemoryStream();
package.SaveAs(result);
context.Response.Clear();
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";                                                       
context.Response.AddHeader("Content-Disposition", "attachment;filename=MissionDetails.xlsx");
result.WriteTo(context.Response.OutputStream);
context.Response.End(); 

그러나 이 코드를 실행하면 Excel 파일을 열려고 할 때 다음과 같은 메시지가 나타납니다.

Excel이 filename.xlsx에서 읽을 수 없는 내용을 찾았습니다.이 워크북의 내용을 복구하시겠습니까?이 워크북의 원본을 신뢰하는 경우 예를 클릭합니다.

예를 클릭하면 다음과 같은 프롬프트가 표시됩니다.

Microsoft Excel을 사용하여 이 파일을 열 수 없습니다.Microsoft Office Online 웹 사이트에서 파일을 열 수 있는 변환기를 검색하시겠습니까?

선택합니다.No여기서 Excel 파일을 열고 다음 오류를 표시합니다.

Excel 완료된 파일 수준 검증 및 복구.이 워크북의 일부가 수리되었거나 폐기되었을 수 있습니다.

그러나 파일이 올바르게 로드되고 올바르게 포맷된 것처럼 보입니다.그러나 파일을 열려고 할 때마다 동일한 프롬프트와 오류 메시지가 나타납니다.

참고: 데이터를 출력하는 코드는 이러한 시나리오에서 변경되지 않습니다.

이런 것을 본 사람이 있습니까?또는 응답에 출력할 때만 파일이 잘못 저장되는 원인이 무엇인지 아십니까?

저는 이 문제에 대한 해결책을 찾았습니다!역시 로컬로 저장했을 때 파일을 열 수 있었지만 응답을 통해 열 수 없었기 때문에 응답과 관련이 있었습니다.

여기서 문제는 제 코드가 시도로 포장되었다는 것입니다.예외가 기록되고 표시되는 catch 블록입니다.

당신이 Response를 부를 때 저는 그것에 주목했습니다.시스템을 종료합니다.스레드화.ThreadAbortException이 상승되었습니다.이 문제가 제기되었을 때 오류 출력이 파일 끝에 추가된 것 같습니다.

특정 예외에 대한 오류 로깅을 제거했을 때, 잘 작동했습니다!

자세한 내용은 이 게시물을 참조하십시오. http://epplus.codeplex.com/discussions/223843?ProjectName=epplus

//...output code...//
catch(Exception ex){
    if (!(ex is System.Threading.ThreadAbortException))
    {
        //Log other errors here
    }
}

감사합니다. 당신의 링크는 "GetAsByteArray()"라고 부르는 제 문제를 해결했습니다.아래 나열된 대로 지정한 링크에서 를 만들면 igse는 예외가 추가되지 않습니다.어떤 큰 힘으로

당신은 투표에 참여하세요!

mrxrsd
Editor

Aug 17, 2010 at 12:30 PM


Call response.clear before send stream back to client.

                    Response.Clear();
                     Response.AddHeader("content-disposition", "attachment;  filename=file.xlsx");
                     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";                   
                     Response.BinaryWrite(pck.GetAsByteArray());
                     Response.End();

http://epplus.codeplex.com/discussions/223843?ProjectName=epplus

대신에WriteTo메소드, 사용해 보십시오.

context.Response.BinaryWrite(package.GetAsByteArray());

Export To Excel 버튼 클릭 시 page.aspx.cs 코드

string templateFileName = Server.MapPath("~/ReportingTemplate/test.xlsx");
                System.IO.FileInfo templateFile = new System.IO.FileInfo(templateFileName);

                String message = ExcelPackagePlusLibrary.EPPlus.ExportToExcel(templateFile, dt, false, exportFileName, Response, "Data", "Summary", "Please type the client name here");
                if (String.IsNullOrEmpty(message) == false)
                {
                    /* Exception occur. */
                }
                dt.Clear();
///////////////////////////////////////////////////////////////////////////////////////

    /// <summary>
            /// ExportToExcel is a method used for Export To Excel with template file.
            ///
            /// </summary>
            /// <param name="templateFile">The fully qualified name of the new file, or the relative file name. Do not end the path with the directory separator character.</param>
            /// <param name="dt">Datatable for export.</param>
            /// <param name="printHeaders">Datatable's header used or not, when Export it. </param>
            /// <param name="exportFileName">provide fileName only not path. </param>
            /// <param name="Response">System.Web.HttpResponse. </param>
            /// <param name="sheetNames">arg[0] means provide sheet name where you want to load data. \n (Optional Parameter) arg[1] means provide sheet name where you want to edit. (Optional Parameter) arg[2] means if your intention is to Edit sheet so provide searchText.</param>
            /// 
            public static string ExportToExcel(FileInfo templateFile, DataTable dt, bool printHeaders, string exportFileName, System.Web.HttpResponse Response, params String[] sheetNames)
            {
                try
                {
                    using (ExcelPackage p = new ExcelPackage(templateFile, false))
                    {
                        EPPlus.AddSheetWithTemplate(p, dt, sheetNames[0], printHeaders);


                        String[] clientName = exportFileName.Split(new char[] { '_' }, 2);

                        if (sheetNames.Count() > 2)
                        {
                            ExcelPackagePlusLibrary.EPPlus.EditSheet(p, sheetNames[1], sheetNames[2], clientName[0] ?? exportFileName);
                        }

                        Byte[] fileBytes = p.GetAsByteArray(); //Read the Excel file in a byte array

                        //Clear the response
                        Response.ClearHeaders();
                        Response.ClearContent();
                        Response.Clear();

                        //Response.Cookies.Clear();


                        //Add the header & other information
                        //Response.Cache.SetCacheability(System.Web.HttpCacheability.Private);
                        //Response.CacheControl = "private";
                        //Response.Charset = System.Text.UTF8Encoding.UTF8.WebName;
                        //Response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
                        //Response.AppendHeader("Content-Length", fileBytes.Length.ToString());
                        //Response.AppendHeader("Pragma", "cache");
                        //Response.AppendHeader("Expires", "60");
                        Response.AddHeader("Content-Disposition",
                        "attachment; " +
                        "filename=" + exportFileName + "; " +
                        "size=" + fileBytes.Length.ToString() + "; " +
                        "creation-date=" + DateTime.Now.ToString("R").Replace(",", "") + "; " +
                        "modification-date=" + DateTime.Now.ToString("R").Replace(",", "") + "; " +
                        "read-date=" + DateTime.Now.ToString("R").Replace(",", ""));

                        //Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                        Response.ContentType = "application/x-msexcel";

                        //Write it back to the client
                        Response.BinaryWrite(fileBytes);
                        Response.Flush();
                        Response.Close();

                        /* Download to Client Side. */
                        //DirectoryInfo dir = new DirectoryInfo(Server.MapPath("~/Testing/Downloaded/" + DateTime.Now.ToString("MM-dd-yyyy")));
                        //if (!dir.Exists)
                        //{
                        //    dir.Create();
                        //}
                        //File.WriteAllBytes(dir.FullName + "\\" + fileName, fileBytes);

                        return String.Empty;
                    }
                }
                catch (Exception ex)
                {
                    _ErrorMessage = ex.Message.ToString();
                    return _ErrorMessage;
                }
            }

IE에서 EPLUS를 열 수 없습니다. 정상적으로 저장되어 오류 없이 열립니다.(저장 및 열기 모두에서 정상적으로 작동했습니다.)여기 제안들은 저에게 효과가 없었습니다. 아마도 제가 최종적으로 효과가 있었던 asx 파일이 아닌 asx 파일을 사용했기 때문입니다.

몇 시간 동안 검색한 결과, 이 스택 오버플로 게시물에 따라 ashx 파일을 사용하게 되었고 이제 모든 브라우저에서 경고/파손 파일 메시지 없이 작동하게 되었습니다.

다른 사용자에게 도움이 될 수 있는 추가 리소스:

이것이 다른 사람의 시간을 절약해 주기를 바랍니다.

언급URL : https://stackoverflow.com/questions/11549139/epplus-error-when-outputting-xlsx-to-response

반응형