2016-08-05 1 views
0

GridView를 Excel 시트로 내보내는 간단한 방법을 구현하려고 시도했습니다. 그러나, 지금은 꽤 오랫동안이 하나 붙어 :ASP.NET : 동적으로 추가 된 행을 포함하여 GridView를 Excel로 내보내는 올바른 방법

GridViewtrueAutoGenerateColumns 세트가, 데이터 소스는 동적 (시간이 지남에 열 번호를 변경) 정말 예측할 수있다. GetHeader()GetSubHeader() 모두 반환

if (e.Row.RowType == DataControlRowType.Header) { 

     gv.Controls[0].Controls.AddAt(0, GetHeader()); 
     gv.Controls[0].Controls.AddAt(1, GetSubHeader()); 


} 

GridViewRow (두 가지가 있습니다 : 자동으로 생성하는 HeaderRow 그러므로 나는이 같은 OnRowCreated 경우에 내 자신을 falseShowHeader를 설정하고 만든, 나를 위해 적합하지 않다 헤더의 행은 서로 다른 colspans, rowspans 및 stuff를 사용합니다. - 내가 건너 뛰어야 냈어요 내가 무엇을 얻을 것이 숨겨져 원래 HeaderRow와 테이블

ExcelPackage excel = new ExcelPackage(); 
    var workSheet = excel.Workbook.Worksheets.Add("List 1"); 
    var totalCols = gv.Rows[0].Cells.Count; 
    var totalRows = gv.Rows.Count; 
    var headerRow = gv.HeaderRow; 

    for (int i = 0; i < totalCols; i++) { 

     workSheet.Cells[1,i+1].Value = headerRow.Cells[i].Text; 

    } 

    for (int i = 0; i < totalCols; i++) { 

     for (int j = 0; j < totalRows; j++) { 

      workSheet.Cells[j+2,i+1].Value = gv.Rows[j].Cells[i].Text; 

     } 

    } 

    return excel; 

:이 같은 GridView 사용의 OpenXML을 내보낼 때이 모든 그러나, 웹 사이트에 잘 작동 첫 번째 사이클은 분명히 - 다음 실제 데이터가있는 행. OnRowCreated에 추가 한 두 행의 흔적이 없습니다.

아무에게도 이것이 왜 일어나고 있는지 그리고 어떻게 해결할 수 있는지 설명해주십시오. 이 메소드는 웹 사이트에 표시된대로 전체 GridView를 내보내는 것이 이상적입니다.

참고 : HtmlTextWriter와 GridView.RenderControl()을 사용하는 다른 방법은 다운로드 후에도 Excel에서 파일을 열지 못했기 때문에 옵션이 아닐 수 있습니다 (OpenOffice는 괜찮 았음). 그런 다음 시트가 읽히지 않은 곳을 읽습니다. 이 경우 중요한 데이터 처리에 실제로 사용할 수 있습니다.

편집 : OnRowDataBound 대신 OnRowCreated에 두 HeaderRow의 추가 후, 그들을 위해 루프 계정 그러나 워크 시트에 들어간 모든 빈 필드이며, 또한, 그들은 gv.Rows.Count에 의해 고려되지 않습니다 보인다 루프는 내 테이블의 마지막 두 행에 도달하지 않습니다.

디버그를 시도했는데 실제로 Text 속성이 설정되어 있고 표가 웹 사이트에서 OK로 표시 되더라도 gv.Rows[j].Cells[i].Text;에 의해 반환되는 모든 것은 ""입니다.

이 동작은 매우 혼란 스럽습니다. 아무도 왜 이런 일이 일어 났는지 말할 수 없었을까요?

답변

1

자동 생성되거나 그렇지 않으면 상관 없습니다. 트릭은 모든 것을 객체와 객체의 자식으로 취급하는 것입니다. 그런 다음 객체의 속성 (및 Excel)을 사용하여 그리드 뷰에서 데이터를 조작 할 수 있습니다.

참조 샘플 코드는

protected void ExportToExcel(object sender, EventArgs e) 

{ 

    Response.Clear(); 

    Response.Buffer = true; 

    Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls"); 

    Response.Charset = ""; 

    Response.ContentType = "application/vnd.ms-excel"; 

    using (StringWriter sw = new StringWriter()) 

    { 

     HtmlTextWriter hw = new HtmlTextWriter(sw); 



     //To Export all pages 

     GridView1.AllowPaging = false; 

     this.BindGrid(); 



     GridView1.HeaderRow.BackColor = Color.White; 

     foreach (TableCell cell in GridView1.HeaderRow.Cells) 

     { 

      cell.BackColor = GridView1.HeaderStyle.BackColor; 

     } 

     foreach (GridViewRow row in GridView1.Rows) 

     { 

      row.BackColor = Color.White; 

      foreach (TableCell cell in row.Cells) 

      { 

       if (row.RowIndex % 2 == 0) 

       { 

        cell.BackColor = GridView1.AlternatingRowStyle.BackColor; 

       } 

       else 

       { 

        cell.BackColor = GridView1.RowStyle.BackColor; 

       } 

       cell.CssClass = "textmode"; 

      } 

     } 



     GridView1.RenderControl(hw); 



     //style to format numbers to string 

     string style = @"<style> .textmode { } </style>"; 

     Response.Write(style); 

     Response.Output.Write(sw.ToString()); 

     Response.Flush(); 

     Response.End(); 

    } 

} 

이하이 갈 수있는 방법 중 하나입니다.

다른 많은 샘플이 있습니다. 그냥 Google Gridview Excel로.

희망이 도움이됩니다.

+0

감사하지만 위에서 언급 한 것처럼 Excel에서 다운로드 한 파일을 열지 못하기 때문에이 기능이 작동하지 않습니다. OpenOffice는 문제없이 그것을 열어 주므로, o_o에 당황 스럽습니다. – Epsiloney

+0

코드에서 ExcelPackage 클래스를 사용하고 있습니다. 코드가 작동하면 Excel 클래스를 사용해보십시오. 그리고 제가 말했듯이, 제 대답은 갈 길 중의 하나 일뿐입니다. 다른 많은 예가 있습니다. 그냥 수색을 해. –

관련 문제