winfrom 快速 导出excel

此方法比较快,500条8列的数据不到1秒

只需要给一个有数据的datagridview就可以了


private void ToExcel_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "Execl files (*.xls)|*.xlsx";
            sfd.FilterIndex = 0;
            sfd.RestoreDirectory = true;
            sfd.CreatePrompt = false;
            sfd.Title = "导出文件保存路径";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                string path = sfd.FileName; //时间计算
                DateTime dt1 = DateTime.Now;
                saveAsExcel(path, dataGridView1);
                DateTime dt2 = DateTime.Now;

                MessageBox.Show("导出成功!共用了:" + (dt2 - dt1));
            }
        }
        //这个代码速度特别快,基本达到导出csv的速度
        public static void SaveAsExcel(string path, DataGridView gridView)
        {
            if (gridView.RowCount > 65536)
            {
                MessageBox.Show("当前表格中记录太多,不能导出excel(excel最多可以存储65536行记录)", "提示");
                //return;
            }
            try
            {
                saveAsExcel(path, gridView);
                System.GC.Collect();
            }
            catch (Exception ex)
            {
                MessageBox.Show("导出excel时发生错误: " + ex.Message, "提示");
                System.GC.Collect();
            }
        }

        //上面的 SaveAsExcel 调用 saveAsExcel 的目,估计是为了解决 excel进程销毁的问题
        private static void saveAsExcel(string path, DataGridView gridView)
        {
            object objMissing = System.Reflection.Missing.Value;

            Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
            app.Visible = false;

            Microsoft.Office.Interop.Excel.Workbook workBook = app.Workbooks.Add(objMissing);
            Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Worksheets[1];
            //以下3个对象在前面定义,为了能在异常中可以释放
            Microsoft.Office.Interop.Excel.Range ranges = null;
            Microsoft.Office.Interop.Excel.Range range = null;
            Microsoft.Office.Interop.Excel.Range head = null;
            try
            {
                for (int i = 0; i < gridView.Columns.Count; i++)
                {
                    //Microsoft.Office.Interop.Excel.Range head = (Microsoft.Office.Interop.Excel.Range)workSheet.Cells[1, i + 1];
                    head = (Microsoft.Office.Interop.Excel.Range)workSheet.Cells[1, i + 1];
                    head.Value2 = gridView.Columns[i].HeaderText;
                    head = null;
                }
                //A2用于指定起始行的位置
                //Microsoft.Office.Interop.Excel.Range range = workSheet.get_Range("A2", objMissing);
                range = workSheet.get_Range("A2", objMissing);
                int rows = gridView.Rows.Count, cols = gridView.Columns.Count;
                //Microsoft.Office.Interop.Excel.Range ranges = range.get_Resize(rows, cols);
                ranges = range.get_Resize(rows, cols);
                object[,] datas = new object[rows, cols];

                for (int i = 0; i < rows; i++)
                {
                    for (int j = 0; j < cols; j++)
                    {
                        DataGridViewCell cell = gridView[j, i];

                        if (typeof(string) == cell.ValueType)
                        {
                            datas[i, j] = string.Format("'{0}", cell.FormattedValue);
                        }
                        else
                        {
                            datas[i, j] = cell.FormattedValue.ToString();
                        }
                    }
                }
                ranges.Value2 = datas;
                workBook.SaveAs(path, objMissing, objMissing, objMissing, objMissing, objMissing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, objMissing,
                                objMissing, objMissing, objMissing, objMissing);
            }
            catch (Exception ex)
            {
                throw (ex);
            }
            finally
            {
                workBook.Close(false, objMissing, objMissing);
                app.Quit();
                range = null;
                ranges = null;
                workBook = null;
                workSheet = null;
                app = null;
            }
        }

ps:此方法只是从网上找到的,地址已经不记得了。里面的注释什么的可能不一定对。但是整体方法肯定是可以的。

         这只是基于datagridview的导出,也没有sheet分页。如果想要其他的类型的,还要自己修改!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值