DataGridView扩展方法行号、全选、导出到Excel(引用excel组件、生成html两种方式)

22 篇文章 1 订阅
 /// <summary>
        /// DataGridView添加行号
        /// </summary>
        /// <param name="dgv">DataGridView控件ID</param>
        public static void AddRowIndex(this DataGridView dgv)
        {
            dgv.RowPostPaint += delegate(object sender, DataGridViewRowPostPaintEventArgs e)
            {
                SolidBrush b = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor);
                e.Graphics.DrawString((e.RowIndex + 1).ToString(), dgv.DefaultCellStyle.Font, b, e.RowBounds.Location.X + 10, e.RowBounds.Location.Y + 4);
            };
        }
        /// <summary>
        /// DataGridView添加全选
        /// </summary>
        /// <param name="dgv">DataGridView控件ID</param>
        /// <param name="columnIndex">全选所在列序号</param>
        public static void AddFullSelect(this DataGridView dgv, int columnIndex)
        {
            if (dgv.Rows.Count < 1)
            {
                return;
            }
            CheckBox ckBox = new CheckBox();
            Rectangle rect = dgv.GetCellDisplayRectangle(1, -1, true);
            ckBox.Size = new Size(dgv.Columns[1].Width - 12, 12); //大小               
            Point point = new Point(rect.X + 10, rect.Y + 3);//位置
            ckBox.Location = point;
            ckBox.CheckedChanged += delegate(object sender, EventArgs e)
            {
                for (int i = 0; i < dgv.Rows.Count; i++)
                {
                    dgv.Rows[i].Cells[columnIndex].Value = ((CheckBox)sender).Checked;
                }
                dgv.EndEdit();
            };
            dgv.Controls.Add(ckBox);
        }
       /// <summary>
        /// 导出到Excel(通过引用excel组件导出)
        /// </summary>
        /// <param name="dgv">DataGridView控件ID</param>
        public static void ExportExcel(this DataGridView dgv)
        {            
            if (dgv.Rows.Count == 0)
                return;
            //实例化一个Excel.Application对象  
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            try
            {
                //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写  
                excel.Visible = false;
                //设置禁止弹出保存和覆盖的询问提示框  
                excel.DisplayAlerts = false;
                excel.AlertBeforeOverwriting = false;

                //新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错  
                excel.Application.Workbooks.Add(true);
                //生成Excel中列头名称  
                for (int i = 0; i < dgv.Columns.Count; i++)
                {
                    excel.Cells[1, i + 1] = dgv.Columns[i].HeaderText;
                }
                //把DataGridView当前页的数据保存在Excel中  
                for (int i = 0; i < dgv.Rows.Count; i++)
                {
                    for (int j = 0; j < dgv.Columns.Count; j++)
                    {
                        if (dgv[j, i].ValueType == typeof(string))
                        {
                            excel.Cells[i + 2, j + 1] = "'" + dgv[j, i].Value.ToString();
                        }
                        else
                        {
                            excel.Cells[i + 2, j + 1] = dgv[j, i].Value.ToString();
                        }
                    }
                }
              //保存excel文件  
                excel.Save(System.AppDomain.CurrentDomain.BaseDirectory + "temp.xls");
            }
            catch 
            {                
            }
            finally
            {             
                excel.Quit();
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excel);
                excel = null;
                GC.Collect();
            }
        }




       /// <summary>
        /// 导出到Excel(通过生成html导出)
        /// </summary>
        /// <param name="dgv">DataGridView控件ID</param>
       public static void ExportExcel2(this DataGridView dgv)
        {
            if (dgv.Rows.Count == 0)
                return;

            const string HEADER = "<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\">" +
                                          "<meta http-equiv=Content-Type content=\"text/html; charset=\"gb2312\">" +
                                          "<head>" +
                                          "<!--[if gte mso 9]><xml>" +
                                           "<x:ExcelWorkbook>" +
                                               "<x:ExcelWorksheets>" +
                                                   "<x:ExcelWorksheet>" +
                                                       "<x:Name>工作表标题</x:Name>" +
                                                       "<x:WorksheetOptions>" +
                                                           "<x:Print>" +
                                                               "<x:ValidPrinterInfo />" +
                                                           "</x:Print>" +
                                                       "</x:WorksheetOptions>" +
                                                   "</x:ExcelWorksheet>" +
                                               "</x:ExcelWorksheets>" +
                                           "</x:ExcelWorkbook>" +
                                       "</xml>" +
                                       "<![endif]-->";

            const string STYLE = "<style type=\"text/css\">" +
                                       ".text" +
                                       " {" +
                                       "   vnd.ms-excel.numberformat:@;" +
                                       " }" +                                     
                                       "</style>";

            using(SaveFileDialog saveFileDialog = new SaveFileDialog())
            {
                saveFileDialog.Title = "导出Excel文件到";
                saveFileDialog.Filter = "Execl files(*.xls)|All Files(*.*)";
                saveFileDialog.FileName = DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xls";
                saveFileDialog.AddExtension = true;
                saveFileDialog.RestoreDirectory = true;                 
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    using (StreamWriter writer = new StreamWriter(saveFileDialog.FileName, false, System.Text.Encoding.GetEncoding("gb2312"), 1024))
                    {
                        writer.WriteLine(HEADER);
                        writer.WriteLine(STYLE);
                        writer.WriteLine("</head><body><table border=\"1\" style=\"font-size:9pt\"><tr>");

                        for (int i = 0; i < dgv.Columns.Count; i++)
                        {
                            writer.WriteLine(string.Format("<th>{0}</th>", dgv.Columns[i].HeaderText));
                        }

                        for (int i = 0; i < dgv.Rows.Count; i++)
                        {
                            writer.WriteLine("<tr>");
                            for (int j = 0; j < dgv.Columns.Count; j++)
                            {
                                writer.WriteLine(string.Format("<td class=\"text\">{0}</td>", dgv[j, i].Value.ToString()));
                            }
                            writer.WriteLine("</tr>");
                        }
                        writer.WriteLine("</table></body>");
                    }
                }
            }   
        }

        //2013-11-12新增:
       //通过引用NPOI导出Excel
        //导出到Excel(通过引用NPOI导出)
       public static void ExportExcel3(this DataGridView dgv, int columnIndex, string fileName)
        {
            List<int> indexList = dgv.CheckBoxSelect(0);
            if (indexList.Count == 0)
            {
                MessageBox.Show("请先选择!");
                return;
            }
            using (SaveFileDialog saveFileDialog = new SaveFileDialog())
            {
                saveFileDialog.Title = "导出Excel文件到"; 
                saveFileDialog.Filter = "Execl files(*.xls)|All Files(*.*)";
                saveFileDialog.FileName = fileName;
                saveFileDialog.AddExtension = true;
                saveFileDialog.RestoreDirectory = true;
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    IWorkbook workbook = new HSSFWorkbook();
                    ISheet sheet = workbook.CreateSheet();
                    IRow rowTitle = sheet.CreateRow(0);
                    for (int j = columnIndex; j < dgv.Columns.Count; j++)
                    {
                        string headerText = dgv.Columns[j].HeaderText;
                        rowTitle.CreateCell(j - 1).SetCellValue(headerText);
                    }
                    for (int i = 0; i < indexList.Count; i++)
                    {
                        int selRowIndex = indexList[i];
                        IRow row = sheet.CreateRow(i + 1);
                        for (int j = columnIndex; j < dgv.Columns.Count; j++)
                        {
                            string val = dgv.Rows[selRowIndex].Cells[j].Value == null ? "" : dgv.Rows[selRowIndex].Cells[j].Value.ToString();                                                      
                            row.CreateCell(j - 1).SetCellValue(val);
                        }
                    }
                    FileStream outFs = new FileStream(saveFileDialog.FileName, FileMode.Create);
                    workbook.Write(outFs);
                    outFs.Close();
                }
            }
        }
    public static List<int> CheckBoxSelect(this DataGridView dgv, int columnIndex)
        {
            dgv.EndEdit(); //vs2008需加上此行,否则获取到CheckBox.Value为null
            int count = dgv.Rows.Count;
            List<int> indexList = new List<int>();
            for (int i = 0; i < count; i++)
            {
                DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dgv.Rows[i].Cells[columnIndex];
                if (Convert.ToBoolean(checkCell.Value))
                    indexList.Add(i);
            }
            return indexList;
        } 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值