C#快速匯出DataTable到Excel文件

項目中需要將DataTable中的內容匯出到Excel文件中,採用循環的方式逐個Cell寫數據到Excel文件中,代碼如下:

    //把數據表的內容導出到Excel文件中
    public static void OutDataToExcel2(System.Data.DataTable srcDataTable, string excelFilePath)
    {
        Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
        object missing = System.Reflection.Missing.Value;

        //導出到execl 
        try
        {
            if (xlApp == null)
            {
                MessageBox.Show("無法創建Excel對象,可能您的電腦未安裝Excel!");
                return;
            }

            Microsoft.Office.Interop.Excel.Workbooks xlBooks = xlApp.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook xlBook = xlBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
            Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];

            //讓後臺執行設置爲不可見,爲true的話會看到打開一個Excel,然後數據在往裏寫
            xlApp.Visible = false;
            //生成Excel中列頭名稱
            for (int i = 0; i < srcDataTable.Columns.Count; i++)
            {
                xlSheet.Cells[1, i + 1] = srcDataTable.Columns[i].ColumnName;//輸出DataGridView列頭名
            }

            //把DataGridView當前頁的數據保存在Excel中 
            if (srcDataTable.Rows.Count > 0)
            {
                for (int i = 0; i < srcDataTable.Rows.Count; i++)//控制Excel中行
                {
                    for (int j = 0; j < srcDataTable.Columns.Count; j++)//控制Excel中列
                    {
                        xlSheet.Cells[i + 2, j + 1] = srcDataTable.Rows[i][j];//i控制行,從Excel中第2行開始輸出第一行數據,j控制列,從Excel中第1列輸出第1列數據
                    }
                }
            }

            //設置禁止彈出保存和覆蓋的詢問提示框
            xlApp.DisplayAlerts = false;
            xlApp.AlertBeforeOverwriting = false;

            if (xlSheet != null)
            {
                xlSheet.SaveAs(excelFilePath, missing, missing, missing, missing, missing, missing, missing, missing, missing);
                KillProcess(xlApp);
            }
        }
        catch (Exception ex)
        {
            KillProcess(xlApp);
            throw ex;
        }
    }


    測試時發現很不好,匯出一個19列203行的Table時,用時竟然高達24秒多。

    後來採用整體賦值的方法修改,代碼如下:

    //把數據表的內容導出到Excel文件中
    public static void OutDataToExcel(System.Data.DataTable srcDataTable, string excelFilePath)
    {
        Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
        object missing = System.Reflection.Missing.Value;

        //導出到execl 
        try
        {
            if (xlApp == null)
            {
                MessageBox.Show("無法創建Excel對象,可能您的電腦未安裝Excel!");
                return;
            }

            Microsoft.Office.Interop.Excel.Workbooks xlBooks = xlApp.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook xlBook = xlBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
            Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];

            //讓後臺執行設置爲不可見,爲true的話會看到打開一個Excel,然後數據在往裏寫
            xlApp.Visible = false;

            object[,] objData = new object[srcDataTable.Rows.Count + 1, srcDataTable.Columns.Count];
            //首先將數據寫入到一個二維數組中
            for (int i = 0; i < srcDataTable.Columns.Count; i++)
            {
                objData[0, i] = srcDataTable.Columns[i].ColumnName;
            }
            if (srcDataTable.Rows.Count > 0)
            {
                for (int i = 0; i < srcDataTable.Rows.Count; i++)
                {
                    for (int j = 0; j < srcDataTable.Columns.Count; j++)
                    {
                        objData[i + 1, j] = srcDataTable.Rows[i][j];
                    }
                }
            }

            string startCol = "A";
            int iCnt = (srcDataTable.Columns.Count / 26);
            string endColSignal = (iCnt == 0 ? "" : ((char)('A' + (iCnt - 1))).ToString());
            string endCol = endColSignal + ((char)('A' + srcDataTable.Columns.Count - iCnt * 26 - 1)).ToString();
            Excel.Range range = xlSheet.get_Range(startCol + "1", endCol + (srcDataTable.Rows.Count - iCnt * 26 + 1).ToString());

            range.Value = objData; //給Exccel中的Range整體賦值
            range.EntireColumn.AutoFit(); //設定Excel列寬度自適應
            xlSheet.get_Range(startCol + "1", endCol + "1").Font.Bold = 1;//Excel文件列名 字體設定爲Bold

            //設置禁止彈出保存和覆蓋的詢問提示框
            xlApp.DisplayAlerts = false;
            xlApp.AlertBeforeOverwriting = false;

            if (xlSheet != null)
            {
                xlSheet.SaveAs(excelFilePath, missing, missing, missing, missing, missing, missing, missing, missing, missing);
                //xlApp.Quit();
                KillProcess(xlApp);
            }
        }
        catch (Exception ex)
        {
            KillProcess(xlApp);
            throw ex;
        }
    }

 

測試之前的19203行的DataTable,用時爲4秒多一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章