【问题标题】:EXPORT Dataset to EXCEL将数据集导出到 EXCEL
【发布时间】:2013-11-11 10:05:49
【问题描述】:

我正在使用以下代码将数据库表中的字段导出到 Excel 中。我想要做的是能够编写一个 SQL 语句来从多个表中检索字段并将它们导出到 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();
        }
    }

【问题讨论】:

    标签: c# asp.net export-to-excel


    【解决方案1】:

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

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

    【讨论】:

    • 正如 Samuel Neff 所说,避免使用 Office 自动化,很容易出错,而且需要在运行代码的计算机上安装 Office。 Open Office XML SDK 不需要安装 Office。我使用了 EPPlus 库 epplus.codeplex.com,这使得使用 OO XML SDK 变得非常容易。
    【解决方案2】:

    您可以根据自己的要求进行内部或外部获取数据

    // 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();
    

    【讨论】:

      【解决方案3】:

      另一种解决方案是检索任意数量的数据集,并将它们导出到同一 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...);
      

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 2020-04-02
        • 2016-12-14
        • 1970-01-01
        相关资源
        最近更新 更多