2011-02-12 67 views
2

我正在使用下面的代码将数据库表中的字段导入到excel中。我想要做的是能够编写一个SQL语句来从多个表中检索字段并将它们导出到excel中。此代码只允许我导出一个表。另外,如何显示保存提示对话框?示例代码将不胜感激 - 非常感谢!EXPORT数据集到EXCEL

protected void export_Click(object sender, EventArgs e) 
{ 

     string sql = null; 
     string data = null; 
     string path = save_as.Text; 

     int i = 0; 
     int j = 0; 

     Excel.Application xlApp; 
     Excel.Workbook xlWorkBook; 
     Excel.Worksheet xlWorkSheet; 
     object misValue = System.Reflection.Missing.Value; 

     xlApp = new Excel.ApplicationClass(); 
     xlWorkBook = xlApp.Workbooks.Add(misValue); 
     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     //connectionString = "data source=servername;initial catalog=databasename;user id=username;password=password;"; 
     SqlConnection cnn = new SqlConnection(GetConnectionString()); 
     cnn.Open(); 
     sql = "SELECT Story, CreationDate FROM Story"; 
     SqlDataAdapter dscmd = new SqlDataAdapter(sql, cnn); 
     DataSet ds = new DataSet(); 
     dscmd.Fill(ds); 

     for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) 
     { 
      for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++) 
      { 
       data = ds.Tables[0].Rows[i].ItemArray[j].ToString(); 
       xlWorkSheet.Cells[i + 1, j + 1] = data; 
      } 
     } 

     xlWorkBook.SaveAs(path+".xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 

     releaseObject(xlWorkSheet); 
     releaseObject(xlWorkBook); 
     releaseObject(xlApp); 

     //MessageBox.Show("Excel file created , you can find the file c:\\csharp.net-informations.xls"); 
    } 

    private void releaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
      //MessageBox.Show("Exception Occured while releasing object " + ex.ToString()); 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    } 

回答

0

您可以根据您的要求做内或outter来获取数据

// your sql query would be look like this 
sql = "SELECT Story, CreationDate, otherTableColumn_1 FROM Story inner join otherTable on Story.commonField = otherTable.commonField"; 

否则,如果表不是相互关联的,这样你就可以通过这个

// your sql query would be look like this 
sql = "SELECT Story, CreationDate, otherTableColumn_1 FROM Story, otherTable"; 
获取数据

这里是在客户端系统上显示SaveAs对话框来保存Excel表格。

Response.Clear(); 
Response.ContentType = "application/vnd.ms-excel"; 
Response.AddHeader("Content-Disposition", "attachment; filename=" yourfilename.xls"); 
// specify excel file format, could be 2000, XP, 2003, e.t.c 
workbook.SaveToStream(Response.OutputStream, FileFormat.XLS97); 
Response.End(); 
0

另一种解决方案是要检索尽可能多的数据集,并将其导出到同一ExcelApp不同的工作簿。为此,您应该将Excel.Application xlApp作为全局变量取出。

关于保存步骤和消息框的东西,只需按照这个非常方便的guide to excel interop with c#。我昨天刚测试过它很甜蜜。

这应该是这样的:

DialogResult iRet = MessageBox.Show(sMsg, "Save Data?", 
     MessageBoxButtons.YesNo); 
    if (iRet == DialogResult.Yes) 
      xlWorkBook.SaveAs(path+".xls", 
       Excel.XlFileFormat.xlWorkbookNormal, etc...); 
1

它是不是安全在ASP.NET环境中进行办公自动化。相反,您应该生成一个csv,html表或xlsx文件并将其发送到客户端。对于xlsx,您可以使用Office Open XML SDK稍微简化一些操作。

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&displaylang=en

+0

撒母耳夫说,避免办公自动化,很容易做错事,再加上它需要运行代码的计算机上进行安装Office。 Open Office XML SDK不需要安装Office。我使用了EPPlus库http://epplus.codeplex.com/,这使得使用OO XML SDK非常容易。 – 2013-11-11 02:18:35