将GridView导出到多个Excel工作表

我在我的Web应用程序中有两个GridView。我需要点击(ExcelExpot)button的值在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<string>("id"),name=c.Field<string>("name"),city=c.Field<string>("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,并将他的代码实现到我的一个项目中。 只是为了logging在代码中会导致一些COMexception的一些小错误。 正确的代码在下面(问题是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是一块蛋糕。 没有互操作程序集所需的字面上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<string>("id"),name=c.Field<string>("name"),city=c.Field<string>("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(); } } 

请注意,我复制并粘贴您的代码以收集数据。 我期望这些行产生一个数据表。

您需要创build工作簿,如果需要添加更多工作表(默认为三),然后填写单元格。

文件顶部:

 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.MissingMissing.Value来自命名空间System.Reflection ,只是FYI)

而不是使用一些第三方库或Excel自动化(与它的额外开销),你可以使用ADO.NET。

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

您可以简单地使用您用于OleDbCommand对象的T-SQL。

 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(?, ?) 

您可以使用Path.GetTempFileName创build您的临时excel文件并输出它,之后您可以删除临时文件。