C#WinForm 直接导出DataGridView数据到Excel表格的二种方法对比
方法一、利用微软的excel 操作类
引用:using Excel = Microsoft.Office.Interop.Excel;
代码如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |         #region导出数据表:Excle (微软的excel 操作类)        ///<summary>        ///导出数据表:Excle        ///</summary>        ///<param name="myDGV"></param>        publicvoid_ToExcel(DataGridView myDGV)        {            stringpath = "";            SaveFileDialog saveDialog = newSaveFileDialog();            saveDialog.DefaultExt = "xlsx";            saveDialog.Filter = "Excel文件|*.xlsx";            saveDialog.ShowDialog();            path = saveDialog.FileName;            if(path.IndexOf(":") < 0) return; //判断是否点击取消            try            {                Excel.Application xlApp = newExcel.Application();                if(xlApp == null)                {                    MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");                    return;                }                Excel.Workbooks workbooks = xlApp.Workbooks;                Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);                Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1                intcolIndex = 0;                //写入标题                for(inti = 0; i < myDGV.ColumnCount; i++)                {                    if(myDGV.Columns[i].Visible)//用作于不导出隐藏列                    {                        colIndex++;                        worksheet.Cells[1, colIndex] = myDGV.Columns[i].HeaderText;                        //worksheet.Cells[1, i] = myDGV.Columns[i].HeaderText;                    }                }                //写入数值                for(intr = 0; r < myDGV.Rows.Count - 1; r++)                {                    colIndex = 0;                    for(inti = 0; i < myDGV.ColumnCount; i++)                    {                        if(myDGV.Columns[i].Visible)                        {                            colIndex++;                            worksheet.Cells[r + 2, colIndex] = myDGV.Rows[r].Cells[i].Value;                        }                    }                    System.Windows.Forms.Application.DoEvents();                }                worksheet.Columns.EntireColumn.AutoFit();//列宽自适应                if(path != "")                {                    try                    {                        workbook.Saved = true;                        workbook.SaveCopyAs(path);                        //fileSaved = true;                    }                    catch(Exception ex)                    {                        //fileSaved = false;                        MessageBox.Show("导出文件时出错,文件可能正被打开!\n\r"+ ex.Message);                    }                }                xlApp.Quit();                GC.Collect();//强行销毁                // if (fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName); //打开EXCEL                 MessageBox.Show(path + ",导出成功", "系统提示", MessageBoxButtons.OK);            }            catch(Exception ex)            {                MessageBox.Show(ex.Message);            }         }        #endregion | 
方法二、IO基础流操作类
引用:using System.IO;
using System.Threading;
代码如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |         #region导出数据表:Excle (io流操作类)        ///<summary>        ///导出数据表:Excle (io流操作类)        ///</summary>        ///<param name="myDGV"></param>        publicvoid_ToExcel2(DataGridView myDGV)        {            stringpath = "";            SaveFileDialog saveDialog = newSaveFileDialog();            saveDialog.DefaultExt = "xls";            saveDialog.Filter = "Excel97-2003 (*.xls)|*.xls|All Files (*.*)|*.*";            saveDialog.ShowDialog();            path = saveDialog.FileName;            if(path.IndexOf(":") < 0) return; //判断是否点击取消            try            {                Thread.Sleep(1000);                StreamWriter sw = newStreamWriter(path, false, Encoding.GetEncoding("gb2312"));                StringBuilder sb = newStringBuilder();                //写入标题                for(intk = 0; k < myDGV.Columns.Count; k++)                {                    if(myDGV.Columns[k].Visible)//导出可见的标题                    {                        //"\t"就等于键盘上的Tab,加个"\t"的意思是: 填充完后进入下一个单元格.                        sb.Append(myDGV.Columns[k].HeaderText.ToString().Trim() + "\t");                    }                }                sb.Append(Environment.NewLine);//换行                //写入每行数值                for(inti = 0; i < myDGV.Rows.Count - 1; i++)                {                    System.Windows.Forms.Application.DoEvents();                    for(intj = 0; j < myDGV.Columns.Count; j++)                    {                        if(myDGV.Columns[j].Visible)//导出可见的单元格                        {                            //注意单元格有一定的字节数量限制,如果超出,就会出现两个单元格的内容是一模一样的.                            //具体限制是多少字节,没有作深入研究.                            sb.Append(myDGV.Rows[i].Cells[j].Value.ToString().Trim() + "\t");                        }                    }                    sb.Append(Environment.NewLine); //换行                }                sw.Write(sb.ToString());                sw.Flush();                sw.Close();                MessageBox.Show(path + ",导出成功", "系统提示", MessageBoxButtons.OK);            }            catch(Exception ex)            {                MessageBox.Show(ex.Message);            }         }        #endregion | 
二种方法对比,利用IO基础流导出到Excel表格中的速度最快。特别是上10万行以上的数据,更是能体现其速度。
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号