从sql server数据库导出到excel不能正常工作

时间:2014-04-01 18:15:36

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

我有一个可以将SQL Server数据导出到Excel的工作代码。

public static void ExportToExcel(DataTable dt)
{
        // Create sql connection string
        string conString = "Data Source=DELL\\SQLSERVER1;Trusted_Connection=True;DATABASE=Test;CONNECTION RESET=FALSE";
        SqlConnection sqlCon = new SqlConnection(conString);
        sqlCon.Open();

        SqlDataAdapter da = new SqlDataAdapter("select * from tStudent", sqlCon);
        System.Data.DataTable dtMainSQLData = new System.Data.DataTable();
        da.Fill(dtMainSQLData);
        DataColumnCollection dcCollection = dtMainSQLData.Columns;

        // Export Data into EXCEL Sheet
        Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
        ExcelApp.Application.Workbooks.Add(Type.Missing);

        //ExcelApp.Cells.CopyFromRecordset(objRS);
        for (int i = 1; i < dtMainSQLData.Rows.Count + 1; i++)
        {
            for (int j = 1; j < dtMainSQLData.Columns.Count + 1; j++)
            {
                if (i == 1)
                    ExcelApp.Cells[i, j] = dcCollection[j - 1].ToString();
                else
                    ExcelApp.Cells[i, j] = dtMainSQLData.Rows[i - 1][j - 1].ToString();
            }
        }
        ExcelApp.ActiveWorkbook.SaveCopyAs("C:/Users/Administrator.CAMO/Downloads/FtpFilesStorage/Sheet1.xlsx");
        ExcelApp.ActiveWorkbook.Saved = true;
        ExcelApp.Quit();

        Console.WriteLine(".xlsx file Exported succssessfully.");
}

我在Main()中使用此方法,如下所示:

System.Data.DataTable dtMainSQLData = new System.Data.DataTable();
ExportToExcel(dtMainSQLData);

这样可以正常工作,但不会从SQL Server中的原始表复制或导出第一行。

2 个答案:

答案 0 :(得分:2)

您遇到一次性错误,因为ExcelApp.Cells不是基于零的,而且您有一个标题行。

要解决此问题,您可以使用foreach并将标头导出到单独的块中。 它确实需要更多的代码,但我发现它更容易处理并且更不容易出错

int i = 1;

int j = 1;   
//header row
foreach(DataColumn col in dtMainSQLData.Columns)
{  
  ExcelApp.Cells[i, j]  = col.ColumnName;
  j++;
}

i++;
//data rows
foreach(DataRow row  in dtMainSQLData.Rows)
{
    for (int k = 1; k < dtMainSQLData.Columns.Count + 1; k++)
    {
         ExcelApp.Cells[i, k]  = row[k-1].ToString();
    }
    i++;
}

答案 1 :(得分:0)

您的代码很好,除了您只需删除“其他”块并递增Excel电子表格的起始行:

for (int i = 1; i < dtMainSQLData.Rows.Count + 1; i++)
{
    for (int j = 1; j < dtMainSQLData.Columns.Count + 1; j++)
    {
        if (i == 1)
            ExcelApp.Cells[i, j] = dcCollection[j - 1].ToString();

        ExcelApp.Cells[i + 1, j] = dtMainSQLData.Rows[i - 1][j - 1].ToString();
    }
}