Экспорт 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... }
- Сетка изображений внутри ScrollView
- Как получить значение ячейки по имени столбца не по индексу в GridView в asp.net
- Как удалить строку из GridView?
- Получить значения DataKey в GridView RowCommand
- Как реализовать выбор полной строки в GridView без кнопки выбора?
- ASP.NET GridView RowIndex как CommandArgument
- Как установить GridView внутри ScrollView
- Редактирование строки Gridview - динамическое связывание с DropDownList
- Условно скрыть CommandField или ButtonField в Gridview
- Как добавить параметр «подтвердить удаление» в ASP.Net Gridview?
- Как найти элемент управления в TemplateField GridView?
- Пересечение столбцов GridLayoutManager Android Recyclerview
- Пейджинговые и сортировочные сетки с ASP.Net MVC
Я согласен с @ 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 и выведете его, после чего вы сможете удалить временный файл.