复杂表格显示(精选3篇)
复杂表格显示 篇1
0 引言
在开发基于报表的管理信息系统时, 用户可能会明确要求在窗体上显示他们自己设计的表格, 而这些表格中大多包含有样式非常复杂的表格。此时, 想利用C#中自带的表格控件实现需求几乎是不可能的。Excel是大众熟悉的电子表格处理软件, 其报表处理能力和数据表现能力都非常强大, 用其制作样式复杂的表格是一件非常简单的事情。如果能将Excel文件嵌入到C#语言开发的winform程序中, 就可以非常容易地解决在窗体上显示复杂表格的需求, 又能够实现让用户便捷地编辑数据和导出Excel文件等功能。
1 实现思路
虽然Excel可以制作样式复杂的表格, 但是软件系统的数据都被存放在数据库内, 因此必须编写代码将数据库文件内的数据输出到Excel文件内, 再将该Excel文件内容显示到窗体上就可以满足用户需求。具体实现思路如下:①按照用户设计的表格样式, 用Excel制作表格模板文件;②为了不破坏模板文件, 在使用文件之前, 通过代码复制模板文件, 以后的所有操作都在新文件上执行;③编写C#程序, 通过ADO.NET技术从数据库内提取数据, 向Excel文件的指定单元格输出数据并保存文件;④将Excel文件嵌入到窗体中, 供用户浏览修改, 并可以保存修改后的内容。
2 C#中控制Excel文件的方法
2.1 引用Excel类型库
在C#中控制Excel文件的前提是添加Excel的引用。根据计算机上安装的Excel软件版本的不同, 组件名称和类型库的版本也不一样, 此处Excel的版本为2003版本, 因此COM组件名称为Microsoft Excel 11.0 Object Library。引用Excel类型库的具体操作方法为:①在解决方案资源管理器中, 右击“引用”菜单项, 选择“添加引用”;②在“添加引用”对话框中, 选择“COM”选项卡, 并从列表框内选择Microsoft Excel 11.0 Object Library;③单击“确定”按钮, 关闭“添加引用”对话框。
2.2 编程控制Excel
引用Excel类型库后, 程序中就可以使用Excel相关的类和接口来控制Excel文件。常用到的Excel相关类和接口有Application (应用) 、Workbook (工作薄) 和Worksheet (工作表) 等。
2.2.1 逐单元格赋值输出
向样式复杂的Excel表格输出数据时, 由于单元格的合并拆分等原因, 加上需要向其赋值输出的单元格排列没有任何规律, 所以通常都会用到逐个单元格赋值输出的方法, 即在程序中一个一个定位单元格, 然后对其赋值输出。例如, 向Excel文件“temp.xls”的Sheet1工作表A1单元格输出“111”, B1单元格输出“222”的代码为:
2.2.2 使用ADO.NET直接向Excel输出
逐单元格赋值输出的方法只适用于少量数据传输, 如果传输的数据量非常大, 则会出现系统假死机现象。因此, 在向Excel输出大数据量, 且单元格排列也很规律的情况下可以利用ADO.NET技术直接访问Excel文件的方法输出数据。例如, 向Excel文件“temp.xls”的Sheet1工作表A2和B2单元格分别输出“张三”和“27”, A3和B3单元格分别输出“李四”和“30”的代码为:
//设置连接Excel文件的字符串, 并打开连接
在上面的代码中出现了“MyTable”、“name”和“age”等, 这些都需要提前在Excel文件中设置, 具体设置方法如下:
(1) 打开“temp.xls ”文件, 在Sheet1表的A1单元格中输入name, 在B1单元格中输入age。这一步是在设置列名。
(2) 先选中A1:B1, 然后选择“插入”|“名称”|“定义”菜单项。
(3) 在“定义名称”对话框中输入名称 MyTable, 然后单击“确定”按钮。这一步是在设置表名。
(4) 保存并退出“temp.xls ”文件。
至此, “temp.xls ”文件的设置已经全部设置好, 运行上面的程序后, 该文件Sheet1表中就会多出两行记录, 运行结果如图1所示。
2.3 使用WebBrowser显示、编辑和另存Excel文件
WebBrowser是C#中的一种浏览器控件, 它是Internet Explorer的一部分, 所以只能在安装了Internet Explorer的系统上使用。该控件最大的特点是, 在其内不仅可以显示网页内容, 也可以显示Word、Excel、PowerPoint和pdf等格式的文件内容。例如, 下面的代码将“temp.xls”文件内容显示到WebBrowser控件。
string str = Application.StartupPath + " temp.xls ";
webBrowser1.Navigate (str) ;
当Excel文件被嵌入到WebBrowser控件后, 就可以像在Excel软件内操作那样, 对其数据进行编辑更新。通过WebBrowser控件的ShowSaveAsDialog方法还可以另存嵌入其内的文件, 具体语句为:
webBrowser1.ShowSaveAsDialog () ;
3 结语
在基于C#语言的winform程序中, 使用WebBrowser控件将Excel嵌入到窗体内, 在同一个系统界面中实现复杂表格显示和控制的方法非常实用。但如果用户计算机内安装的是Office 2007, 则会影响Excel文件在WebBrowser中的嵌入显示。所以在针对Office 2007开发的应用程序, 笔者不建议使用本文的方法显示表格数据。
摘要:阐述了在C#winform程序中, 使用WebBrowser控件将Excel嵌入到窗体内, 以实现复杂表格显示和控制的具体方法。
关键词:Excel,C#,WebBrowser,复杂表格显示
参考文献
[1]如何使用Visual C#2005或Visual C#.NET向Excel工作簿传输数据[DB/OL].http://support.microsoft.com/kb/306023/zh-cn, 2006.
[2]如何使用WebBrowser控件在Visual C#2005或Visual C#.NET中打开Office文档[DB/OL].http://support.microsoft.com/kb/304662/zh-cn, 2007.
[3]斯琴巴图, 杨利润.零基础学Visual Basic[M].北京:机械工业出版社, 2008.
复杂表格显示 篇2
近来,笔者在开发应用程序过程中,也遇到了这样的问题,经过不断的研究和优化,终于找到了一种相对简单的操作方法,实现了数据库与电子表格本文档间的数据交换,本文以学生电子成绩表格为例,说明如何将学校教务处下发的电子成绩单中的信息保存在VFP数据表中,并将数据表中数据导出到电子表格文档中(见图1),希望对同行有所帮助。
1、基本算法
1.1 导入算法
数据库从电子表格文档中导入数据,大概分以下四步:
第一步:获取XLS文档的路径与名称字串;
第二步:在VFP中定义OLE对象,启动Excel软件,找到电子表格文档并打开;
第三步:在VFP中利用VBA操作工作簿、工作表和单元格,获取相应数据;
第四步:将数据导入到VFP数据表。
当有多个表格存在于工作表中时,可重复第三步与第四步,直到扫描完毕。
以上各步均需做大量的细致工作,做好信息的比较与判断,以适应复杂表格中数据提取的需要。
1.2 导出算法
数据库将数据导出到电子表格文档中,与导入过程大致相似,稍有不同,大致分以下四步:
第一步:获取预设的默认的XLS文档的路径与名称字串;
第二步:在VFP中定义OLE对象,启动Excel软件,找到默认电子表格文档并打开;
第三步:在VFP中利用VBA操作工作簿、工作表和单元格,将相应数据写入到电子表格文档中的指定单元格;
第四步:保存电子表格文档。
其中第四步,因具体名称可能存在具体差异,可以由人工完成。
2、VBA基础知识
V B A全称为Visual Basic Application,是Visual Basic的应用程序版本,是面向对象的程序语言[1],主要应用于自动执行的重复操作与“智能化”处理,还可以进行“第三方开发”。处理电子表格文档时要用于以下几个概念:
2.1 VB A对象:包括Application(Excel应用程序对象)与Work Books(Excel工作簿对象)。
2.2 所使用的方法:见表1。
2.3 所使用的属性:见表2
2.4 在VFP中执行VBA对象的方法,取得对象属性的数据,可以在其命令前加一个“.“。
3、算法实现
3.1 获取文档
F ilen ame=GETF ILE(“XLS”,”查找Excel电子成绩单”)
IF Len(AllTrim(filsname))>0
执行相关后续操作
ENDIF
3.2 定义对象与打开文档
oleapp=CREATEOBJECT("Excel.Application")&&定义Excel应用对象[2]
oleapp.application.visible=.f.&&设置Excel应用对象不可见
oleapp.application.workbooks.open(filename)&&打开指定XLS文档
3.3 选取并保存工作表单元格中的数据
WITH oleapp.application
.range(cellid1).select&&选取由变量cellid1指定的单元格
xuehao=.activecell.value&&由变量保存当前活动单元格的数据值
ENDWITH
注意,此处为执行VBA、指定OLE对象属性,应将相关命令放在WITH语句中。WITH语句提供了为单个对象指定多个属性的便捷途径。同样也可以在WITH...ENDWITH结构中执行方法[3]。
3.4 判断何时结束扫描
何时结束扫描,取决于被扫描单元格中的数据是否为空,当其值为.NULL.时,表明扫描结束,判断程序为:
IF VARTYPE(yy)='X'&&判断是否还有数据
执行相关操作
ENDIF
3.5 将获取的数据添加到数据表
有了变量保存的数据,将其追加到现有的目的数据表中,技术非常简单,只用下面代码即可实现。
INSERT INTO学生成绩(成绩代号,学号,姓名)VALUES(rr,xuehao,xingming)
3.6 将数据表中的数据写入Excel表格
此步实际上是3.3步的逆过程,只需将保存在数据表中的数据放到相应工作表单元格的value中。
.range(cellid).select&&cellid变量中保存着欲选取单元格的地址
.activecell.value=ALLTRIM(学号)&&将“学号”字段内容赋给当前单元格
在实际操作中,只需适当控制单元格地址与所要赋给的值,就能将指定的数据写入到Excel表中的指定位置,完成数据导出过程。
上述算法的实现,只是描述了简单的技术实现过程,远没有达到应用状态,在设计开发中还要考虑到个重复表格内容的电子表格文档的处理,就使应用变得更加复杂。另外,将数据添加到数据表时还要有视图的前期制作。
4、制作实例
以哈尔滨医科大学大庆校区的学生电子成绩单的导入模块为例,模块可以从一张工作表中提取1个以上班级的学生成绩单中的学号与姓名信息数据,但没有考虑到一个工作簿中更多工作表的这种状况,如果需要,请读者在此基础上自行考虑解决办法。在提取信息前,要提前设置课程及时间等项内容,然后选取要提取的电子表格文档,由模块自动完成信息提取工作,中间不需人工干预,导入数据完成后,会有相应信息显示,见图2。
表单上“导入”按钮的Click事件代码略。
数据导出过程与导入大致相同,这里不再讲述。
5、结束语
对于利用VFP导入Excel数据的文章以前也有过一些,但都不是很具体,不能真正的给出相对完整的代码以供读者使用,其设计思路也不尽相同。本文是在放弃Import导入命令的前提下,提出的一种相对简便易行的方法,实现了Excel复杂电子表格与数据库间数据的选择性交换。此方法主要针对特定单元格进行数据导入,但需要事先确定单元格位置,然后再进行数据交换。导入数据过程中要时刻判断是否已经读到没有数据的单元格,以确定是否继续下一单元格的数据提取。提取数据时,也可以使用进度尺控件表明当前进度,这样做需事先统计数据交换量,相当于遍历了两趟电子表格,效率上有点低。也可以让Excel软件OLE对象可见,以便用户能看到操作过程,了解进展状况。
总之,在实际设计过程中,可能会遇到各种问题,读者可以对上述技术进行灵活应用,以满足实际需要。
参考文献
[1]John Walkenbach.Excel2003高级VBA编程宝典[M].北京:电子工业出版社.2005
[2]陈宗兴.中文版Visual FoxPro完全OLE应用手册[M].北京:宇航出版社.1998
复杂表格显示 篇3
1. 引言
在电子政务和社会经济信息化高速发展的今天, 统计行业作为政府管理和决策以及向社会提供经济统计数据的信息服务部门正面临着信息化的新挑战。这种挑战主要表现在:虽然现在的各种调查统计和分析中, 计算机对数据的整理、分析和管理已基本得到实现。但这样的数据的处理和分析大部分是针对传统表格和一般的数理统计方法, 分析结果表现形式单一、不直观, 缺乏统一的框架对各专业统计数据进行有效的集成、整合、组织、管理及综合分析, 造成了统计数据的“条”“块”分割, 使各种统计指标缺乏可比性, 难以综合利用, 更加难以实现信息的数据挖掘[1]。
为了适应这种挑战, 需要改变以往信息处理方式, 建立社会经济统计地理信息系统。系统将已有的非空间统计信息系统与地理信息系统有机集成, 实现统计数据与空间地理信息的关联与匹配, 按地理空间的形式采集、组织和分析统计数据, 挖掘统计数据的空间内涵, 拓宽统计数据的应用范围。其中, 社会经济统计地理信息查询结果的多样式显示功能可以改变表格的显示样式, 克服了现在的一些软件只能显示原始数据的缺陷, 提高了用户对信息的分析、挖掘能力。
考虑到系统不仅以C/S结构在统计局内部使用, 也需以光盘的形式免费分发给用户, 论文采用开源组件Source Grid开发出Super Grid控件实现多样式显示功能。
2. 多样式显示功能分析
2.1. 数据格式
宏观经济数据是多样式显示功能的基础数据。就目前来看, 宏观经济主要的来源是统计报表、城市卡片和县卡片。另外, 基本单位汇总数据、人口普查汇总数据也是宏观经济数据的一部分。基本年鉴数据一般是报表数据经过处理后的结果, 年鉴数据在统计局的业务位置不是很重要, 但年鉴数据也是将来系统中可能需要处理的一部分, 应该也作为一种宏观经济的数据来源来考虑。
宏观经济数据的组织形式是多种多样的, 但透过复杂的数据组织结构, 它们也存在着共性, 就是每一个统计数据都可以通过空间、时间、指标来确定, 用数据库的语言描述就是可以分为地址码字段、时间字段、指标字段, 只要数据表中存在这几个字段, 就可以完整的描述统计数据。
系统的宏观经济数据存储在SQL Server 2005中, 表1为典型的宏观经济数据表结构, 其中的地址码与空间数据中的地址码 (DZM) 相对应, 实现空间数据与统计数据的统一[2]。查询后的宏观经济数据如2所示。
2.2. 功能需求分析
论文重点研究多地区、多年、多指标的宏观经济数据查询结果的多种表格方式显示, 具体有以下五种。
(1) 普通样式:原始表数据显示
(2) 地区分类样式:以地区为主, 显示各个时间的各种指标信息。
(3) 时间分类样式:以时间为主, 显示各个地区的各种指标信息。
(4) 指标分类样式:以各类指标为主, 显示各个地区、不同时间的信息。
(5) 时间-指标样式:以时间加各类指标为主, 显示各个地区的信息。
3. 详细功能设计
3.1. 界面设计
多样式表格显示模块需要以上述五种方式显示数据。其中, 普通样式可以直接显示, 不需要进行复杂处理。论文主要论述其他四种样式, 具体显示效果如图3所示。
如图1所示, 时间分类样式为跨时间 (年) 的多地区、多指标数据显示;地区分类样式为跨地区的多时间 (年) 、多指标数据显示;指标分类样式为跨指标的多地区、多时间 (年) 数据显示;时间_指标分类样式为时间+指标的多地区数据显示。
3.2. 核心组件设计
Visual Stdio.Net本身提供了一个数据绑定控件Data Grid[3][4][5]。可以直接将数据绑定到该控件中来显示所有数据, 这样就避免的使用for循环实现数据显示, 大大提高了程序的开发效率。总体上Data Grid控件是一个二维的数据网格, 用表格形式显示数据源数据, 并且支持选择、编辑、删除、分页显示和排序等功能。但是Data Grid控件只能显示单列数据, 样式简单。
Source Grid组件具有很强的重绘功能, 通过简单的命令, 如rowspan=2, 就可以实现跨行显示。系统基于开源组件Source Grid[6][7]开发出Super Grid控件, 如图2所示, 可以轻松实现各种表格的跨行、跨列显示。
该组件提供了四个数据多样式显示接口、一个数据处理接口和五个数据输出接口, 详细功能如下所示。
>Span State是实现跨地区显示的接口;
>Span Year是实现跨时间显示的接口;
>Span Indicator是实现跨指标显示的接口;
>Individual Query是实现时间指标样式的显示接口;
>Reduce Dumensionality是实现降维处理的接口;
>Expor HTML是实现HTML格式输出的接口;
>Expor Word是实现Word格式输出的接口;
>Expor Excell是实现Excel格式输出的接口;
>Expor XML是实现XML格式输出的接口;
>Out Put Table是实现表格输出的接口。
其中, Span State、Span Year、Span Indicator需要提供统一入口参数, 即原始表格信息, 表格格式为 (DZM、MC、YEAR、I1、……、In) 。实现时间-指标样式的显示效果, 需要首先对原始数据进行降维处理, 控件提供Reduce Dumensionality方法实现此功能。
4. 结论
宏观经济数据多时间、多地区、多指标的三维特征, 难以利用普通控件显示复杂样式。为了能够更加直观的反映数据, 满足用户对社会经济统计数据的深层次挖掘的需求, 论文利用开源组件Source Grid较好实现了4种复杂样式显示。同时, 由于Source Grid具有开源的特征, 基于Source Grid开发的控件Super Grid可以直接应用于社会经济统计地理信息光盘系统中, 开拓了统计信息的服务新领域。
参考文献
[1]杨宽宽, 宋雪清, 安凯.国家社会经济统计地理信息系统的设计与实现[J].地理信息世界, 2005, 8 (3) :32-34.
[2]张富, 张丽娟, 梁军, 张书亮.社会经济统计地理信息系统元数据库的设计及应用.测绘科学, 2007. (32) :1-3
[3]张康年, 柯善剑, 陈利文等.VC中利用DataGrid控件实现数据绑定.江西电力职业技术学院学报, 2012, 25 (2) :41-43.
[4]张建成.在ASP.NET中巧用DATAGRID控件[J].计算机与网络, 2010 (012) :68-72.
[5]杨梅, 魏恒义, 宫殿庆, 等.基于VC++.N ET的数据访问技术与实现[J].计算机技术, 2012, 22 (5) .
[6]http://sourcegrid.codeplex.com/.2012.7