출력 시 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
'programing' 카테고리의 다른 글
Windows에 Python 패키지를 설치하려면 어떻게 해야 합니까? (0) | 2023.08.09 |
---|---|
NSString: IsEqual 대 IsEqualToString (0) | 2023.08.09 |
MySQL 구성 파일 위치 - redhat 리눅스 서버 (0) | 2023.08.09 |
PHP Jquery Ajax 호출이 net::ERR_EMPTY_RESPON (0) | 2023.08.09 |
MariaDB + Galera 노드 99% RAM 사용 (0) | 2023.08.09 |