C# DataGridView 導出Excle代碼和總結(轉)

http://www.cnblogs.com/loveqin24/archive/2012/04/09/2439071.html

1、導出很快的方式;

1.1、設置數字不以科學計數法顯示  設置Rang xlRang.NumberFormat = "@";就ok了。

1.2、設置一列的格式:

e.Item.Cells[1].Attributes.Add("style", "vnd.ms-excel.numberformat:@");//防止以科學計數法顯示

e.Item.Cells[4].Attributes.Add("style", "vnd.ms-excel.numberformat:¥#,###.00");

public bool DataGridViewToExcelFast(DataGridView dataGridView1, string fileName, int n) 
        { 
            int ExcelColumns = 0; 
            if (dataGridView1.Rows.Count > 65536) 
            { 
                if (MessageBox.Show("數據行大於Excel2003所容許的最大行數65535行,繼續導出可能會引發錯誤,是否繼續?", "提示信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.No) 
                { 
                    return false; 
                } 
            } 
            System.Reflection.Missing miss = System.Reflection.Missing.Value; 
            //創建EXCEL對象appExcel,Workbook對象,Worksheet對象,Range對象 
            Microsoft.Office.Interop.Excel.Application appExcel = null; 
            appExcel = new Microsoft.Office.Interop.Excel.Application(); 
            Microsoft.Office.Interop.Excel.Workbook workbookData; 
            Microsoft.Office.Interop.Excel.Worksheet worksheetData; 
            Microsoft.Office.Interop.Excel.Range rangedata; 
            //設置對象不可見 
            appExcel.Visible = false; 
            /* 在調用Excel應用程序,或創建Excel工作簿之前,記着加上下面的兩行代碼 
            * 這是因爲Excel有一個Bug,如果你的操作系統的環境不是英文的,而Excel就會在執行下面的代碼時,報異常。 
            */ 
            System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture; 
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 
            workbookData = appExcel.Workbooks.Add(miss); 
            worksheetData = (Microsoft.Office.Interop.Excel.Worksheet)workbookData.Worksheets.Add(miss, miss, miss, miss); 
            //worksheetData.Cells.Style = "vnd.ms-excel.numberformat:@"; 
            //給工作表賦名稱 
            //worksheetData.Name = "MySheet";

            // 保存到WorkSheet的表頭,你應該看到,是一個Cell一個Cell的存儲,這樣效率特別低,解決的辦法是,使用Rang,一塊一塊地存儲到Excel 
            ExcelColumns = 0; 
            for (int i = 0; i < dataGridView1.ColumnCount; i++) 
            { 
                if (!dataGridView1.Columns[i].Visible) 
                { 
                    continue; 
                } 
                worksheetData.Cells[1, ++ExcelColumns] = dataGridView1.Columns[i].HeaderText.ToString(); 
            } 
            //先給Range對象一個範圍爲A2開始,Range對象可以給一個CELL的範圍,也可以給例如A1到H10這樣的範圍 
            //因爲第一行已經寫了表頭,所以所有數據都應該從A2開始    
            rangedata = worksheetData.get_Range("A2", miss); 
            Microsoft.Office.Interop.Excel.Range xlRang = null; 
            //iRowCount爲實際行數,最大行 
            int iRowCount = dataGridView1.RowCount; 
            int iParstedRow = 0, iCurrSize = 0; 
            //iEachSize爲每次寫行的數值,可以自己設置,每次寫1000行和每次寫2000行大家可以自己測試下效率 
            int iEachSize = 1000; 
            //iColumnAccount爲實際列數,最大列數 
            int iColumnAccount = dataGridView1.ColumnCount; 
            //在內存中聲明一個iEachSize×iColumnAccount的數組,iEachSize是每次最大存儲的行數,iColumnAccount就是存儲的實際列數 
            object[,] objVal = new object[iEachSize, iColumnAccount]; 
            try 
            { 
                iCurrSize = iEachSize; 
                //計算Excel列頭 
                string En = NumToEn(iColumnAccount); 
                while (iParstedRow < iRowCount) 
                { 
                    if ((iRowCount - iParstedRow) < iEachSize) 
                        iCurrSize = iRowCount - iParstedRow; 
                    //用FOR循環給數組賦值 
                    for (int i = 0; i < iCurrSize; i++) 
                    { 
                        try 
                        { 
                            for (int j = 0; j < iColumnAccount; j++) 
                            { 
                                if (!dataGridView1.Columns[j].Visible) 
                                { 
                                    continue; 
                                } 
                                objVal[i, j] = dataGridView1[j, i + iParstedRow].Value == null ? "" : dataGridView1[j, i + iParstedRow].Value.ToString(); 
                            } 
                            System.Windows.Forms.Application.DoEvents(); 
                        } 
                        catch (Exception e) 
                        { 
                            MessageBox.Show(e.ToString()); 
                        } 
                    } 
                    /* 
                    * 建議使用設置斷點研究下哈 
                    * 例如A1到H10的意思是從A到H,第一行到第十行 
                    * 下句很關鍵,要保證獲取Sheet中對應的Range範圍 
                    * 下句實際上是得到這樣的一個代碼語句xlRang = worksheetData.get_Range("A2","H100"); 
                    * 注意看實現的過程 
                    * 'A' + iColumnAccount - 1這兒是獲取你的最後列,A的數字碼爲65,大家可以仔細看下是不是得到最後列的字母 
                    * iParstedRow + iCurrSize + 1獲取最後行 
                    * 若WHILE第一次循環的話這應該是A2,最後列字母+最後行數字 
                    * iParstedRow + 2要注意,每次循環這個值不一樣,他取決於你每次循環RANGE取了多大,循環了幾次,也就是iEachSize設置值的大小哦 
                    */ 
                    //xlRang = worksheetData.get_Range("A" + ((int)(iParstedRow + 2)).ToString(), ((char)('A' + iColumnAccount - 1)).ToString() + ((int)(iParstedRow + iCurrSize + 1)).ToString());

 

                    //**********從A2開始寫***************                     
                    xlRang = worksheetData.get_Range("A" + ((int)(iParstedRow + 2)).ToString(), En + ((int)(iParstedRow + iCurrSize + 1)).ToString()); 
                    xlRang.NumberFormat = "@"; 
                    // 調用Range的Value2屬性,把內存中的值賦給Excel 
                    xlRang.Value2 = objVal; 
                    
                    iParstedRow = iParstedRow + iCurrSize; 
                } 
                //保存工作表 
                worksheetData.SaveAs(fileName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss); 
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRang); 
                xlRang = null; 
                //調用方法關閉EXCEL進程,大家可以試下不用的話如果程序不關閉在進程裏一直會有EXCEL.EXE這個進程並鎖定你的EXCEL表格 
                this.KillSpecialExcel(appExcel); 
                MessageBox.Show("數據已經成功導出到:" + fileName, "導出完成", MessageBoxButtons.OK, MessageBoxIcon.Information); 
                // 別忘了在結束程序之前恢復你的環境!                   
                System.Threading.Thread.CurrentThread.CurrentCulture = CurrentCI; 
                return true; 
            } 
            catch (Exception ex) 
            { 
                this.KillSpecialExcel(appExcel); 
                MessageBox.Show(ex.Message); 
                return false; 
            } 
        }

這句不起作用:worksheetData.Cells.Style = "vnd.ms-excel.numberformat:@";我不懂是什麼

 2、一行一行的寫出的方式;這種方式較慢!

public void DataGridViewToExcel() 
        {

            SaveFileDialog kk = new SaveFileDialog(); 
            kk.Title = "保存EXECL文件"; 
            kk.Filter = "EXECL文件(*.xls) |*.xls |所有文件(*.*) |*.*"; 
            kk.FilterIndex = 1; 
            if (kk.ShowDialog() == DialogResult.OK) 
            { 
                string FileName = kk.FileName + ".xls"; 
                if (File.Exists(FileName)) 
                    File.Delete(FileName); 
                FileStream objFileStream; 
                StreamWriter objStreamWriter; 
                string strLine = ""; 
                objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write); 
                objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode); 
                for (int i = 0; i < ViewMaster.Columns.Count; i++) 
                { 
                    if (ViewMaster.Columns[i].Visible == true) 
                    { 
                        strLine = strLine + ViewMaster.Columns[i].HeaderText.ToString() + Convert.ToChar(9); 
                    } 
                } 
                objStreamWriter.WriteLine(strLine); 
                strLine = "";

                for (int i = 0; i < ViewMaster.Rows.Count; i++) 
                { 
                    if (ViewMaster.Columns[0].Visible == true) 
                    { 
                        if (ViewMaster.Rows[i].Cells[0].Value == null) 
                            strLine = strLine + " " + Convert.ToChar(9); 
                        else 
                            strLine = strLine + ViewMaster.Rows[i].Cells[0].Value.ToString() + Convert.ToChar(9); 
                    } 
                    for (int j = 1; j < ViewMaster.Columns.Count; j++) 
                    { 
                        if (ViewMaster.Columns[j].Visible == true) 
                        { 
                            if (ViewMaster.Rows[i].Cells[j].Value == null) 
                                strLine = strLine + " " + Convert.ToChar(9); 
                            else 
                            { 
                                string rowstr = ""; 
                                rowstr = ViewMaster.Rows[i].Cells[j].Value.ToString(); 
                                if (rowstr.IndexOf("\r\n") > 0) 
                                    rowstr = rowstr.Replace("\r\n", " "); 
                                if (rowstr.IndexOf("\t") > 0) 
                                    rowstr = rowstr.Replace("\t", " "); 
                                strLine = strLine + rowstr + Convert.ToChar(9); 
                            } 
                        } 
                    } 
                    objStreamWriter.WriteLine(strLine); 
                    strLine = ""; 
                } 
                objStreamWriter.Close(); 
                objFileStream.Close(); 
                MessageBox.Show(this, "保存EXCEL成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); 
            } 
        }


發佈了58 篇原創文章 · 獲贊 102 · 訪問量 67萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章