2016-12-01 2 views
1

ASP.Net에서 NPOI를 사용하여 Excel 문서에 저장 내용을 저장하고 방금 버전 2 이상으로 이동했습니다. xlsx에 쓰기가 잘되었지만 xlsx로 전환하는 것은 좀 더 어려웠습니다. 나의 새롭고 향상된 코드는 많은 NUL 문자를 출력 파일에 추가하고있다.Response.OutputStream에 쓰기시 손상된 XLSX 파일 가져 오기

그 결과 "일부 콘텐츠에 문제가 있습니다"라는 오류 메시지가 나타나며 복구를 시도합니까?

다음은 내 16 진수 편집기에서 만든 xlsx 파일의 그림입니다. BadXlsxHexImage 00 초는 여러 페이지로 이어집니다. 나는 파일이 오류없이 열릴 때까지 문자 그대로 편집기에서 삭제했다.

왜이 코드가이 파일에 많은 NUL을 추가합니까 ??

using (var exportData = new MemoryStream()) 
{ 
    workbook.Write(exportData); 
    byte[] buf = exportData.GetBuffer(); 

    string saveAsFileName = sFileName + ".xlsx"; 

    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}; size={1}", saveAsFileName, buf.Length.ToString())); 
    Response.Clear(); 
    Response.OutputStream.Write(buf, 0, buf.Length); 
    exportData.Close(); 
    Response.BufferOutput = true; 
    Response.Flush(); 
    Response.Close(); 
} 

은 (이미 Response.Close 대신에 OutputStream.Write, Response.End 대신에 BinaryWrite을 시도하고, 버퍼의 길이 Content-Length을 설정했습니다. 또한이 중 어느 것도 XLS에 쓰기 문제가 없었다.)

+0

가 다른 lib 디렉토리를 사용하려면, 여기에 내가 XLSX 만들 생각하는 가장 중 하나입니다 : 약 https://epplus.codeplex.com/ – andrefadila

답변

1

MemoryStream에서 GetBuffer을 사용하고 있기 때문에 널 바이트가 많아지는 이유가 있습니다. 이렇게하면 할당 된 전체 내부 버퍼 배열이 반환됩니다. 버퍼 배열은 버퍼가 완전히 채워지지 않은 경우 데이터의 끝을 벗어나는 사용되지 않는 바이트를 포함합니다. 버퍼에서 데이터를 가져 오려면 (확실하게), ToArray을 사용해야합니다.

그런데 왜 MemoryStream에 편지를 쓰고 있습니까? 쓸 스트림이 이미 있습니다 (OutputStream). 통합 문서를 바로 작성하십시오.

은 다음과 같이 그것을 시도 : 경우에

Response.Clear(); 
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", saveAsFileName)); 
workbook.Write(Response.OutputStream); 
Response.Flush(); 
Response.Close(); 
+0

멋진 캐치 OutputStream을 사용합니다. 그 변화는 그것을 완전히 깨끗이했습니다! 나는'GetBuffer'가 트리밍을 처리 할 것으로 기대 했었지만 실제로는 뒤에서 도움이되기보다는 실제로 버퍼를 얻는다는 것을 알고 있습니다. –

+0

이 코드는 download.aspx의 Page_Load 이벤트에서 호출됩니다. Firefox 및 IE는 정상적으로 처리하지만 Chrome은 페이지에서 HTML을 계속 처리하고이를 버퍼에 추가합니다. 이를 설명하기 위해이 코드를 수정해야합니까? 어쩌면'OutputStream'을 끝낼 것인가? ('OutputStream.End()'시도했지만 도움이되지 않았다.) –

관련 문제