将SQL Server数据库导出到Excel:表列名称不会作为Excel列标题传输

时间:2015-04-15 02:18:02

标签: c# sql-server visual-studio-2012 export-to-excel

我正在尝试将SQL Server数据库表的内容导出到Excel文档。我遇到的问题是表列名称没有显示为Excel中的列标题。

public partial class Reports : System.Web.UI.Page
{
    protected void reportbtn_Click(object sender, EventArgs e)
    {
        SqlConnection cnn;
        string connectionString = null;
        string sql = null;
        string data = null;
        int i = 0;
        int j = 0;

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

        xlApp = new Excel.Application();
        xlWorkBook = xlApp.Workbooks.Add(misValue);

        Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
        ExcelApp.ScreenUpdating = true;
        ExcelApp.Visible = true;
        ExcelApp.Interactive = true;
        ExcelApp.IgnoreRemoteRequests = false;

        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        //Connects to Database   
        connectionString = "data source=LocalHost;initial catalog=KPMG;Integrated Security=True";
        cnn = new SqlConnection(connectionString);
        cnn.Open()

        //Sql Command Statement    
        sql = "Select FirstName, LastName From EmployeeData Where EmployeeID = 1"; //sql string needs to be adjusted to pull all necessary information
        SqlDataAdapter dscmd = new SqlDataAdapter(sql, cnn);
        DataSet ds = new DataSet();
        dscmd.Fill(ds);

        // This for loop populates the excel document, but can't figure out how to 
        //  include the table names as headers for the columns 

        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;
            }
        }

        //saves excel workbook to C:     
        xlWorkBook.SaveAs("TravelReport.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:/Users/LabPatron/Documents/TravelReport.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();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

在Excel中,列标题是数据本身的一部分,占用工作表中的一行。在Sql Server结果集中,列标题是元数据的一部分;标题不被视为&#34; row&#34;在实际结果中。如果您想在此处使用Excel中的列标题,则需要执行额外操作以将其添加到工作表中。这可能意味着使用sql UNION,其中第一部分选择列的名称作为文字(如果类型兼容或可以兼容),或者它可能意味着在结果的开头有一个额外的循环设置第一行......或者它可能意味着别的东西,这取决于你想要怎么做。与程序员一样,有许多潜在的解决方案,最好的选择将取决于问题中未包含的背景。

虽然我在这里,但我在代码中看到了在ASP.Net网页中运行的上下文。在将代码部署到Web服务器之后,此代码将 NOT 以您期望的方式工作。 ASP.Net中的VB.Net代码完全在托管Web浏览器的计算机上的 Web服务器上运行。 MessageBox.Show()代码现在只能使用,因为您的网络服务器和网络浏览器位于相同的计算机上。 xlWorkBook.SaveAs()电话也是如此。你需要完全重新思考你在这里做了什么,因为当前的方法不可能做到你想要的。您应该检查下面链接的问题的答案,以获取在ASP.Net中生成Excel文件的选项:

  

Generating an Excel file in ASP.NET

答案 1 :(得分:0)

回答您的问题“为什么没有列标题?”

您需要做的是,还要明确地将DataTableDataSet的列名写入Excel文档中的所需(第一行)。

您可以使用ColumnName所选列上的DataTable属性检索列名称,如ds.Tables[0].Columns[ci].ColumnName;

对于您的代码,请将写入Excel文档的部分修改为:

// This for loop adds the column names to the first row of the Excel document.
for (ci = 0; ci < ds.Tables[0].Columns.Count; ci++)
    xlWorkSheet.Cells[1, ci + 1] = ds.Tables[0].Columns[ci].ColumnName;

// This for loop populates the excel document with values.
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();
        // +2 because we already inserted the header row.
        xlWorkSheet.Cells[i + 2, j + 1] = data;
    }
}

更多问题:服务器端Excel文档生成

正如@JoelCoehoorn在他answer的第二部分中指出的那样,您的代码可能无法按预期工作。您正在ASP.NET应用程序的服务器端生成Excel文件,并将其保存在服务器上。除非您已将文件保存在用户可访问的文件共享上,否则用户将无权访问您生成的Excel文件。另请参阅microsoft的这句话:

  

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。

这些问题在服务器端Excel文档生成及其中的一些问题。

  

Excel dll for Microsoft.Office.Interop.Excel

     

Excel file generation on server without Excel installed

     

Alternative to Office Interop for document generation

Microsoft推荐的生成Excel文档的方法似乎是使用Open XML SDK。您可以使用它来生成Excel文档并将其内容作为文件返回给用户。

您还可以查看@JoelCoehoorn提到的问题页面中的this答案,以获得直接与数据表配合使用的替代解决方案。