DataGridView控件中数据导出至Excel方案的优化与实现

2016-09-09 06:20吴吴双温州职业技术学院教务处浙江温州325035
温州职业技术学院学报 2016年2期
关键词:右键控件菜单

吴吴双(温州职业技术学院 教务处,浙江 温州 325035)

DataGridView控件中数据导出至Excel方案的优化与实现

吴吴双
(温州职业技术学院 教务处,浙江 温州 325035)

DataGridView控件是信息化系统广泛应用的数据显示控件,但并未提供与Excel文档的交互功能.针对多种交互方法进行分析,通过使用Excel组件和设置Range对象的属性,大大提高数据交互效率和稳定性;采用动态添加控制右键菜单方式,对交互完成后的Excel文件导出操作方式进行优化.测试结果表明,优化后控件的便捷性、移植性、美观度和易用性得到了很大提升.

计算机;DataGridView控件;Excel;信息化

0 引 言

随着计算机技术的迅猛发展,信息化系统已无处不在,大规模信息化系统的运行大多利用DataGridView控件展示数据信息,但原生DataGridView控件并未给用户提供将数据导出至Excel软件中进行二次处理的功能.这使得用户无法快捷地与Excel办公软件进行交互,大大影响了工作效率和用户体验.DataGridView控件中数据导出至Excel的常用方法大致有直接复制法、逐行写入法和系统剪切板整体写入法三种方法.这三种方法均存在各自缺陷.本文比较分析三种方法的优缺点,提出DataGridView控件中数据导出至Excel功能集成,动态添加控件右键菜单的优化方案,解决了与Excel文档的交互问题,提高了工作效率,改善了用户体验.

1 数据导出至Excel的三种方法

虽然微软提供的DataGridView控件可以方便地显示大量数据,但不支持与Excel文档的交互.将Data-GridView控件中数据导出至Excel的常用方法有直接复制法、逐行写入法、系统剪切板整体写入法.

1.1直接复制法

选中DataGridView控件中数据按CTRL+C键复制至系统剪切板中,再人工打开Excel软件,再按CTRL+V键将剪切板中数据复制至Excel.该方法虽然能将数据复制至Excel文档,但因字符集的不同,经常会出现乱码.

1.2逐行写入法

利用COM组件集中的Excel组件建立一个Excel对象,由系统自动对DataGridView控件中所有数据进行循环,逐行逐条将数据写入Sheet中.该方法只能逐行逐条写入数据,导致工作效率低下,并且只能导出DataGridView控件中所有数据,无法按用户要求导出特定区域数据,无法处理特殊字符和完成隐藏列的筛选,容易造成系统崩溃.

1.3系统剪切板整体写入法

用户可以将选定的内容或整体数据一次性填入Windows系统剪切板中,再在已创建的Sheet中发送一个CTRL+V键盘命令,将系统剪切板中的数据一次性粘贴至Sheet中.采用该方法,当系统发送键盘命令时,如用户改变系统焦点,可能造成导出失败.该方法存在的缺陷有:系统不能对Excel文档进行格式设置导致格式丢失;因Excel的表格特性将字符串前的0去掉,如原始数据为001,导出结果为1,造成数据错误.

2 方案的优化与实现

比较以上三种方法可知,系统剪切板整体写入法效率最高,出错率最小.针对系统剪切板整体写入法存在的缺陷提出优化方案.

2.1方案优化

2.1.1当在系统发送键盘命令时,用户对系统进行了其他操作,如改变系统焦点,这时可能造成导出失败,因而不采取模拟发送键盘的方法,而是采用Sheet.get_ Range("A1",System.Type.Missing)方法.该方法可以在粘贴数据前锁定数据表的第一个单元格,避免因用户操作丢失焦点而造成的导出失败.

2.1.2采用Sheet.get_Range()方法设置文本格式.如当导出至Excel时保留"001"样式,核心代码为:

range=xlBook.get_Range("A1","A+"+rowNum+"");

range.MergeCells=true;

range.NumberFormatLocal="@";

该设置可以格式化系统剪切板中内容的格式,因而可以解决无法复制格式的问题.

2.1.3将原始数据格式进行预处理,解决因Excel表格特性将字符串前的0去掉的问题和特殊格式及内容出现乱码的问题.其主要核心代码[1]为:

if(DataGrid.Columns[i].ValueType.ToString()== "System.String")

{range=xlSheet.get_Range(xlApp.Cells[1,colIndex], xlApp.Cells[rowCount+1,colIndex]); range.NumberFormat="@"; }

预处理还可以对输出文档进行格式设置,如表格边框类型、粗细及内容的对齐方式等.

2.1.4为进一步提高导出效率,采用将所有原始数据保存于二维数组中.在此基础上,将二维数组一次性交于Excel对象的range变量,再采用range.Value2方法同时写入所有数据.

2.1.5将列头、边框、字体、排列方式等属性进行设置,使导出的Excel文档更美观,同时大大减少后期对格式调整的工作量.

