zoukankan      html  css  js  c++  java
  • Winform 中 dataGridView 导出到Excel中的方法总结

          最近,在做CS端数据导出到Excel中时网上找了很多代码感觉都不是自己想要的,通过自己的整理归纳得到一个比较通用的方法,就给大家分享一下;

           该方法需要用到两个参数(即对象),一个  DataGridView对象 另外一个是我自己添加的一个进度条的对象,这样导出数据的时候会出现一个进度条,废话就不多说了,直接上源码,大家有什么想法可以留言一起讨论。

      第一种方式:

     

       public static bool OutToExcelFromDataGridView(string title, DataGridView dgv, bool isShowExcel)
            {
                int titleColumnSpan = 0;//标题的跨列数
                string fileName = "";//保存的excel文件名
                int columnIndex = 1;//列索引
                if (dgv.Rows.Count == 0)
                    return false;
                /*保存对话框*/
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "导出Excel(*.xls)|*.xlsx";
                sfd.FileName = title + DateTime.Now.ToString("yyyyMMddhhmmss");
    
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    fileName = sfd.FileName;
                    /*建立Excel对象*/
                    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
                    if (excel == null)
                    {
                        MessageBox.Show("无法创建Excel对象,可能您的计算机未安装Excel!");
                        return false;
                    }
                    try
                    {
                        excel.Application.Workbooks.Add(true);
                        excel.Visible = isShowExcel;
                        /*分析标题的跨列数*/
                        foreach (DataGridViewColumn column in dgv.Columns)
                        {
    
                            if (column.Visible == true)
                                titleColumnSpan++;
                        }
                        /*合并标题单元格*/
                        Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.ActiveSheet;
                        //worksheet.get_Range("A1", "C10").Merge();            
                        worksheet.get_Range(worksheet.Cells[1, 1] as Range, worksheet.Cells[1, titleColumnSpan] as Range).Merge();
                        /*生成标题*/
                        excel.Cells[1, 1] = title;
                        (excel.Cells[1, 1] as Range).HorizontalAlignment = XlHAlign.xlHAlignCenter;//标题居中
                                                                                                   //生成字段名称
                        columnIndex = 1;
                        for (int i = 0; i < dgv.ColumnCount; i++)
                        {
                            if (dgv.Columns[i].Visible == true && dgv.Columns[i].HeaderText != "删除")
                            {
                                excel.Cells[2, columnIndex] = dgv.Columns[i].HeaderText;
                                (excel.Cells[2, columnIndex] as Range).HorizontalAlignment = XlHAlign.xlHAlignCenter;//字段居中
                                columnIndex++;
                            }
                        }
                        //填充数据              
                        for (int i = 0; i < dgv.RowCount; i++)
                        {
                            columnIndex = 1;
                            for (int j = 0; j < dgv.ColumnCount; j++)
                            {
                                if (dgv.Columns[j].Visible == true && dgv.Columns[j].HeaderText != "删除")
                                {
                                    if (dgv[j, i].ValueType == typeof(string))
                                    {
                                        excel.Cells[i + 3, columnIndex] = "'" + dgv[j, i].Value.ToString();
                                    }
                                    else
                                    {
                                        excel.Cells[i + 3, columnIndex] = dgv[j, i].Value.ToString();
                                    }
                                    (excel.Cells[i + 3, columnIndex] as Range).HorizontalAlignment = XlHAlign.xlHAlignLeft;//字段居中
                                    columnIndex++;
                                }
                            }
                        }
                        worksheet.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                    }
                    catch { }
                    finally
                    {
                        excel.Quit();
                        excel = null;
                        GC.Collect();
                    }
                    KillProcess("Excel");
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            private static void KillProcess(string processName)//杀死与Excel相关的进程
            {
                System.Diagnostics.Process myproc = new System.Diagnostics.Process();//得到所有打开的进程
                try
                {
                    foreach (System.Diagnostics.Process thisproc in System.Diagnostics.Process.GetProcessesByName(processName))
                    {
                        if (!thisproc.CloseMainWindow())
                        {
                            thisproc.Kill();
                        }
                    }
                }
                catch (Exception Exc)
                {
                    throw new Exception("", Exc);
                }
            }
    

      第二种方式

     public static void DataGridViewToExcel(DataGridView dgv,ProgressBar tempProgressBar)
            {
                #region   验证可操作性     
    
                //申明保存对话框      
                SaveFileDialog dlg = new SaveFileDialog();
                //默然文件后缀      
                dlg.DefaultExt = "xlsx";
                //文件后缀列表      
                dlg.Filter = "EXCEL文件(*.XLS)|*.xlsx";
                //默然路径是系统当前路径      
                dlg.InitialDirectory = Directory.GetCurrentDirectory();
                //打开保存对话框      
                if (dlg.ShowDialog() == DialogResult.Cancel) return;
                //返回文件路径      
                string fileNameString = dlg.FileName;
                //验证strFileName是否为空或值无效      
                if (fileNameString.Trim() == " ")
                { return; }
                //定义表格内数据的行数和列数      
                int rowscount = dgv.Rows.Count;
                int colscount = dgv.Columns.Count;
                //行数必须大于0      
                if (rowscount <= 0)
                {
                    MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
    
                //列数必须大于0      
                if (colscount <= 0)
                {
                    MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
    
                //行数不可以大于65536      
                if (rowscount > 65536)
                {
                    MessageBox.Show("数据记录数太多(最多不能超过65536条),不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
    
                //列数不可以大于255      
                if (colscount > 255)
                {
                    MessageBox.Show("数据记录行数太多,不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
    
                //验证以fileNameString命名的文件是否存在,如果存在删除它      
                FileInfo file = new FileInfo(fileNameString);
                if (file.Exists)
                {
                    try
                    {
                        file.Delete();
                    }
                    catch (Exception error)
                    {
                        MessageBox.Show(error.Message, "删除失败 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                }
                #endregion
                Microsoft.Office.Interop.Excel.Application objExcel = null;
                Microsoft.Office.Interop.Excel.Workbook objWorkbook = null;
                Microsoft.Office.Interop.Excel.Worksheet objsheet = null;
                try
                {
                    //申明对象      
                    objExcel = new Microsoft.Office.Interop.Excel.Application();
                    objWorkbook = objExcel.Workbooks.Add(Missing.Value);
                    objsheet = (Microsoft.Office.Interop.Excel.Worksheet)objWorkbook.ActiveSheet;
                    //设置EXCEL不可见      
                    objExcel.Visible = false;
    
                    //向Excel中写入表格的表头      
                    int displayColumnsCount = 1;
                    for (int i = 0; i <= dgv.ColumnCount - 1; i++)
                    {
                        if (dgv.Columns[i].Visible == true&& dgv.Columns[i].HeaderText.Trim()!="删除" && dgv.Columns[i].HeaderText.Trim() !="")
                        {
                            objExcel.Cells[1, displayColumnsCount] = dgv.Columns[i].HeaderText.Trim();
                            displayColumnsCount++;
                        }
                    }
                    //设置进度条      
                    tempProgressBar.Refresh();
                    tempProgressBar.Visible = true;
                    tempProgressBar.Minimum =1;
                    tempProgressBar.Maximum =dgv.RowCount;
                    tempProgressBar.Step = 1;
                    //向Excel中逐行逐列写入表格中的数据      
                    for (int row = 0; row <= dgv.RowCount - 1; row++)
                    {
                        tempProgressBar.PerformStep();
    
                        displayColumnsCount = 1;
                        for (int col = 0; col < colscount; col++)
                        {
                            if (dgv.Columns[col].Visible == true&& dgv.Columns[col].HeaderText!="删除" && dgv.Columns[col].HeaderText.Trim() != "")
                            {
                                try
                                {
                                    string Val = dgv.Rows[row].Cells[col].Value.ToString().Trim();
                                    if (Val.Length >8)
                                    {
                                      Val = "'" + Val;//加单引号
                                    }
                                    objExcel.Cells[row + 2, displayColumnsCount] = Val;
                                    displayColumnsCount++;
                                }
                                catch (Exception)
                                {
    
                                }
    
                            }
                        }
                    }
                    //隐藏进度条      
                    tempProgressBar.Visible = false;
                    //保存文件      
                    objWorkbook.SaveAs(fileNameString, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                            Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value,
                            Missing.Value, Missing.Value);
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message, "警告 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                finally
                {
                    //关闭Excel应用      
                    if (objWorkbook != null) objWorkbook.Close(Missing.Value, Missing.Value, Missing.Value);
                    if (objExcel.Workbooks != null) objExcel.Workbooks.Close();
                    if (objExcel != null) objExcel.Quit();
    
                    objsheet = null;
                    objWorkbook = null;
                    objExcel = null;
                }
                MessageBox.Show(fileNameString + "导出完毕! ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
    
            }

       个人推荐第一种,经过测试第一种也可以,但是比较麻烦一些,第二种通俗简单,推荐使用;

            根据个人喜好的选择吧,欢迎大神前来提意见;

  • 相关阅读:
    Cisco静态路由
    VTP
    trunk
    vim中文乱码
    Ubuntu 切换root用户是时出现su Authentication failure
    github 换行符自动转换功能
    Qt弹出消息对话框
    串口发送Hex数组
    Qt 按顺序保存多个文件
    Qt乱码解决办法(常量中有换行符)
  • 原文地址:https://www.cnblogs.com/BraveBoy/p/6558658.html
Copyright © 2011-2022 走看看