2012-02-02 91 views
1

我在SQL Server 2000中获取数据,并且有一个HyperLink转至传递表单,其代码隐藏将数据输出到Excel文件。我一直在关注这个教程:将DataReader行写入Excel文件

http://www.dzone.com/links/r/export_gridview_to_excelcsv_in_net_using_c.html

我已经成功地从DataReader的输出一些样本值。我遇到的第一个问题是1.1中没有DataTable Load方法。我有数据回来通过DataReader的,但我需要的是如何创建的标题和输出它们,与数据行一起,到Excel文件帮助什么...

Response.Clear(); 
Response.ClearContent(); 
Response.ClearHeaders(); 
Response.Buffer = true; 

string attachment 
    = "attachment;filename=Report_" + DateTime.Now.ToString() + ".xls"; 
Response.AddHeader("content-disposition", attachment); 

Response.Charset = string.Empty; 
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); 
Response.ContentType = "application/ms-excel"; 

DataTable dt = new DataTable(); 
dt.Columns.Add("Company"); 
dt.Columns.Add("Address1"); 
dt.Columns.Add("Address2"); 
dt.Columns.Add("City"); 
dt.Columns.Add("State"); 
dt.Columns.Add("ZipCode"); 

SqlConnection con = new SqlConnection(); 
SqlCommand com = new SqlCommand(); 
con.ConnectionString = "myconnstring"; 
com.Connection = con; 
com.CommandText 
    = "SELECT DISTINCT Company, Address1, Address2, City, State, ZipCode" + 
     " FROM Vendor_View"; 
con.Open(); 

SqlDataReader dr = com.ExecuteReader(); 
while(dr.Read()) 
{ 
    // how to grab and output data to Excel? 
} 

回答

2

如果是简单的数据,然后只发出一个CSV文件。 Excel可以配置为很容易地打开这些。

像下面将让你开始:

response.ContentType = "text/csv"; 
response.AddHeader("Content-Disposition", "attachment;filename=report.csv;"); 
response.AddHeader("Pragma", "no-cache"); 
response.AddHeader("Expires", "0"); 

// 1. output columns 
Boolean addComma = false; 
response.Write("\""); 
foreach (DataColumn column in _dataToProcess.Columns) { 
    if (addComma) { 
     response.Write("\",\""); 
    } else { 
     addComma = true; 
    } 
    response.Write(column.ColumnName.ToString()); 
} // foreach column 
response.Write("\""); 


response.Write(System.Environment.NewLine); 

// 2. output data 
foreach (DataRow row in _dataToProcess.Rows) { 
    addComma = false; 
    response.Write("\""); 
    foreach (Object value in row.ItemArray) { 
     // handle any embedded quotes. 
     String outValue = Convert.ToString(value).Replace("\"", String.Empty); 
     if (addComma) { 
      response.Write("\",\""); 
     } else { 
      addComma = true; 
     } 
     response.Write(outValue); 
    } 
    response.Write("\""); 
    response.Write(System.Environment.NewLine); 
} // foreach row 
+0

那么标题(列名称)呢? – IrishChieftain 2012-02-02 21:34:57

+0

这将是您排出的第一行... – NotMe 2012-02-02 21:36:19

+1

@IrishChieftain:查看更新 – NotMe 2012-02-08 17:03:04

4

我自己写了一篇博客post这一点。基本上有3种选择。但我推荐这一个:

//Make sure you add this reference and have it imported 
Using Excel = Microsoft.Office.Interop.Excel; 

protected void xlsWorkBook() 
{ 
    Excel.Application oXL; 
    Excel.Workbook oWB; 
    Excel.Worksheet oSheet; 
    Excel.Range oRange; 
    // Start Excel and get Application object. 
    oXL = new Excel.Application(); 
    // Set some properties 
    oXL.Visible = true; 
    oXL.DisplayAlerts = false; 
    // Get a new workbook. 
    oWB = oXL.Workbooks.Add(Missing.Value); 
    // Get the active sheet 
    oSheet = (Excel.Worksheet)oWB.ActiveSheet; 
    oSheet.Name = “Customers”; 
    // Process the DataTable 
    // BE SURE TO CHANGE THIS LINE TO USE *YOUR* DATATABLE 
    //DataTable dt = Customers.RetrieveAsDataTable();//commented 
    DataTable dt = Table;//added 
    Session["dt"] = dt;//added 
    int rowCount = 1; 
    foreach (DataRow dr in dt.Rows) 
    { 
     rowCount += 1; 
     for (int i = 1; i < dt.Columns.Count + 1; i++) 
     { 
      // Add the header the first time through 
      if (rowCount == 2) 
      { 
       oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
      } 
     oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
     } 
    } 
    // Resize the columns 
    oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
    oSheet.Cells[rowCount, dt.Columns.Count]); 
    oRange.EntireColumn.AutoFit(); 
    // Save the sheet and close 
    oSheet = null; 
    oRange = null; 
    oWB.SaveAs(“test.xls”, Excel.XlFileFormat.xlWorkbookNormal, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
    Excel.XlSaveAsAccessMode.xlExclusive, 
    Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value); 
    oWB.Close(Missing.Value, Missing.Value, Missing.Value); 
    oWB = null; 
    oXL.Quit(); 
    // Clean up 
    // NOTE: When in release mode, this does the trick 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 
} 
+0

谢谢,我明天就试试这个,回来:) – IrishChieftain 2012-02-03 00:04:42

+0

好吧兄弟,晚安。所有3种方法正在工作。只需选择1. :) – rofans91 2012-02-03 00:10:14

+0

不想使用Interop。是否可以采用示例1,并将Gridview放在组合中 - 只需将数据从DB直接导入Excel? – IrishChieftain 2012-02-06 17:29:10