【原创】[C#]WinForm中DataGrid扩展 - 快速导出Excel文件 (1)(续)

[C#]WinForm中DataGrid扩展 - 快速导出Excel文件 (1)(续)

经过对Excel深入了解,采用数据写入到range的方法,效率更高,更明显;与常用的逐单元格写有所不同,可查看[C#]WinForm中DataGrid扩展 - 导出Excel文件 (1)

本例的实现方式以[C#]WinForm中DataGrid扩展 - 导出Excel文件 (1)相似。

 1public bool ExportExcel(string p_ReportName)
 2        {
 3            if ( this.TableStyles.Count == 0 ) return false;
 4            DataGridTableStyle ts = this.TableStyles[0];
 5
 6            // 创建Excel对象                    --LeeWenjie    2006-11-29
 7            Excel.Application xlApp = new Excel.ApplicationClass();
 8            if ( xlApp == null )
 9            {
10                MessageBox.Show("Excel无法启动");
11                return false;
12            }

13            // 创建Excel工作薄
14            Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
15            Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];
16            
17            // 设置标题
18            Excel.Range range = xlSheet.get_Range(xlApp.Cells[1,1],xlApp.Cells[1,ts.GridColumnStyles.Count]);
19            range.MergeCells = true;
20            xlApp.ActiveCell.FormulaR1C1 = p_ReportName;
21            xlApp.ActiveCell.Font.Size = 20;
22            xlApp.ActiveCell.Font.Bold = true;
23            xlApp.ActiveCell.HorizontalAlignment = Excel.Constants.xlCenter;
24
25            // 列索引,行索引,总列数,总行数
26            int colIndex = 0;
27            int RowIndex = 0;
28            int colCount = ts.GridColumnStyles.Count;
29            int RowCount = this.BindingContext[this.DataSource,this.DataMember].Count;
30
31            // 创建缓存数据
32            object[,] objData = new object[RowCount + 1, colCount ];
33            // 获取列标题
34            foreach(DataGridColumnStyle cs in ts.GridColumnStyles)
35            {
36                objData[RowIndex,colIndex++= cs.HeaderText;    
37            }
            
38            // 获取数据
39            for(RowIndex =1;RowIndex< RowCount;RowIndex++)
40            {
41                for(colIndex=0;colIndex < colCount;colIndex++)
42                {
43                    objData[RowIndex,colIndex] = this[RowIndex-1,colIndex];
44                }

45                Application.DoEvents();
46            }

47            // 写入Excel
48            range = xlSheet.get_Range(xlApp.Cells[2,1],xlApp.Cells[RowCount,colCount]);            
49            range.Value2 = objData;
50
51            // 保存
52            try
53            {
54                xlBook.Saved  = true;
55                xlBook.SaveCopyAs("D:\\Fly" + DateTime.Now.ToString("yyyyMMdd"+ ".xls");
56            }

57            catch
58            {
59                MessageBox.Show("保存出错,请检查!");
60                return false;
61            }

62            finally
63            {
64                xlApp.Quit();
65                GC.Collect();
66            }

67            return true;
68        }

开发环境:
VS.Net 2003

改进后,效率提高N倍,8000条数据大约需要2秒。

 

**************************************
本系列相关文章,敬请关注
完整的DataGridEx原代码,正在整理中,有需要请留言)。
------------------------------------------------------
[C#]WinForm中DataGrid扩展 - 导出Excel文件 (1)
[C#]WinForm中DataGrid扩展 - 快速导出Excel文件 (1)(续)
[C#]WinForm中DataGrid扩展 - 列样式扩展(2)
[C#]WinForm中DataGrid扩展 - 自定义行颜色(3)
[C#]WinForm中DataGrid扩展 - 多列排序(4)
[C#]WinForm中DataGrid扩展 - 自动生成列样式(5)

posted on 2006-11-29 10:35  LeeWenjie  阅读(4703)  评论(22编辑  收藏  举报

导航