2015-05-26 3 views
2

Я пытаюсь экспортировать datagrid для excel через всплывающее окно. При удалении кода из моего приложения я могу успешно экспортировать Excel, но при попытке экспортировать Excel, используя тот же код в моем приложении, я получаю следующие ошибки:Экспорт в Excel Ошибка

Из моего try/catch:

Невозможно оценить выражение, потому что код оптимизирован или собственный кадр находится поверх стека вызовов.

... и из консоли:

Ошибка: Sys.WebForms.PageRequestManagerParserErrorException: Сообщение, полученное от сервера не может быть проанализировано.

Мой код на стороне сервера выглядит следующим образом:

protected void btnExportToExcel_Click(object sender, EventArgs e) 
    { 
     ExportDataSetToExcel(); 
    } 

private void ExportDataSetToExcel() 
    { 

     try 
     { 
      DataTable dt = new DataTable("GridView_Data"); 
      foreach (TableCell cell in gvPatientRoster.HeaderRow.Cells) 
      { 
       dt.Columns.Add(cell.Text); 
      } 
      foreach (GridViewRow row in gvPatientRoster.Rows) 
      { 
       dt.Rows.Add(); 
       for (int i = 0; i < row.Cells.Count; i++) 
       { 
        dt.Rows[dt.Rows.Count - 1][i] = row.Cells[i].Text; 
       } 
      } 
      if (dt != null && dt.Rows.Count > 0) 
      { 
       Response.ContentType = "application/vnd.ms-excel"; 
       Response.AppendHeader("Content-Disposition", 
        string.Format("attachment; filename=PatientRoster.xls")); 

       System.IO.StringWriter tw = new System.IO.StringWriter(); 
       System.Web.UI.HtmlTextWriter hw = 
        new System.Web.UI.HtmlTextWriter(tw); 
       DataGrid dgGrid = new DataGrid(); 
       dgGrid.DataSource = dt; 

       //Report Header 
       hw.WriteLine("<b><u><font size='5'>" + 
          "Patient Roster</font></u></b>"); 
       hw.WriteLine("<br><br>"); 
       //hw.Write(BuildCriteriaString()); 
       hw.WriteLine("<br>"); 
       // Get the HTML for the control. 
       dgGrid.HeaderStyle.Font.Bold = true; 
       dgGrid.DataBind(); 
       dgGrid.RenderControl(hw); 

       // Write the HTML back to the browser. 

       this.EnableViewState = false; 
       Response.Write(tw.ToString()); 
       Response.End(); 
      } 
     } 
     catch (Exception ex) 
     { 
      lblErrorMessage.Text = ex.Message; 
     } 

    } 
+1

Справедливое предупреждение: настройка заголовка содержимого не достаточна для того, чтобы файл отображался как файл Excel. Вам нужно будет использовать API для записи в формат файла Excel или экспорта в формате CSV. В любом случае вам нужно будет написать текст в поток файлов, прежде чем возвращать его. – maniak1982

+0

У вас есть рабочий пример этого типа рабочего процесса? Я попытался создать книгу Excel с помощью OpenXML. Файл создается успешно локально, однако я сталкиваюсь с проблемами при использовании этого метода с веб-сервера. Я мог бы опубликовать текст, возвращаемый из datagrid, если это поможет. – MTL323

+0

Экспорт в CSV был ранее рассмотрен в Stackoverflow. Это то, что я использовал в прошлый раз, когда кто-то запросил экспорт. Я не знаю, как помочь вам с открытым рабочим столом OpenXML, не зная проблем, которые вы видели. Http: // StackOverflow.com/questions/8530655/export-a-list-of-table-to-csv-file – maniak1982

ответ

0

Я добавил следующее в PageLoad() и экспорт в настоящее время работает:

ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); 
scriptManager.RegisterPostBackControl(this.btnExportToExcel); 

Похоже UpdatePanel и ScriptManager были элементами, которые я забыл. Когда я отделил функциональность от основного приложения, я не включил весь HTML, который был в основном приложении. Поскольку ScriptManager и UpdatePanel не были частью изолированной функциональности, она работала должным образом. Я буду обязательно размещать HTML, в следующий раз

Это было решением из следующего сообщения:

Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed

0

Я бы предложил использовать один из многого хорошего, бесплатно C# «Экспорта в Excel» библиотеки там.

Вы уже написали код, чтобы читать ваши DataView в DataTable, и как только он в этом формате, используя следующую свободную C# библиотеку ...

ExportToExcel library

... вы бы иметь возможность экспортировать данные в «реальный» файл Excel 2007 в одной строке коды ....

// Export the DataTable into an Excel file, and write it to the web Response 
CreateExcelFile.CreateExcelDocument(dt, "SomeFilename.xlsx", Response); 

хорошо, хорошо, две строки коды. Я добавил комментарий.

Но вы понимаете!