Экспорт GridView в несколько листов Excel

У меня есть два Gridview в моем веб-приложении. Мне нужно, нажав кнопку (ExcelExpot), значения, которые нужно экспортировать в Excel соответственно Sheet1 и Sheet2.

protected void ExportToExcel() { this.GridView1.EditIndex = -1; Response.Clear(); Response.Buffer = true; string connectionString = (string)ConfigurationSettings.AppSettings["ConnectionString"]; SqlConnection sqlconnection = new SqlConnection(connectionString); String sqlSelect = "select * from login"; sqlconnection.Open(); SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(sqlSelect, connectionString); //DataTable dt1 DataTable dt1 =new DataTable(); mySqlDataAdapter.Fill(dt1); //LinQ Query for dt2 var query = (from c in dt.AsEnumerable() select new {id= c.Field("id"),name=c.Field("name"),city=c.Field("city")}) ; DataTable dt2 = new DataTable(); d2=query.CopyToDatatable(); DataSet ds=new DataSet(); ds.Tabls.Add(dt1); ds.Tabls.Add(dt2); Excel.Application excelHandle1 = PrepareForExport(ds); excelHandle1.Visible = true; } // code for PrepareForExport(ds); PrepareForExport(ds) { two tables in two worksheets of Excel... } 

Я согласен с @ Andrew Burgess и внедрил его код в один из моих проектов. Только для записи есть несколько небольших ошибок в коде, которые вызовут некоторые Исключения COM. Скорректированный код ниже (проблема заключалась в том, что таблицы Excel, строки, столбцы от 1 до n не от нуля).

 using Excel = Microsoft.Office.Interop.Excel; using System.Reflection; using System.IO; //Print using Ofice InterOp Excel.Application excel = new Excel.Application(); var workbook = (Excel._Workbook)(excel.Workbooks.Add(Missing.Value)); for (var i = 0; i < dataset.Tables.Count; i++) { if (workbook.Sheets.Count <= i) { workbook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing); } //NOTE: Excel numbering goes from 1 to n var currentSheet = (Excel._Worksheet)workbook.Sheets[i + 1]; for (var y = 0; y < dataset.Tables[i].Rows.Count; y++) { for (var x = 0; x < dataset.Tables[i].Rows[y].ItemArray.Count(); x++) { currentSheet.Cells[y+1, x+1] = dataset.Tables[i].Rows[y].ItemArray[x]; } } } string outfile = @"C:\APP_OUTPUT\EXCEL_TEST.xlsx"; workbook.SaveAs( outfile, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); workbook.Close(); excel.Quit(); 

Делать это с помощью EPPlus – это кусок пирога. Нет необходимости в сборке Interop и буквально 2 строки кода делают всю магию:

 ws.Cells["A1"].LoadFromDataTable(dt1, true); ws2.Cells["A1"].LoadFromDataTable(dt2, true); 

Полный код:

 protected void ExportExcel_Click(object sender, EventArgs e) { //LinQ Query for dt2 var query = (from c in dt.AsEnumerable() select new {id= c.Field("id"),name=c.Field("name"),city=c.Field("city")}) ; DataTable dt2 = new DataTable(); dt2=query.CopyToDatatable(); //DataTable dt1 DataTable dt1 =new DataTable(); mySqlDataAdapter.Fill(dt1); using (ExcelPackage pck = new ExcelPackage()) { ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Page 1"); ExcelWorksheet ws2 = pck.Workbook.Worksheets.Add("Page 2"); ws.Cells["A1"].LoadFromDataTable(dt1, true); ws2.Cells["A1"].LoadFromDataTable(dt2, true); //Write it back to the client Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx"); Response.BinaryWrite(pck.GetAsByteArray()); Response.Flush(); Response.End(); } } , protected void ExportExcel_Click(object sender, EventArgs e) { //LinQ Query for dt2 var query = (from c in dt.AsEnumerable() select new {id= c.Field("id"),name=c.Field("name"),city=c.Field("city")}) ; DataTable dt2 = new DataTable(); dt2=query.CopyToDatatable(); //DataTable dt1 DataTable dt1 =new DataTable(); mySqlDataAdapter.Fill(dt1); using (ExcelPackage pck = new ExcelPackage()) { ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Page 1"); ExcelWorksheet ws2 = pck.Workbook.Worksheets.Add("Page 2"); ws.Cells["A1"].LoadFromDataTable(dt1, true); ws2.Cells["A1"].LoadFromDataTable(dt2, true); //Write it back to the client Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx"); Response.BinaryWrite(pck.GetAsByteArray()); Response.Flush(); Response.End(); } } 

Обратите внимание, что я скопировал и вставил код для сбора данных. Я ожидаю, что эти строки будут создавать DataTable.

Вам нужно будет создать книгу, добавить дополнительные листы (по умолчанию – три), а затем заполнить ячейки.

Верх файла:

 using Excel=Microsoft.Office.Interop.Excel; 

И тогда основной код для генерации файла Excel

 Excel.Application excel = new Application(); var workbook = (Excel._Workbook) (excel.Workbooks.Add(Missing.Value)); for (var i = 0; i < dataset.Tables.Count; i++) { if (workbook.Sheets.Count <= i) { workbook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing); } var currentSheet = (Excel._Worksheet)workbook.Sheets[i]; for (var y = 0; y < dataset.Tables[i].Rows.Count; y++) { for (var x = 0; x < dataset.Tables[i].Rows[y].ItemArray.Count(); x++) { currentSheet.Cells[y, x] = dataset.Tables[i].Rows[y].ItemArray[x]; } } } workbook.SaveAs("C:\\Temp\\book.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); workbook.Close(); excel.Quit(); Response.WriteFile(C:\\Temp\\book.xlsx"); 

Не знаю точно, если это будет работать, но оно должно помочь вам в правильном направлении

(также: Type.Missing и Missing.Value приходят из пространства имен System.Reflection , только FYI)

Вместо использования какой-либо сторонней библиотеки или автоматизации Excel (с добавлением дополнительных накладных расходов) вы можете просто использовать ADO.NET.

http://support.microsoft.com/kb/316934#10

Вы бы просто использовали T-SQL, с которым вы использовали объекты OleDbCommand.

 CREATE TABLE Sheet1 (id INT, name char(255)) CREATE TABLE Sheet2 (id INT, name char(255)) // for inserts use a parameterized command with ?'s INSERT INTO Sheet1 (id, name) VALUES(?, ?) INSERT INTO Sheet1 (id, name) VALUES(?, ?) 

Вы создадите файл temp excel с помощью Path.GetTempFileName и выведете его, после чего вы сможете удалить временный файл.

  • Полная обратная передача, вызванная LinkButton внутри GridView внутри UpdatePanel
  • Как реализовать выбор полной строки в GridView без кнопки выбора?
  • GridView с двумя столбцами, шириной заливки
  • Android gridview сохраняет выбранный элемент
  • Получить индекс Row в событии Rowcommand от Asp.net
  • Android: Как GridView auto_fit находит количество столбцов?
  • Сетка изображений внутри ScrollView
  • Как отключить прокрутку GridView в Android?
  • Пересечение столбцов GridLayoutManager Android Recyclerview
  • Как найти элемент управления в TemplateField GridView?
  • как связать выпадающий список в gridview?
  • Давайте будем гением компьютера.