2016-03-02 4 views
2

У меня есть небольшое веб-приложение, которое создает два datatables из jquery datepicker. Я могу экспортировать эти данные, конечно, если они находятся на одной странице.Экспорт данных в Excel

Я изменил свое приложение, чтобы отобразить данные на новых веб-формах.

Вот мой код для экспорта в 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 
      this.BindGrid1(TextDateFrom.Text, TextDateTo.Text); 

      GridView2.HeaderRow.BackColor = Color.White; 
      foreach (TableCell cell in GridView2.HeaderRow.Cells) 
      { 
       cell.BackColor = GridView2.HeaderStyle.BackColor; 
      } 
      foreach (GridViewRow row in GridView2.Rows) 
      { 
       row.BackColor = Color.White; 
       foreach (TableCell cell in row.Cells) 
       { 
        if (row.RowIndex % 2 == 0) 
        { 
         cell.BackColor = GridView2.AlternatingRowStyle.BackColor; 
        } 
        else 
        { 
         cell.BackColor = GridView2.RowStyle.BackColor; 
        } 
        cell.CssClass = "textmode"; 
       } 
      } 

      GridView2.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(); 
     } 
    } 

Вот где у меня возникли проблемы:

this.BindGrid1(TextDateFrom.Text, TextDateTo.Text); 

Конечно мой BindGrid1() является другой формой. Чтобы вызвать мои данные в моих новых формах, я создал сеанс.

Если у меня есть код на веб-форму, где данные таблицы являются:

 DataTable dt = (DataTable)Session["GridData"]; 
    if (dt.Rows.Count > 0) 
     { 
      GridView1.DataSource = dt; 
      GridView1.DataBind(); 
     } 

Я не знаю точно, как это назвать это. для экспорта всех страниц. Должен ли я создать глобальную переменную, которая берет значения String из метода BindGrid1, а затем использовать на новой странице?

+0

Вы следуете по плохой модели. Не берете GridViews и не переносите их в HTML и не обслуживайте их как файлы Excel. Вместо этого экспортируйте базовые данные и используйте библиотеку, способную генерировать фактические файлы Excel. – mason

ответ

1

Документы, касающиеся вашей задачи, экспорт данных из DataTable dt в Excel может быть достигнуто с помощью следующей процедуры, которая использует Microsoft.Office.Interop.Excel объект библиотеки:

/// <summary> 
/// export DataTable to Excel (C#) 
/// </summary> 
internal static void Export2Excel(DataTable dataTable) 
{ 
    object misValue = System.Reflection.Missing.Value; 
    Microsoft.Office.Interop.Excel.Application _appExcel = null; 
    Microsoft.Office.Interop.Excel.Workbook _excelWorkbook = null; 
    Microsoft.Office.Interop.Excel.Worksheet _excelWorksheet = null; 
    try 
    { 
     // excel app object 
     _appExcel = new Microsoft.Office.Interop.Excel.Application(); 

     // excel workbook object added to app 
     _excelWorkbook = _appExcel.Workbooks.Add(misValue); 

     _excelWorksheet = _appExcel.ActiveWorkbook.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet; 

     // column names row (range obj) 
     Microsoft.Office.Interop.Excel.Range _columnsNameRange; 
     _columnsNameRange = _excelWorksheet.get_Range("A1", misValue).get_Resize(1, dataTable.Columns.Count); 

     // column names array to be assigned to _columnNameRange 
     string[] _arrColumnNames = new string[dataTable.Columns.Count]; 

     for (int i = 0; i < dataTable.Columns.Count; i++) 
     { 
      // array of column names 
      _arrColumnNames[i] = dataTable.Columns[i].ColumnName; 
     } 

     // assign array to column headers range, make 'em bold 
     _columnsNameRange.set_Value(misValue, _arrColumnNames); 
     _columnsNameRange.Font.Bold = true; 

     // populate data content row by row 
     for (int Idx = 0; Idx < dataTable.Rows.Count; Idx++) 
     { 
      _excelWorksheet.Range["A2"].Offset[Idx].Resize[1, dataTable.Columns.Count].Value = 
      dataTable.Rows[Idx].ItemArray; 
     } 

     // Autofit all Columns in the range 
     _columnsNameRange.Columns.EntireColumn.AutoFit(); 
    } 
    catch { throw; } 
} 

просто передать dt в качестве аргумента.

Надеюсь, это поможет.

Смежные вопросы