1. 程式人生 > >C#由DataSet匯出Excel檔案的幾種方法

C#由DataSet匯出Excel檔案的幾種方法

裡面的方法很多。

我只成功運行了下面四種(稍作修改並添加了一些總結),其他的方法,沒能成功執行。

不過感興趣的可以看一下,因為即使不能執行(不能執行的原因有很多,差一點都不行),其思路還是值得參考學習的。


//法一

private void ToExcel(DataSet dataSet, bool isShowExcel)
        {
            DataTable dataTable = dataSet.Tables[0];
            int rowNumber = dataTable.Rows.Count;
            int columnNumber = dataTable.Columns.Count;

            if (rowNumber == 0)
            {
                MessageBox.Show("沒有任何資料可以匯入到Excel檔案!");              
            }

            //建立Excel物件
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            excel.Application.Workbooks.Add(true);
            excel.Visible = isShowExcel;//是否開啟該Excel檔案

            //填充資料
            for (int c = 0; c < rowNumber; c++)
            {
                for (int j = 0; j < columnNumber; j++)
                {
                       //c=0,j=0,對應的是dataTable中的除去表頭那一行的第一行第一列元素

                       excel.Cells[c + 1, j + 1] = dataTable.Rows[c].ItemArray[j];
               }
            }           
     }

*DataSet、DataTable物件、Excel物件是基本的必要的物件

*沒有欄位名稱,

*直接開啟一個excel檔案,裡面是dataset中的資料。

*關閉不儲存,程式會報錯
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


//法二

private void ToExcel(DataSet dataSet, bool isShowExcel)
        {
                DataTable dataTable = dataSet.Tables[0];
                int rowNumber = dataTable.Rows.Count;

                int rowIndex = 1;
                int colIndex = 0;
            

                //建立Excel物件
                Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
                excel.Application.Workbooks.Add(true);
                excel.Visible = isShowExcel;

                //生成欄位名稱,利用DataColumn的ColumnName屬性
                foreach (DataColumn col in dataTable.Columns)
                {
                    colIndex++;
                    excel.Cells[1, colIndex] = col.ColumnName;
                }

                //填充資料
                foreach (DataRow row in dataTable.Rows)
                {
                    rowIndex++;
                    colIndex = 0;
                    foreach (DataColumn col in dataTable.Columns)
                    {
                        colIndex++;
                        excel.Cells[rowIndex, colIndex] = row[col.ColumnName];
                    }
                }
        }

*DataSet、DataTable物件、Excel物件

*利用DataColumn的ColumnName屬性

*有欄位名稱,

*裡面是dataset中的資料,儲存或不儲存都沒問題

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//法三

private void ToExcel(DataSet dataSet, bool isShowExcel)
        {
            DataTable dataTable = dataSet.Tables[0];
            int rowNumber = dataTable.Rows.Count;//不包括欄位名
            int columnNumber = dataTable.Columns.Count;
            int colIndex = 0;


            //建立Excel物件 
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            excel.Application.Workbooks.Add(true);

            //這樣就只會開啟一個sheet,不會出現下面說到的開啟兩個sheet:一個空白,一個有資料的情況
            Microsoft.Office.Interop.Excel.Workbook workbook = excel.ActiveWorkbook;
            Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.ActiveSheet;
            excel.Visible = isShowExcel;
           
            Microsoft.Office.Interop.Excel.Range range;

            //生成欄位名稱 
            foreach (DataColumn col in dataTable.Columns)
            {
                colIndex++;
                excel.Cells[1, colIndex] = col.ColumnName;
            }

            object[,] objData = new object[rowNumber, columnNumber];

            for (int r = 0; r < rowNumber; r++)
            {
                for (int c = 0; c < columnNumber; c++)
                {
                    objData[r, c] = dataTable.Rows[r][c];
                }
                Application.DoEvents();
            }

            // 寫入Excel
            range=excel.get_Range((object)worksheet.Cells[2, 1], (object)worksheet.Cells[rowNumber + 1, columnNumber]);
            range.NumberFormat = "@";//設定單元格為文字格式
            range.Value2 = objData;
            excel.get_Range((object)worksheet.Cells[2, 1], (object)worksheet.Cells[rowNumber + 1, 1]).NumberFormat = "yyyy-m-d h:mm";

        }

*DataSet、DataTable物件、Excel物件、workbook物件、Worksheet物件、Range物件

*利用DataColumn的ColumnName屬性

*有欄位名稱

*可以儲存或不儲存,可以選擇儲存位置

*使用workbook和workshee時可能會開啟兩個excel(準確的說是兩個sheet),一個空白,一個有資料。

*建立workbook的時候會預設創建出一個worksheet,使用ActiveSheet就可以得到這個worksheet

*上面的程式碼是改過的,不會出現這種情況

*匯出時能看出來速度比方法二快

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



//法四

private void ToExcel(DataSet dataSet, bool isShowExcel)
        {
                DataTable dataTable = dataSet.Tables[0];
                int rowNumber = dataTable.Rows.Count;
                int columnNumber = dataTable.Columns.Count;
                String stringBuffer = "";

                if (rowNumber == 0)
                {
                    MessageBox.Show("沒有任何資料可以匯入到Excel檔案!");
                   
                }

                //建立Excel物件
                Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
                excel.Application.Workbooks.Add(true);
                excel.Visible = isShowExcel;//是否開啟該Excel檔案

                //填充資料
                for (int i = 0; i < rowNumber; i++)
                {
                    for (int j = 0; j < columnNumber; j++)
                    {
                        stringBuffer += dataTable.Rows[i].ItemArray[j].ToString();
                        if (j < columnNumber - 1)
                        {
                            stringBuffer += "\t";
                        }
                    }
                    stringBuffer += "\n";
                }
                Clipboard.Clear();
                Clipboard.SetDataObject(stringBuffer);
                ((Microsoft.Office.Interop.Excel.Range)excel.Cells[1, 1]).Select();
                ((Microsoft.Office.Interop.Excel.Worksheet)excel.ActiveWorkbook.ActiveSheet).Paste(Missing.Value, Missing.Value);
                Clipboard.Clear();
            
        }

*DataSet、DataTable物件、Excel物件

*利用string

*利用Clipboard

*沒有欄位名稱

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~