2.1.6为进一步提高用户体验,将功能集成至控件右键菜单将是一个很好的方法.

2.2功能实现

以Visual Studio为开发环境,选择C#编写为设计语言.DataGridView控件中数据导出至Excel方案优化流程如图1所示.

图1 DataGridView控件中数据导出至Excel方案优化流程

2.2.1添加系统引用.在VS中实现与Excel文档交互功能的有.net组件和.com组件,但实际应用中.com组件会涉及到许多问题,如权限方面的问题,因而一般引用.net组件.其添加方法如下:一是打开VS2010,在右侧的已安装模板中,选择Visual C#,右边会显示出各种项目类型,第一项就是Windows窗体应用程序.二是在默认状态下,系统会自动创建一个窗体程序,即主窗体程序,在右侧解决方案中点击新建好的窗体程序,选择引用点击右键,选择.net组件,在组件列表中选择Excel V11.0.0.0,点击添加组件[2].

2.2.2系统进程清理.在实现与Office文档交互功能时最容易出现的问题是,操作界面上已全部关闭Office文档,却在系统进程中残留Excel进程,这样将导致系统错误.因此,在打开Excel之前一定要进行一次进程清理.C#中使用"User32.dll"实现清理残留Office进程.在调用"User32.dll"时要使用DllImport实现调用.DllImport的命名空间是System.Runtime.InteropServices,是该命名空间下的一个属性类,Dll-Import提供从非托管DLL导出函数的必要调用信息.其添加方法[3]如下:双击打开窗体程序即可进入代码编辑模式,输入[DllImport("User32.dll",CharSet=Char-Set.Auto)]public static extern int GetWindow-ThreadProcessId(IntPtr hwnd, out int ID).在得到Excel进行ID时要特别注意一定要定义为静态方法,否则无法得到进程ID.

2.2.3对Excel 2003与Excel 2007不同版本进行兼容性及对隐藏行、列处理.

Excel 2003的最大行是65 536行,最大列数是256列;Excel 2007的最大行是1 048 576,最大列数是16 384列.对行、列进行处理的代码为:

if(DataGrid.Rows.Count > 65536 || DataGrid. ColumnCount>256)

{return false;}//判断数据表中数据量是否大于65 536行或大于256列

2.2.4创建Excel对象、Workbook、Sheet工作表及设置Range对象.

(1)利用引用的Excel V11.0.0.0组件创建Excel Application对象,表示Excel应用程序本身.Application对象引用方法如下:Microsoft.Office.Interop.Excel.Application ExcelApplication=new Microsoft.Office.Interop.Excel.Application();

(2)创建Workbook、Sheet表.Workbook对象表示Excel应用程序内的单个工作簿,同时Excel提供一个Sheets集合作为Workbook对象的属性.其核心代码[4]如下:ExcelobjWorkbook=ExcelobjExcel.Application. Workbooks.Open(ExcelFileName,miss,miss,miss,miss, miss,miss,miss,miss,miss,miss,miss,miss,miss, miss).

(3)设置Range对象.Range对象表示一个单元格、一行、一列,包含一个或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个Sheet表中的一组单元格.其方法如下:

Microsoft.Office.Interop.Excel.Range range;

(处理隐藏行)range.EntireRow.Hidden=true;

(设置内容对齐方式)RowAll.HorizontalAlignment=Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;

(设置文字大小)RowAll.Font.Size=8;

(设置边框样式)RowAll.Borders.LineStyle=Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;

(设置为表头加粗)range.Font.Bold=true.

2.2.5原始数据预处理.将原始数据格式进行预处理,主要是对数据格式,隐藏列、行进行处理,以及调整数据缓存并写入缓存,为下一步提高整体写入Exc el做好准备.其核心代码如下:

if(DataGrid.Columns[i].ValueType.ToString() =="System.String")

range.NumberFormat="@";

上下合并实现,如选择A1和A2两个单位格,合并,设值.其实现代码为:

range=wooksheet.get_Range(ExcelApp.Cells[1, 2],ExcelApp.Cells[1,3]);range.Merge(true);range. Value2="合并后需要显示的名称";

2.2.6写入Excel及Excel格式设置.该步骤是对已预处理好的数据一次性写入已创建的Excel表中,同时完成预设表的排版样式.其核心代码为:

range=xlSheet.get_Range(xlApp.Cells[1,1]//从表格第一行第一列开始,

xlApp.Cells[rowCount+1,colCount])//表格最后一行最后一列结束;

xlBook.Saved=true;xlBook.SaveCopyAs(fullFileName);ExportSuccess=true;}

(如保存成功返回ture,如有发现异常返回flash) catch{ExportSuccess=false;}

2.2.7Excel进程处理及释放资源.为提高程序的高效和简洁性,适时地进行释放资源是必要的,这也是优质程序的必备条件.采用查找P I D的方法对已使用的Excel进程进行清理,而不采用进程名的方法进行清理,这样可以有效避免用户误操作其他作业进程.其核心代码[5]为:

