2014-01-13 2 views
3

현재 일부 데이터를 Excel 파일로 내보내는 ASP.NET MVC 5 컨트롤러 작업을 작성 중입니다. 여기에서 찾은 일부 코드를 사용합니다. 그것은 주로 ... 작동합니다. 내가 열 수있는 Excel 파일을 출력하지만 다음 오류 메시지를 표시하기 전에는 출력하지 않습니다.ASP.NET MVC Excel 내보내기 파일 형식 오류

"파일 형식과 확장명이 'Export.xls'와 일치하지 않습니다. 파일이 손상되거나 안전하지 않을 수 있습니다. 너는 그것을 원천이라고 믿는다. 열지 말아라. 어쨌든 열어보고 싶니? "

"예"를 선택한 다음 계속됩니다. 내 컴퓨터에 다시 저장할 수 있으며 해당 파일을 열면 오류가 발생하지 않습니다. 그렇지 않으면 잘 작동합니다. 다른 단점은 파일의 눈금 선이 Excel 파일보다 HTML 표와 거의 비슷한 Excel 파일의 경우와 다르게 형식이 지정된다는 것입니다. 그러나 이상한 오류 메시지는 여기에서 받아 들일만한 것이 아니기 때문에 고쳐야합니다. 이미 아무 소용이 다른 값으로 Response.ContentType ("응용 프로그램/엑셀", "응용 프로그램/MS-Excel을"), 설정 시도

public void ExportExcel() 
{ 
    // DataObject is a class that fetches the data for this method 
    DataObject dataObj = new DataObject(); 
    var grid = new GridView(); 

    // dataObj.GetDataList returns a List<T> of data model class objects 
    grid.DataSource = dataObj.GetDataList(); 
    grid.DataBind(); 

    Response.ClearContent(); 
    Response.Buffer = true; 
    Response.AddHeader("content-disposition", "attachment; filename=Export.xls"); 
    Response.ContentType = "application/vnd.ms-excel"; 
    Response.Charset = ""; 

    StringWriter sw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(sw); 

    grid.RenderControl(htw); 

    byte[] byteArray = Encoding.ASCII.GetBytes(sw.ToString()); 
    MemoryStream s = new MemoryStream(byteArray); 
    StreamReader sr = new StreamReader(s, Encoding.ASCII); 

    Response.Write(sr.ReadToEnd()); 
    Response.End(); 

} 

:

여기 내 코드입니다. 저는 ASP.NET과 C#에서 일반적으로 조금 익숙해서, 제가 누락되었거나 여기에서 잘못하고있는 것이있을 수 있습니다. 나는 PHP와 Zend에 익숙하다. 당신이 줄 수있는 통찰이나 도움은 크게 감사 할 것입니다; 감사!

+0

사이드 노트 데이터 행을 채우기 위해 여기에 목록을 사용하면 샘플 코드를 어디서나 가까운 보이지 않는다 ASP.MVC 동작이 어떻게 나타나야하는지 ... Content [Content] 또는 [File] (http://msdn.microsoft.com/en-us/library/dd470835%28v=vs.118%29.aspx) 더 의미. –

+0

그 File 메서드는 꽤 깔끔하게 보입니다. (내가 C#을 처음 사용한다고 말했듯이) – TrentD

답변

5

HTML 표를 Excel 파일로 작성하고 있습니다.

<table> 
    <tr> 
     <td> 
      Stuff 
     </td> 
    </tr> 
</table> 

을하고 .xls 확장자를 가진 텍스트 파일로 작성 : 기본적으로,이 텍스트를 복용하고 있습니다. Excel은 파일이 실제로 xls 파일이 아니라는 사실을 알리지 만 파일을 열어 제대로 표시하기에 충분히 똑똑합니다 (호출 할 수있는 경우).

좋은 해결책이 아닌 해결책을 제시하고 표의 데이터를 CSV로 변환하고 CSV (더 나은 해결책)를 보내거나 Excel 라이브러리를 사용하여 실제 Excel 파일을 만들고 보내야합니다. 그. 그 중 CSV가 가장 쉽습니다.

+3

+1. "Excel 라이브러리 사용"은 "Excel interop 사용"(서버에서 Office 응용 프로그램을 실행해야 함 - 지원되지 않음)을 의미하지 않으며 OpenXml SDK 또는 Excel이 설치되지 않은 기타 라이브러리를 사용하는 것과 같습니다. –

+1

Excel 라이브러리를 제안 할 수 있습니까? –

+2

NPOI, OpenXML SDK, @AlexeiLevenkov와 같은 Excel Interop 이외의 모든 것. –

0

같은 오류가 발생했습니다. 그래서, (Microsoft.Office.Interop.Excel을 사용하여) Nuget Manager에서 가져 왔습니다. 여기

Here is the code 

Microsoft.Office.Interop.Excel.Application xla = new Microsoft.Office.Interop.Excel.Application(); 

Workbook wb = xla.Workbooks.Add(XlSheetType.xlWorksheet); 
       Worksheet ws = (Worksheet)xla.ActiveSheet;  

은/* 헤더 */

ws.Cells[1, 1] = "Header1"; 
      ws.Cells[1, 2] = "Header2"; ws.Cells[1, 3] = "Header3"; ws.Cells[1, 4] = "Header4"; ws.Cells[1, 5] = "Header5"; 

      int i = 2; 

/* */

  foreach (var a in pavmm.Funds) 
      { 
       ws.Cells[i, 1] = a.FilingID; 
       ws.Cells[i, 2] = a.Security_Name; ws.Cells[i, 3] = a.Filing_Type; ws.Cells[i, 4] = a.st_name; ws.Cells[i, 5] = a.Permit; 

       i = i + 1; 
      } 
      ws.Columns.AutoFit(); 
      ws.Rows.AutoFit(); 


     string folder = NewFolderName + "\\"; 
      if (!Directory.Exists(folder)) 
       Directory.CreateDirectory(folder); 


      string filename = ExcelsheetName + ".xlsx"; 
      filename = filename.Replace('/', '-'); 
      filename = filename.Replace('\\', '-'); 
      string path = Path.Combine(folder, filename); 
      wb.SaveCopyAs(path); 
관련 문제