xlApp.Quit();GetWindowThreadProcessId(t,out id);

System.Diagnostics.Process p=System.Diagnostics. Process.GetProcessById(id);

p.Kill();

2.2.8右键快捷菜单集成.采用动态添加菜单的方式生成菜单,可以大大提升控件便捷性、移植性、美观度,使用户获得更好的体验.

(1)新建菜单方法.

private void AddContextMenu()

{//实例化右键菜单

this.BozhaiContextMenu=new ContextMenu-Strip();

this.输出到Excel文件ToolStripMenuItem=new ToolStripMenuItem();

this.输出到Excel文件ToolStripMenuItem.Name= "输出到Excel文件ToolStripMenuItem";}

(2)绑定Click事件.

this.输出到Excel文件ToolStripMenuItem.Click+= new EventHandler(this.OutputFileToExcel);

(3)建立输出到Excel文件的方法.

public void SaveAsFileToExcel(object sender, System.EventArgs e)

{if(this.ColumnCount==0||this.RowCount==0) {MessageBox.Show("没有可保存的数据!","系统提示", MessageBoxButtons.OK,MessageBoxIcon.Information); return;}

SaveFileDialog SF=new SaveFileDialog();

SF.Filter="Microsoft Excel电子文档(*.xls)|*. xls";

if(SF.ShowDialog()==DialogResult.OK)

{this.Cursor=Cursors.WaitCursor;

DataGridViewOperation.OutputOperate OO=new DataGridViewOperation.OutputOperate();

OO.OutputFileToExcel(this,SF.FileName, false); GC.Collect();

this.Cursor=Cursors.Default;}}

完成右键菜单绑定后,就可以用鼠标在控件上点击右键,在弹出的菜单中选择输出到Excel文件.在提示中选择要保存的路径后点击确定就能快捷地完成数据导出.DataGridView控件中数据导出至Excel优化方案运行界面如图2所示.

图2 DataGridView控件中数据导出至Excel优化方案运行界面

3 测 试

将DataGridView控件中数据导出至Excel的三种方法及其优化方案同时用于温州职业技术学院的人事管理系统、督导管理系统、资产管理系统,测试模块为在不通知情况下由全院教职工使用,经一学期实际应用后进行用户回访,共回访50人次.测试结果表明,导出至Excel的三种方法未经优化前好评率为10%,优化后好评率为88%.

4 结束语

对DataGridView控件中数据导出至Excel三种方法进行比较分析,吸取不同方法的优点,引入数据缓存的方法,提高了写入效率和减少差错率;为进一步提高控件的便捷性、移植性、美观度,动态添加控件右键菜单,大大提高了工作效率,改善了用户体验.

[1]CHRISTIAN N,EVJEN B,GLYNN J,等.C#高级编程(IX)[M].李铭,译.北京:清华大学出版社,2014:120-123.

[2]李立功,祖晓东.SQL Server 2008项目开发教程(I)[M].北京:电子工业出版社,2010:42-46.

[3]c#的dllimport使用方法[EB/OL].(2008-06-31)[2016-02-15].http://www.jb51.net/article/46384.htm.

[4]丁士锋,蔡平.ASP.NET项目开发指南[M].北京:清华大学出版社,2013:79-182.

[5]Microsoft.Office.Interop.Excel API应用(二)Workbook[EB/OL].(2012-06-01)[2016-02-15]. http://blog.csdn.net/yimeng_1985/article/details/7623638.

[责任编辑:王志梅]

Optimizing and Implementing the Method of Deriving Data to Excel in DataGridView Control

WU Shuang
(Teaching Affairs Department, Wenzhou Vocational & Technical College, Wenzhou, 325035, China)

DataGridView Control is a data display control widely used in information system, but it can't interact with Excel documents. Analysis has been done on various interactive methods. By using Excel components and fixing the property of Range object, data interactive efficiency and stability are greatly improved. In addition, dynamic addition is used to control right key menu in order to optimize the Excel document deriving process after interaction comes to an end. Testing findings demonstrate that the optimized control is greatly improved in terms of its convenience, portability, presentation, and being easy to use.

Computers; DataGridView control; Excel; Informationization

TP317

A

1671-4326(2016)02-0068-04

10.13669/j.cnki.33-1276/z.2016.042

2016-02-29

温州职业技术学院科研项目(WZY2015012)

吴双(1981-),男,浙江温州人,温州职业技术学院教务处,助理实验师.

猜你喜欢
右键控件菜单
基于.net的用户定义验证控件的应用分析
轻松整理Win10右键菜单
自定义“开始”右键控制菜单
中国新年菜单
关于.net控件数组的探讨
用右键菜单管理右键菜单
本月菜单
给Windows 10右键菜单做“手术”
一个“公海龟”的求偶菜单
基于嵌入式MINIGUI控件子类化技术的深入研究与应用