发展部件技术分享 http://blog.sciencenet.cn/u/求新 研究方向:数据库、MIS,教育部教指委计算机分委会专家工作组成员

博文

导入、导出部件技术研究

已有 7270 次阅读 2014-10-21 21:12 |个人分类:生活点滴|系统分类:论文交流|关键词:学者| 数据库, 软部件, 软件复用, 学士论文, 导入导出

                 导入、导出部件技术研究

                        湖北工业大学工程技术学院 王玉民

摘 要 近年来,随着电子计算机在全球范围内的普及,智能化的概念已经深入人心,并且智能化也逐渐发展、逐步实现。随着时间的推移,智能化的脚步现在已经走进了我们的生活,并且广泛的渗透到了各行各业中。并且随着智能化的全面普及。各种各样的信息管理系统如雨后春笋般得到迅速发展与应用。并且随着信息系统的普及化,我们掌握的数据量得到了爆炸性的增展,也逐步的迈入了大数据的时代。

在这样一个高度智能化,信息化的时代中,为了满足各行各业信息化的需求,开发各种各样的信息管理系统,计算机软件行业也得到了空前的发展。但是,由于信息系统的基本原理都是一样的,都是实现对数据库的增,删,改,查等基本操作以及一些扩展。在这种情况下,又面临信息系统这样的高需求量的增加,软件研发人员工作的重复率逐渐的增大。因为每个信息系统都是要实现相同的操作,使用相同的技术,只是操作数据的字段不同。这样就导致了社会资源极大的浪费,以及软件技术水平的停泄不前。通用部件系统应运而生。本文便是基于程学先教授的课题:基于部件的信息系统 的基础上,对导入导出部分部件的实现进行了深入的探讨。 关键词: 部件系统、导入部件、导出部件、office部件。【Abstrct】:In recent years, the popularity of computer on aglobal scale , the concept has gained intelligence , and intelligence isgradually developing , progressive realization . Over time , intelligentfootsteps now into our lives , and extensive penetration into all walks of life. And with the universal intelligence . A variety of information managementsystems have developed rapidly mushroomed and applications. And with thepopularity of information systems , the amount of data at our disposal to getthe explosive growth development , have gradually entered the era of big data .

In such a highlyintelligent , information age , in order to meet the needs of all sectors ofinformation technology , the development of a variety of information managementsystems, computer software industry has been an unprecedented development.However, because the basic principles of information systems are the same, areto achieve the database to add, delete , change, and other basic operations,and some extensions . In this case , they are also facing increased demand for suchhigh- information systems , software developers working repetition rate isgradually increased. Because each information system is to achieve the sameoperation using the same technology, but different operational data field. Thisled to an enormous waste of social resources , and software technical level notbefore stopping to vent . Common components of the system came into being. Thisarticle is based on Professor Cheng Xuexian topics : Based on the basiccomponents of the information system on the part of the import and exportcomponents to achieve in-depth discussion

 

Keywords: systemcomponents, import parts, exporting parts, office components.

目    录

第一章         绪论... 6

1.1引言... 6

1.2 研究背景及发展现状... 7

1.3 研究的意义... 8

1.4 研究的内容... 9

1.5 研究的难点... 9

第二章  相关技术及介绍... 9

2.1  软件复用技术介绍... 9

2.2  com组件技术介绍... 12

2.3  jacob技术介绍... 13

2.4  poi技术介绍... 14

2.5  itext技术介绍... 15

第三章部件系统设计... 16

3.1部件整体设计... 16

3.2 通信类部件设计... 17

3.1.1 导出部件设计... 18

3.1.2 导入部件设计... 19

3.1.3 通用部件设计... 20

3.3  部件关键技术介绍... 21

第四章  导入导出部件示例... 23

4.1 “覆盖式导出到Office文件”部件设计... 23

4.2 “覆盖式导出到word文件”技术... 24

4.3 “覆盖式导出到excel文件”技术... 26

4.4 “覆盖式导出到PDF文件”技术... 28

4.5   导入导出部件存在的问题... 32

4.6   为解决问题所进行的探究... 32

第五章  总结... 32

参考文献... 34

致  谢... 35

    1.绪论1.1 引言

近年来,随着电子计算机在全球范围内的普及,智能化的概念已经深入人心,并且智能化也逐渐发展、逐步实现。随着时间的推移,智能化的脚步现在已经走进了我们的生活,并且广泛的渗透到了各行各业中。各行各业的管理者对于手工从事信息管理已经感到无所适从,越来越多的管理者希望能够有简单、快捷、高效的计算机系统来取代现有手工的管理模式,实现管理的智能化。于是各行各业中,各种各样的信息管理系统如雨后春笋般得到迅速发展与应用。例如:企业管理信息系统,国家经济管理信息系统,事务管理信息系统,办公管理信息系统,专业管理信息系统。并且随着信息系统的普及化,我们掌握的数据量爆炸性的增展,已经逐步的迈入了大数据的时代。

在这样一个高度智能化,信息化的时代中,为了满足各行各业信息化的需求,开发各种各样的信息管理系统,计算机软件行业也得到了空前的发展。但是,使用者对系统开发周期的要求越来越短,对系统的兼容性、可扩展、可修改等的要求越来越高。系统开发目前采用的主流方法大都不能很好的满足企业迅速建立信息系统的要求。各种领域中不同语言、不同版本、不同需求的信息系统,以及各种不定时的扩展性软件需求,造成大量重复操作、重复劳动,使系统开发效率低下,导致了社会资源极大的浪费,软件技术水平停泄不前。

尽管各个信息系统千差万别,确有着共同的特征,因为实现的基本原理都是一样的,都是实现对数据库的增,删,改,查,数据处理等操作,实现的是大量数据的采集、加工、存储和传输。人们不断寻找一种能够简化操作、加快开发速度、提高开发效率的可行性方法。

2001年起,程学先教授对基于部件的信息系统开发这一课题发起研究。并于2003年在湖北省教育厅正式立项(2003A006,2004年湖北工业大学将之列入重大课题予以支持。2001-2008年基于VFPJAVA发表了大量MIS部件,这些部件有极强自适应性与即插即用特性,是直接用于构建最终管理信息系统的系统级模块,直接面向最终用户。本论文便是基于程学先教授的成果,对部件技术中导入、导出的功能进行深入的研究。

 

1.2 研究的历史背景

1968年的NATO软件工程会议上,Dough Mcilroy在其论文Mass Produce Software Components中提出软件复用的概念,希望以代码复用的方式实现软件开发的大规模生产。他设想软件构件可根据它们的通用性、性能、应用平台进行分类,使复杂的软件系统可以像硬件设计一样,通过标准的构件进行识别、组装,这也是类构件软件复用思想的雏形,虽然在以后的10年中,软件复用研究并未取得实质进展,但已经初步形成了软件复用的萌芽。

1979年,Lanergan发表论文,对其在Rayther Missice Divison中的一项软件复用项目进行总结,使得人们的焦点又重新回到软件复用这个概念上面来。Lanergan项目小组通过对大量COBOL源程序的分析,发现设计和代码中有60%的冗余,因此可标准化并被复用。在此后的几年里,其他软件工程师也通过研究发现商业、金融等系统的大部分逻辑结构和设计模式都属于编辑、维护、报表等类型的模块,可通过对这些模块重新设计和标准化而得到较高的复用率。这是软件复用的再发现期。

1983年,Hed BiggerstuffAAlan Petis在美国的NewPort组织了第一次有关软件复用的研讨会。随后在1984年和1987年,美国IEEE Transaction on Software EngineeringIEEE Software分别出版了有关软件复用的专辑。1991年,第一届软件复用国际研讨会(IWSR)在德国举行,之后在1993年又举行了第二次研讨会。在此期间,欧洲实施了几个有关软件复用的重点项目,如ESF(Eureka Software Factory),其主要目标是提供软件复用的工具0支持。标志着软件复用的发展期已经来临。

1994年的软件复用国际研讨会议改称软件复用国际会议,此时软件复用技术已引起了计算机科学界的广泛重视,越来越多的人投入到这一技术的研究中。面向对象技术的崛起给软件复用技术以新的希望,出现了类库、构件等新的复用方式,微软的ActiveX是其典型代表。软件复用研究重新成为热点,被视为解决软件危机、提高软件生产效率和质量的现实可行的途径。软件的构件化开发和软件复用已经成为互联网时代软件开发的大趋势。软件复用是解决“软件危机”的重要手段之一。

95年杨芙清院士在发表的《软件复用》中强调软件复用是“对已有软件的重点使用,该软件可能是已经存在的软件,也可能是专门设计的可复用构件”,提出生成技术和组装技术两类软件复用技术。99年又有论文《软件复用及构件技术》中提出应用系统中的三类成分:通用基本构件、领域共性构件、应用专用构件,指出“符合标准的零部件(构件)生产以及基于标准构件的产品生产(组装)是产业工程化、工业化的必由之路”。

曾具有代表性的成果是北大的青鸟工程,它把软件的生产过程划分为三类不同的生产车间,即应用构架生产车间、构件生产车间和基于构件、构架复用的应用集成(组装)车间,这些不同概念的车间负责不同的任务,实现软件的工业化生产。而软件开发人员被划分成三类:构件库管理者、构件生产者和构件复用者。这三种角色所需完成的任务也是不同的,构件生产者负责构件的生产、描述;构件库管理者负责构件分类以及构件库的管理工作;而构件复用者负责进行基于构件的软件开发,包括构件查询、构件理解、适应性修改、构件组装以及系统演化。像这样的案例还有很多,早些年上海构件库,现在已经有3000多个构件,其中还包含不少具有自主知识产权的领域构件等。

这些都不难得出,软件复用已经成为软件工程探索工业化生产的一个重要研究领域,特别是在这种软件业务需求变更日益复杂的今天,要想快速的开发软件,满足用户需求并且减少重复性的劳动,软件开发人员不得不努力地探索寻求一种基于新的方式的软件复用技术。

1.3 软部件技术发展状况

由于系统模块级软件复用产品对于提高开发效率,特别是具有自适应性的部件技术在减少系统维护工作量,降低软件系统维保费用,提高软件质量方面具有的优越性,不少公司与学者进行了大量的研究,已经有一些公司宣称自己的软件具有高度自适应性、可以自生成等优势,在软件市场上占据了优势地位。

例如:

金蝶公司的ERP系统,这个系统是南方地区比较出名的企业资源管理系统。金蝶公司有他们自己的一套体系,他们将很多常用的功能,单据、发票、信息的增删改查、不同系统,不同数据库的信息交互、人机交互界面等都进行了封装,集成到了ECLIPSE平台上,形成了金蝶公司独特的开发平台—bos开发平台。这个平台突出体现了软件复用的思想,但是有着很大的局限性,因为它仅仅实现在ERP业务中最常用的功能和模块的复用,在数据导入导出方面功能单一,局限于与EXCEL的数据互传。所有保留的表的字段和信息都只适用于企业。

神州数码公司在其一系列“智慧城市”项目中一再宣称其设计程序具有自适应性,易维护,但主要是在数据维护、查询与报表制作上,而且界面相对单一。

深圳纵横软件宣称其软件的特点: 一、用户完全自定义管理:包括报表、单据、公式,单据打印、货品图片、设置用户及权限、条码枪录入等。二、数据维护:包括强大的数据检索、数据统计、报表、图表、强大的数据存储、查询和汇总、灵活排序、数据备份、支持互联网,支持脱机开单,可绑定IP, 可实时定时访问、统计分析。三、软件维护:支持二次开发、有强大的再扩充性等。其软件收到业主广泛欢迎,但是,同样范围较狭窄,并未得到业界一致认同。

在用友深圳 T6企业管理软件 V6.1上市说明中宣称支持自适应,另外,支持从EXCEL导入单据,包括的单据有:采购订单、销售订单、发货单、采购入库单、材料出库单、销售出库单、生产订单、预测单、委外订单、盘点单、调拨单等。

但是就目前的现状来看,这些软件产品依然存在很大的局限性,由于没有统一的规范以及规约,实现软件复用所组成的功能模块各行其是,这些公司尽管在不同程度上实现了本行业的软件复用,显著提高了生产效率,降低了软件维护成本,但是应用一般都局限在该公司的业务范围内,社会人士、领域的精英参与进来的还甚少,缺少全行业内具有规范性与标准化的系统模块级的软件复用产品。

1.4 研究的意义

针对以上所述现状,研发一项可以跨专业,跨行业,跨领域的通用型的、可行性的软件系统是很有意义的。程学先教授提出基于部件的信息系统的研究成了大家关注的行之有效的方法之一。

软部件是经封装的、面向业务工作而不是简单单一功能的系统顶级模块;部件间不存在直接联系、不要求彼此间的协作、包括了全局性界面设计的内容、直接依据接口参数调用、不存在动态接口。通用软部件是可以通用于不同应用系统,能适应于不同数据库系统与不同数据表结构的软部件,在应用于现场时可以如同硬件生产一样即插即用或经简单裁剪后插入使用;它采用从上而下设计方法,是规范化、标准化的代码类软件。与构件和其他软件复用技术相比,软部件具有复用粒度更大、耦合性更低、灵活性更高的特点。长期以来,人们在软件工程过程及软件工程过程管理方面进行了深入的研究,在软件开发技术上不断取得进展;但相对而言,我们在软件生产社会化、软件生产分工方面的研究比较落后,使得有必要加大对通用部件的研究力度。

2001-2008出现了基于VFP的部件库最小系统,在一定程度上体现了上面的设计思想,但是,VFP是单机上的数据库,目前已经不受支持,停止升级,其基础上的部件库不具有商业应用价值。2005年,湖北工业大学“软部件技术研究”项目通过鉴定,宣称达到世界先进水平,其中主要是研制成功若干基于JAVA的部件,但是,其数量只有几个,特别是其中没有设计数据通信方面的部件。

本文研究的目的主要在于:

通过对当前软件复用技术现状的分析,进而对软件复用技术中存在的一些问题有更清楚的认识;

深入的分析和研究基于JAVA的导入导出等数据通信方面通用软部件,使软部件库功能更加齐全,更有应用价值。

这一研究具有理论意义和现实意义:

理论意义:全面研究软部件的设计思想和方法,使部件库更加全面,理论研究更加深入。

现实意义:数据通信是应用系统不可缺少的功能需求,全面提供各类管理信息系统在数据通信方面软部件可进一步满足应用系统自动生成的需要,使部件库更能满足各类应用系统构建的需要。

1.5 研究的内容

本课题首先对数据通信方面软部件需求进行分析,对其分类及功能和性能要求进行一般性分析,然后对数据通信方面软部件的设计进行详细的说明,重点对从office文件导入导出部件实现技术进行分析。
2.导入导出软部件总体设计

2.1 导入导出软部件应用环境

   为了深入导入导出技术的研究,我们需要对整个系统有个基本的了解。部件系统采用从上而下设计方法,是规范化、标准化的代码类软件。在JAVA中,软部件是一些类的集合。

软部件可以通用于不同应用系统,能适应于不同数据库系统与不同数据表结构,在应用于现场时可以如同硬件生产一样即插即用或经简单裁剪后插入使用。

主程序是应用系统入口,包括环境设置(数据库驱动、时间等设置)、安全性控制(调用系统登录程序)、显示封面、系统公共变量定义、调用系统菜单等内容。

利用部件库构建应用系统系统顶层设计图如图2.1所示。

         图2.1 系统逻辑结构图

利用部件库构建应用系统系统模块结构图如图2.2所示。

.

       图2.2 应用系统模块结构图

2.2导入导出软部件需求分析2.2.1实现数据导入导出的意义

应用系统之间、程序与应用系统之间常常要进行大量数据交互,这类交互一般以文件或数据表作为媒介。一个系统也常将数据转存到其他文件或数据表中。将当前数据表中内容转存到其他文件或表中称为导出;从文件或其他数据表中将数据转存到当前表中称为导入。

当前,随着计算机应用不断扩大,管理信息系统扩展需求极大,许多应用都要求进行数据整合,整合的首先要解决的问题是系统与系统之间必须实现数据通信。

2.2.2数据导入导出的种类

1、根据通信媒介划分导入导出种类

1)纯文本格式文件为媒介的导入导出

纯文本文件是所有程序、所有数据库都很容易地实现通信的媒介,C语言、JAVA语言、……,几乎所有语言都有涉及文件、数据流的类或方法或过程,它们都是采取纯文本格式文件保存数据;凡是可以操作数据库的语言,都有读、写文件的语句或功能,它们无一例外也都采用纯文本格式。但数据库、数据表中的数据在存入纯文本文件时采用的格式可选择不同的算法,从而可有多种格式,其中格式之一是规范格式,所有数据以记录为单位,每条记录等长且占据一行,行间用回车换行分隔。每条记录内,各字段数据根据存储长度等长存放。这是根据“关系”的特点形成的格式,是一种自然形式,也最容易实现。但存在问题:空间占用多,不同数据库(DBMS)格式可能不同,例如同样是整型,长度可能不同,另外,不同数据库设计时,同名或同意字段长度可能不同,例如姓名,不同设计的字段宽度可能为4,可能为8,也可能更多。由于格式不同,在数据通信时会出现麻烦。一个修正方案是采用紧缩格式,每条记录依然占据一行,字段间用逗号分隔,数字类型不加定位符,其他类型用双引号定位。既节省空间,又可适应于不同数据库不同DBMS和不同的表。在JAVA环境中应用正则变换的方式可以十分容易地区分不同的字段,字符类字段可以不加双引号定界符,可以算第3种方式。这23二种方式都不能适应包含有文本类型或字符串中包含有双引号的数据导入导出,因为,文本类型数据本身有回车、有双引号、其长度不定,上面各种形式都不行;后一种情况时,程序会将这些原数据包含的符号视为定界符而引发错误。虽然可以用还原符加以补充说明,但依然存在局限性。第4种方式考虑自定义分隔符与定界符,例如用二个双惊叹号或三个句号分隔,避开数据中有效存在的特殊符号,就不会有冲突了,称这种格式为自定义格式。

2)直接实现数据库之间通信的导入导出

可以设计直接将数据从一个数据库中读出再导入到另一个数据库中的程序,这是实现应用程序间数据交换以及数据整合的直接方式。

这类导入导出的设计关键在于不同驱动、不同JDBC、不同ODBC异构的问题。不同数据库管理系统间数据类型存在不同,包括数据类型的名字、表示方式不同与对应的问题,SQL Server拥有的数据类型和Oracle和其他数据库系统都不相同,数据直接通信必须能解决其差异问题,特别是,通用导入导出程序更要能自动识别不同数据库系统,实现数据类型和元数据其他差异的自动变换,才能正确实现直接通信。

3)借助Office文件的导入导出

目前人们大都离不开Office文件,在我国,许多文件都采用Word文件形式书写与存放,由于Excel文件有许多计算与打印报表的功能,人们习惯地利用它处理表格与报表数据。由于PDF文件采用非纯文本格式存放数据,具有保密防修改功能,因而成为公文常用格式,因此,从Office文件导入及导出到Office文件中需求旺盛。

4)从网页导入导出

在互联网飞快发展的今天,人们习惯地利用网络互传信息,因此,直接将数据传送到网上,以及从网上读取数据到当前表中也成为急需的形式。其中,又可分为借网页导入导出的形式及借邮件导入导出的形式。由于后一种方式要求有邮件服务器,我们暂未研究。

2、根据导入导出数据间关系划分的导入导出类型

1)覆盖式导入导出

导入导出如果是到数据表,目的表有的不存在,有的存在但要求用新内容全部替代原有内容,为此需要设计覆盖式导入导出方式。当目的表不存在时,应当先新建数据表,如果源为文件,需要另外给出数据表结构属性;如果源为数据表,导入导出数据结构必须与目的表结构相容,可以根据源表结构建立目的表。如果目的表存在,无论源数据性质,二者结构必须相容。导出可能到文本文件或网页,需要先删除原有数据再导入或导出。

2)添加式导入导出

导入导出如果是到数据表,有时要求保留目的表数据,新数据用insert语句添加到原数据尾。如果是导出到文件,要求保留原文件内容,再添加新数据。一般方法是读出原数据到数组或列表中,之后,连同新数据一起写入文件。

3)修改式导入导出

要求在导入导出数据时根据关键字值分析新导入数据的关键字值是否相同,如果相同则用新数据取代原数据,否则作为新数据添加。如果目的地是数据表,应当在分析关键字值后,用update语句修改表中数据或用insert语句录入新记录。如果是导出到文件,应当先读入原数据,在内存中完成修改或添加,最后全部以覆盖方式导出到文件中。

在实际设计导入导出部件时,应当根据12的组合设计部件,满足各方面需求。

2.2.3从Word文件导入的实验

如果涉及非纯文本文件的导入导出,这些文件都按一定格式组织与存放数据,借用JAVA语言编程实现导入导出,一般是先考虑以读文件或数据流或查询数据表方式将数据读入到数组或列表中,经处理后再以读文件或数据流或写数据表方式将数据写入文件或写入数据表中。其中读、写文件只限于纯文本格式,即读、写ASCII码形式。这种方法在操作费纯文本格式文件时存在困难。

例如,利用Office2003建立word文件,内容如下:

利用我们自编实验程序“读出文件的二进制码.jar”读出文件存储内容,操作情况如图2.3所示。

 

 

 

 

 

 

 

                                      2.3 97-2003word文件的操作

可发现其数据主要内容类似于纯文本文件,以ASCII码形式存放在000B00H开始的位置,以ODH分段,如图2.4所示。

             2.4 以所存ASCII码与文字对照表表现97-2003word文件结构

但,有一份1988WORD文档内容如

解读其数据存放格式如图2.5所示。

                  2.5 1988年一份word文件存储结构

可见也有类似于纯文本的一段,其存放地址从100H开始,以0D+0A分段。

以上数据存放时如果某一段中存在中文,则从该段某位置起,每个字符用二个字节数据表示并存放。因此在读取数据时要检查其中是否含有中文字符,如果有,要检查开始二字节存放一字符的位置。

至于Office2007Word文件(.docx文件)存放数据时未发现有类似于纯文本存放的情况。

由此可见,对于主要数据以纯文本格式存放的,只要测出其存放位置,就能实现数据导入,特别要主要版本变换可能要求修改程序。但是,由于文本中还包含大量涉及格式的数据,导出到这些文件中的程序设计十分困难。

目前一般借用这些文件原生产厂家提供的公共包(jar文件)实现数据导入导出程序设计。

2.2.4导入导出部件概要设计

目前从WordExcelPDF文件导入导出一般都需要借用微软提供的公共包(jar文件)实现数据导入导出程序设计。为减少部件总数量,根据是否需要外部包,可以将涉及数据库、设计纯文本文件包括XML文件的导入导出与从Office文件导入导出分成二组分别建立部件。

根据以上分析,本系统根据所需需求及各种导入导出方式组合,分成6大组。大组结构图如图3-6所示。

                     图2-8 导入导出部件6大组结构图

考虑到使用方便,每一大组按覆盖式、添加式与修改式分成3小组,共需要设计18个部件,每个部件可包括多个导入或导出目标,分别用按钮控制某一种导入导出的操作,建立系统时,通过选择按钮参数,使每一调用实现一个具体的导入导出操作。主要部件设计如下。

(1)覆盖式导出到纯文本文件、XML文件与其他数据表部件dataTransfer1.java

原目的文件内容删除,当前表数据导出到指定文件中,如果原文件不存在,生成新文件。生成的纯文本文件包括按标准格式存放、紧缩格式、自定义格式等不同格式组织。

(2)添加式导出到纯文本文件、其他数据表部件dataTransfer2.java

原目的文件内容保留,当前表数据添加到目的文件尾部。纯文本文件包括标准格式、紧缩格式、自定义格式等不同格式。

(3)修改式导出到纯文本文件、XML文件与其他数据表部件dataTransfer3.java

原目的文件内容保留,根据关键字用当前表数据修改目的文件数据。纯文本文件包括标准格式、紧缩格式、自定义格式等不同格式。

 (4)覆盖式导出到Office文件部件dataTransfer4.java

原目的文件内容删除,当前表数据导出到指定文件中,如果原文件不存在,生成新文件。Office文件包括excel文件、word文件与PDF文件。要求下载开源软件包:jacob.jar、poi-3.8-20120326.jar等。

 (5)添加式导出到Office文件部件dataTransfer5.java

原目的文件内容保留,当前表数据添加到目的文件尾部。Office文件包括excel文件与word文件。要求下载公共软件包。

 (6)修改式导出到Office文件部件dataTransfer6.java

原目的文件内容保留,根据关键字用当前表数据修改目的文件数据。Office文件包括excel文件与word文件。要求下载公共软件包。

 (7)覆盖式从纯文本文件、XML文件与其他数据表导入部件dataTransfer7.java

当前数据表数据删除,从文件中导入数据到当前表中,纯文本文件包括包括标准格式、紧缩2格式、自定义格式等不同格式。

 (8)添加式从纯文本文件、XML文件与其他数据表导入部件dataTransfer8.java

当前数据表数据保留,从文件中导入数据到当前表尾部。文本文件包括包括标准格式、紧缩格式、自定义格式等不同格式。

 (9)修改式从纯文本文件、XML文件与其他数据表导入部件dataTransfer9.java

当前数据表数据保留,从文件中导入数据到当前表中,根据关键字用当前表数据修改目的文件数据。文本文件包括包括标准格式、紧缩格式、自定义格式等不同格式。

 (10)覆盖式从Office文件导入部件dataTransfer10.java

当前数据表数据删除,从文件中导入数据到当前表中,Office文件包括excel文件与word文件。要求下载公共软件包。

 (11)添加式从Office文件导入部件dataTransfer11.java

当前数据表数据保留,从文件中导入数据到当前表尾部。Office文件包括excel文件与word文件。要求下载公共软件包。

 (12)修改式从Office文件导入部件dataTransfer12.java

当前数据表数据保留,从文件中导入数据到当前表中,根据关键字用当前表数据修改目的文件数据。Office文件包括excel文件与word文件。要求下载公共软件包。

(13)从网页下载并导入部件dataTransfer13.java

根据网页地址读取网页内容并导入到当前数据表中。

(14)导出生成邮件部件dataTransfer14.java

将当前表中数据组织生成邮件发送。

(15)通用导入部件dataTransfer15.java

该部件可以独立使用,也可以被数据维护部件、数据查询部件调用。将提问源文件类型、源文件名、导入方式,之后组织导入。

(16)通用导出部件dataTransfer16.java

可以该部件独立使用,也可以被数据维护部件、数据查询部件调用。将提问目的文件类型、目的文件名、导出方式,之后组织导入。

3.通信类部件详细设计

3.1以纯文本文件为媒介的导入导出部件设计

3.1.1与纯文本文件交互部件程序流程

根据前述要求,本系统目前设计了与纯文本文件交互三种方式的部件:规范格式、紧缩格式、自定义格式。

以覆盖式导出到纯文本文档为例说明:

1.标准格式导出

a)检查目的文件是否存在,如果不存在,创建文件。

b)按“条件表达式”筛选记录,按“输出要求”生成导出数据数组“String [][] 表格数据”,注意text等大数据类型不采用本格式导出。

c)将所有字段数据统一转换为字符串类型,放到“表格数据[][]”中。整型等非二进制数据按该类型数据最大宽度决定宽度。

d)创建文件输出流。

e)将数据按字段、按记录顺序写入文件。每条记录后加回车、换行。

f)关闭文件。

以标准格式覆盖式导出到纯文本文件的程序代码主要如下:

                if ((导出文件名==null)||(导出文件名.length()<1)) 导出文件名=导出文件名+"a1.txt";

                if (导出文件名.lastIndexOf("txt")<0) 导出文件名=导出文件名+".txt";

               File file = new File(导出文件名); // 创建文件对象

               if (!file.exists()) { // 如果该文件不存在

                   file.createNewFile(); // 新建文件

               }

                FileOutputStream fs = new  FileOutputStream(file);

// 创建文件输出流

               for (int j1=0;j1<记录条数;j1++){

                    for (int j2=0;j2<列数;j2++){

                     if (表格数据[j1][j2]==null) 表格数据[j1][j2]="";

                        fs.write((表格数据[j1][j2]+s3).substring(0,列数据宽度[j2]).getBytes());// 将字符串按预定宽度写入到文件中

                    }

                  fs.write((""+x1).getBytes());

               }

               fs.close();// 释放资源

2.紧缩格式导出

a)检查目的文件是否存在,如果不存在,创建文件。

b)按“条件表达式”筛选记录,按“输出要求”生成导出数据数组“String [][] 表格数据”,注意text等大数据类型不采用本格式导出。

c)将所有字段数据统一转换为字符串类型,放到“表格数据[][]”中。整型等非二进制数据按该类型数据最大宽度决定宽度。

d)将数组“表格数据[][]”中数字类型不加定位符,其他类型添加双引号分隔符。

e)创建文件输出流。

f)将数据按字段、按记录顺序写入文件。每条记录后加回车、换行。

g)关闭文件。

 

3.自定义格式导出

a)提问输入行开始符、字段间分隔符、行结尾符。

b)检查目的文件是否存在,如果不存在,创建文件。

c)按“条件表达式”筛选记录,按“输出要求”生成导出数据数组“String [][] 表格数据”,注意text等大数据类型不采用本格式导出。

d)将所有字段数据统一转换为字符串类型,放到“表格数据[][]”中。整型等非二进制数据按该类型数据最大宽度决定宽度。

e)将数组“表格数据[][]”中每一元素加上分隔符。

f)创建文件输出流。

g)将数据按字段、按记录顺序写入文件。每条记录后加回车、换行。

h)关闭文件。

 

3.1.2与纯文本文件交互的实现情况

     根据前述设计要求,已经成功地设计了覆盖式导出到纯文本文件、XML文件与其他数据表部件dataTransfer1.java;添加式导出到纯文本文件、其他数据表部件dataTransfer2.java;修改式导出到纯文本文件、XML文件与其他数据表部件dataTransfer3.java;覆盖式从纯文本文件、XML文件与其他数据表导入部件dataTransfer7.java;添加式从纯文本文件、XML文件与其他数据表导入部件dataTransfer8.java;修改式从纯文本文件、XML文件与其他数据表导入部件dataTransfer9.java。

 

3.2office文件的交互3.2.1office文件的交互要解决的问题

由于office是Microsoft 设计的软件,它是基于windows平台的,而java是基于JVM虚拟机的。这就造成了跨平台调用的困难。Java操作office必须通过调用COM组件来实现。

我首先试图用对一般文件读写的方法来处理Word文件的导入导出问题,经过试验,对文件进行读写的时候选用FileInputStream和FileOutputStream来实现比较可能。继而读取unicode编码,利用字符串类型的整形数组构造函数完完成从unicode码到中文字显示变换,从而实现java程序对word文件的读写。在使用流进行读写的时候,首先要做的就是数据与流的转换。对流添加一些分隔符或者过滤一些分隔符。然后再读入或者输出到文件中。

读取试验程序如下:

1. 创建文件对象

File file = newFile("E:\text\s1.doc");

    int lenght;

    int i=0,n=0,m1=0,m2=0;

    String str;

2. 创建FileInputStream类对象

     FileInputStream fis = new FileInputStream(file);  

3. 创建byte对象,unicode码共65535个码

     byte by[] = new byte[65535];

     int [] j=new int[1];

4. 循环读取文件中数据,并将unicode码变换为中文字显示

     while ((lenght = fis.read(by)) != -1) {

     }

     for(i=2560;i<3000;i++) {       //by.length

          if (by[i+1]==0)   //如果是非中文,高字节为0

         System.out.println("i="+i+"   "+(char)by[i]);

           else{             //读取中文,2字节一个中文字

                 m1=by[i+1];   //变换为整型

                 m2=by[i];

               if (m1<0) m1=m1+256;  //从补吗求原码

               if (m2<0) m2=m2+256;  //从补吗求原码

                   j[0]=m1*256+m2;

                 str = new String(j,0,1);

              System.out.println(""+lenght+"   "+str);

            }

             i++;//2字节一个字符

       }

但是由于每次读写都要进行大量数据的转换以及分隔符的拼接。非常容易造成读写的文件格式出现变化,造成数据的不一致导致错误。存在着很严重的问题。特别是,Word文件并不同于纯文本文件,如此读入的数据根本不是我们看到的内容,这才发现,Word文件有自己的格式。于是借用了数据库课程的实验程序“读出文件的二进制码.jar”,对Word文件中数据存放位置进行了寻求,发现,我们看到的数据(不考虑外观)或者说我们复制粘贴到纯文本文件中的数据,在Word文件中是存放在一起的,而且存放情况和粘贴到纯文本文件中的数据存放情况一致,Word文件中导致显示特征的格式数据采取其他方式存放,只是存放位置不是从100H单元开始的,和纯文本不相同。但是,只要确定存放纯文本的开始位置,导入将能很容易地实现。不过,分析了Word文件2000与Word文件2007,发现这个开始位置并不确定,与版本有关。

应用上述从Office97-2003版导入数据的程序,从0B00H处取数据,读取图2.3所示文件截图如图3.1所示。

                  3.1 2003word文件读入程序运行效果

但是,同样程序如果用于之前版本的Word文件,则读取失败,读取图2.5所示文件截图如图3.2所示。

 

3.2 同一程序从早期版本word文件读入数据失败

根据上述实验可以发现,以纯文本方式读写Office文件,破解将十分费力,而且一旦版本变化将要修改程序。

3.2.2office文件的交互的实现情况

为了解决上述问题,最终采用调用第三方技术jacob、poi、和itext实现与office软件交互部件设计。在使用部件时需要分别引入jacob.jar,poi.jar,itext.jar三个包。

这样实现后存在着弊端:因为部件是业务级的独立模块,通用软部件是一个应用程序的封装体,具有独立的功能与性能。它是以复用为目的而设计、以提供某一业务服务为目标、包含为完成一项业务工作所需要的多项功能的独立的应用程序,各功能互为补充使能从多方面满足不同用户对界面的需要。以上所谓的业务工作指站在数据库的角度进行实际事务处理的一项针对数据表操作的工作,例如数据录入、修改、查询、处理等工作,在具体应用于实际系统构建时可以由用户定义为某实际业务工作的名字,例如贷款、批准机构设置方案、认证、制定计划等等。由于它包含了为完成一件工作所需要的全部功能,具有特定性能集,接口简单、具有即插即用能力、对环境有较高适应性,具有很好的独立性。有些软部件具有自动生成界面的能力,是完整的,成熟的,模块级的程序软件。引入了第三方包以后不符合部件低耦合、高复用的特点,必须借助Microsoft发布的dll才能最终解决这一问题。详细设计见第四章。

 

3.3与数据库的交互3.3.1与数据库的交互的必要性

而随着现今社会智能化的普及,信息系统的数据量极速扩展,数据整合问题日益受到重视,要求将数据直接从一种数据库传送到另一种数据库或联机使用。目前,许多人还习惯的将数据导出到excel,再制作报表或做反方向的工作。但由于excel本身的限制,数据量过大时excel无法支持。需要分成好几个excel共同保存数据。显然,excel已经无法满足各个系统之间,数据库之间大数据量的交互。所以,本系统添加数据库到数据库之间的交互功能成为满足用户要求的关键内容。

3.3.2与数据库的交互要解决的问题

关键在不同驱动、不同JDBC、不同ODBC的问题,其次存在不同数据库,关于数据类型的异构性,包括数据类型的名字、表示方式不同与对应的问题。

驱动问题。

1.由于Java连接数据库的时候分为以下几步进行:

1)加载驱动

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

2)建立连接

Connectionconn=DriverManager.getConnection("jdbc:sqlserver://localhost:143

databaseName=shijiuban1","sa", "111");

3)创建Statement对象

Statement stmt =conn.createStatement();

Statementstmt2=conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_UPDATABLE);

4)执行操作(增删改查)

ResultSet rs =stmt.executeQuery("select * from stt");

5)处理结果

while(rs.next()){

    System.out.println(rs.getString("1"));

  }

6)关闭连接

   conn.close();

各个不同的数据库的驱动是不同的。所以当数据表到导出到一个未知的数据库的时候,由于数据库种类繁多,jdbc、odbc的不确定。就造成了连接数据库的困难。需要根据不同数据库申明不同驱动,从而达到各种数据库通用的目的。

2.数据类型异构性问题

由于各个数据库的基本数据类型略有区别。所有当不同数据库进行交互数据的时候。数据类型的对应关系会出现问题。例如:Oracle与Microsoft SQL Server的对照。

Oracle数据类型包括:CHAR、VARCHAR2和 LONG、RAW 和LONG RAW、NUMBER、ROWID、CURRVAL,NEXTVAL。

CHAR转化到SQLserver:建议使用 char。因为 char 类型的列使用固定的存储长度,所以,访问时比 varchar 列要快一些。

VARCHAR2和 LONG转化到SQLserver:varchar 或 text。(如果Oracle 列中数据值的长度为 8000 字节或更少,则使用varchar;否则,必须使用 text。)

RAW 和 LONG RAW转化到SQLserver: varbinary 或 image。(如果 Oracle 列中数据值的长度为 8000 字节或更少,则使用 varbinary;否则,必须使用 image。)

ROWID转化到SQLserver:使用identity 列类型。

CURRVAL, NEXTVAL转化到SQLserver:使用 identity 列类型以及 IDENTITY、IDENT_SEED() 和 IDENT_INCR() 函数。

所以不同数据库进行转换时,数据类型对应关系是个必须研究解决的问题。

3.3.3与数据库的交互的实现情况

1.为解决动态指定数据库,动态申请数据库驱动的问题,可以对传入的数据库类型进行判断,然后根据判断的结果,申请不同的数据库驱动。实现代码如下:

try {    

      if(DBMS名称1.compareTo("sqlserver")==0)

          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

      elseif (DBMS名称1.compareTo("oracle")==0)

      Class.forName("oracle.jdbc.driver.OracleDriver");       elseif (DBMS名称1.compareTo("Mysql")==0)

          Class.forName("com.mysql.jdbc.Driver");              

else if (DBMS名称1.compareTo("access")==0)

          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

      elseif (DBMS名称1.compareTo("JavaDB")==0)

          Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

      elseif (DBMS名称1.compareTo("DB2")==0)

          Class.forName("com.ibm.db2.jdbc.app.DB2Driver");

      elseif (DBMS名称1.compareTo("Sybase")==0)

          Class.forName("com.sybase.jdbc.SybDriver");

      elseif (DBMS名称1.compareTo("vfp")==0)

         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

       }

      catch(Exceptione)

      {

          JOptionPane.showMessageDialog(null, "接驱动程序错!");

      }

2.然后为解决不同的JDBC和ODBC来连接数据库的问题。代码如下:

try{

      if(DBMS名称1.compareTo("sqlserver")== 0)

      con= DriverManager.getConnection("jdbc:odbc:" +

ODBC数据源1);

      elseif (DBMS名称1.compareTo("oracle") == 0)

          {

url ="jdbc:oracle:thin:@localhost:1521:orcl3";

              String user = "system"; // 连接用户名

             Stringpassword = "aaa"; // 连接密码

             con=DriverManager.getConnection(url,user,password);

          }

else if (DBMS名称1.compareTo("Mysql")== 0)

          {

             url= "jdbc:mysql://localhost:3306/db_database22";

             Stringuser = "root"; // 定义连接数据库的用户名

             StringpassWord = "111"; // 定义连接数据库的密码

             con=DriverManager.getConnection(url,user,passWord);

          }

else if (DBMS名称1.compareTo("access")== 0)

con =DriverManager.getConnection("jdbc:odbc:" +

   ODBC数据源1);

      elseif (DBMS名称1.compareTo("JavaDB") == 0)

             {

                 Stringurl = "jdbc:derby:db_database22";                        con=DriverManager.getConnection(url+;create=true");

             }

else if (DBMS名称1.compareTo("DB2")== 0)

con =DriverManager.getConnection("jdbc:odbc:" +

ODBC数据源1);

       else if (DBMS名称1.compareTo("Sybase")==0)

con=DriverManager.getConnection("jdbc:odbc:"+ODBC

数据源1);

       else if (DBMS名称1.compareTo("vfp")==0)

           con=DriverManager.getConnection("jdbc:odbc:"+ODBC

数据源1);

           }

catch (SQLException e1)

      {

        JOptionPane.showMessageDialog( null,"连接数据库未成功!");

          returncon;

      }

3.建立不同dbms类型对照表:

String[][] 类型对照表={

       {"java"     ,"string","string","string"   ,"int"    ,"int"     ,"string","string" ,"string","string","boolean","byte"   ,"short"   ,"long"   ,"float"    ,"int"    ,"double","float"  ,"float" ,"byte[]"},

       {"sqlserver","char"  ,"nchar" ,"nvarchar","int"   ,"float"   ,"datetime" ,"datetime","text","ntext","bit"   ,"tinyint","smallint","bigint","numeric" ,"integer","double","money","real"  ,"image"},

       {"vfp"       ,"c"     ,"c"     ,"c"        ,"i"      ,"n"        ,"d"     ,"t"       ,"m"     ,"m"     ,"l"      ,"i"      ,"i"       ,"i"      ,"n"        ,"i"      ,"n"      ,"b"     ,"y"     ,"g"    },

       {"access"    ,"text"  ,"text"  ,"text"     ,"integer","integer"  ,"date"  ,"date"    ,"memo"  ,"memo" ,"logical","integer","integer","integer","float"   ,"integer","float" ,"float" ,"float" ,"general"},

       {"oracle"    ,"char"  ,"char"  ,"char"     ,"number","number"  ,"date" ,"date"    ,"long"  ,"long"  ,"char"   ,"raw"    ,"number"  ,"number" ,"number"   ,"number" ,"number","number","number","blob"},

       {"mysql"     ,"char"  ,"char"  ,"varchar"  ,"int"    ,"float"    ,"date"  ,"datetime","text"  ,"text" ,"tinyint","tinyint","smallint","bigint","float"   ,"integer","double" ,"float","float" ,"blob"}

   };

在进行导入导出时,只要知道双方DBMS名字,知道一方数据类型,就不难得知另一方数据类型的名字,如果需要新建对方数据表,就不难实现了。

4.统一规范为JAVA数据类型处理。上表已经建立了各数据库数据类型与JAVA语言数据类型的关系,JAVA类型简单,而我们的程序又都应用JAVA语言处理,因此统一转换成JAVA数据类型再进行通信也就顺理成章了。不过,为此,人们在设计数据库时也希望尽可能照顾这一点,不要用太复杂、变化太多的数据类型建库建表。在硬件生产工业化过程中,必须定义各种规范与标准,设计出许多标准件,在设计应用系统时,一般的系统都要适应这一情况,选用标准件时也承认了其中的规定与约定。软件生产工业化过程中也需要这样的规定。当然,特殊设计的软件系统可以设计专门的部件或异构件来满足需求。

导出到数据库程序流程

1)检查当前数据库中有无同名数据表,如果无该表,则按表格显示结构创建同名字新表。

2)如果有同名表,删除原记录

3)按“条件表达式”筛选记录,按“输出要求”生成导出数据数组“String [][] 表格数据”,注意text等大数据类型不采用本格式导出。

4)根据字段号表2确定目的表相应字段名表。

5)转录入程序,形成INSERT语句,逐一将记录添加到目的表尾部。

6)关闭有关连接。

4. office文件导入导出部件设计实现

导入导出部件中,数据与office文件的信息交互需要借助第三方jar包,这里就其中“覆盖式导出到office文件”部件进行详细介绍。

4.1 “覆盖式导出到Office文件”部件设计

1、功能

   将当前数据表中数据导出到excel文件、word文件、或pdf文件中,原文件如果存在,删除原文件。如果原文件不存在,将生成新文件之后将数据导出。

2、要求提供的参数

   表名parameter[4]

   字段号表parameter[8]

   按钮号表parameter[11]

   导出文件名parameter[18]

   文件名要求包括全部路径名称。

   要求字段号表:所操作数据可以是表的全部字段,也可以只涉及部分字段。如果选择全部字段,初始值设为"";否则写入所有将涉及的字段在表中的顺序号,号与号之间以英文逗号分隔。

3、本部件预设的按钮控件共4个,序号及按钮名:

1覆盖式导出到word文件

2覆盖式导出到excel文件

3覆盖式导出到PDF文件

4退出

   通过“按钮号表”可以选择按钮以满足功能需求。

   如果导出到PDF文件,不支持大数据类型,且每条记录总长度以50字符以下较合适。

   如果导出到WORD文件,文件名必须带路径全称,否则会存放到我的文档中。

4.2 “覆盖式导出到word文件技术

从数据表将数据导出到office文件可以借助第三方jacob、poi以及itext等技术。这三种技术各有优劣。

poi在某些细节有些小Bug并且不支持写入图片,对中文的支持不太完善;因为poi是直接分析excel文件格式进行操作的,最大的缺点是对excel的各种特性和格式不能全面支持,也总是不支持最新版的excel(总有一个研发滞后期)。

Jacob的方案使用的是com技术,对excel进行COM自动化调用,缺点是服务器端必须安装excel,而且web的并发访问经常会令自动化隐藏运行的excel进程死掉。unix等操作系统无法安装ms office。java2word也是只能在windows下运行,无法在linux、unix中使用。

而Itext在图片操作方面比其他两者更具优势。

这三种技术基本原理都是相通的。都是按照以下几步进行实现,这里用到jacob技术。本功能需要引入第三方jacob.jar。导出过程分以下几步进行:

1. 创建一个word对象"Word.Application"

ActiveXComponent word = newActiveXComponent("Word.Application");         Dispatchdocuments = word.getProperty("Documents").toDispatch();

   2. 创建新文挡,选定的范围或插入点,定义指针,并把插入点移动到文件首位置

Dispatchdoc = Dispatch.call(documents,"Add").toDispatch();

Dispatchselection = Dispatch.get(word,"Selection").toDispatch();              Dispatch.call(selection,"HomeKey");

3. 获取表格属性,获取表格行列属性

Dispatch tables = Dispatch.get(doc,"Tables").toDispatch();                       Dispatch range =Dispatch.get(selection, "Range").toDispatch();

4. 向表格中添加内容

   Dispatch newTable = Dispatch.call(tables,"Add", range,

              new Variant(记录条数), new Variant(列数)).

              toDispatch();                  

   for(inti=0;i<表格数据.length;i++){  

         for(intj=0;j<列数;j++){

            if (表格数据[i][j]==null)

                  表格数据[i][j]="";

Dispatchtable = Dispatch.call(tables, "Item",

   new Variant(1)) .toDispatch(); // 要填充的表格  

  Dispatchcell = Dispatch.call(table, "Cell",

      newVariant(i+1),new Variant(j+1)).toDispatch();          

Dispatch.call(cell,"Select");

       s1=""+表格数据[i][j];

5.将数据输出到word文件中,并保存退出。

   Dispatch.put(selection,"Text", s1);                                       }

   Dispatch.call((Dispatch)Dispatch.call(word, "WordBasic").getDispatch(),"FileSaveAs",导出文件名);    

                                             

4.3 “覆盖式导出到excel文件技术

   本功能使用了poi技术。需要调用第三方开源包poi.jar。实现功能按以下几步进行:

  1.定义工作薄对象

       HSSFWorkbook book = new HSSFWorkbook();

2.创建工作表

HSSFSheetsheet = book.createSheet("学生表");

  3. 获取关于 ResultSet对象中列的类型和属性信息的对象。

ResultSetMetaDatametaData = rs.getMetaData();

   int rowNum = 0;

4. 写入列名

   HSSFRow header = sheet.createRow(rowNum);

5. 获取数据库表中共有几列

       int colCount =metaData.getColumnCount();

6. 循环遍历数据表列名,根据数据库内容创建单元格,写入数据到指定单元格

       for(int i = 0; i < colCount; i++) {

       HSSFCell cell = header.createCell(i);  

cell.setCellValue(

new HSSFRichTextString(

metaData.getColumnLabel(i+ 1)));    

}

7. 循环遍历查询结果集,创建行,新建单元格并写入数据到指定单元格

   while (rs.next()) {

       rowNum++;

       HSSFRow row =sheet.createRow(rowNum);      

   for(int i = 0; i < colCount; i++) {

HSSFCellcell = row.createCell(i);          cell.setCellValue(new HSSFRichTextString(rs.getString(i + 1)));

       }

   }

 8. 创建FileOutputStream对象,写出到文件,并关闭文件。

     FileOutputStream fileO = new FileOutputStream(file);  

       book.write(fileO);

       fileO.close();

 

4.4 “覆盖式导出到PDF文件技术

   本功能使用了itext技术。需要调用第三方开源包itext.jar 。由于其中表格存放采取图形方式,难以区分字段内容,只能自定义格式进行通信。本系统,在导出数据时特别加设了表格线以区分不同字段的数据。涉及pdf的数据表间数据导入导出只能借助本系统PDF导入导出程序进行。实现功能按以下几步进行:

  1.定义document对象,设置默认字体格式。

     Document document = new Document();        PdfWriter.getInstance(document,

     newFileOutputStream(导出文件名));

      document.open();

BaseFontbfComic = BaseFont.createFont("c:\windows\fonts\SIMFANG.TTF",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

     Font font = new Font(bfComic, 9);

   2.向文档中添加顶部表格线。

     s1="┌";

     for (int j=0;j<列数;j++){

           for(int k=0;k<列数据宽度[j];k++)

            s1=s1+"─";

            if(j!=列数-1)s1=s1+"┬";

     }

    s1=s1+"┐";

    document.add(new Paragraph(s1, font));          // 向文档中添加顶部表格线

3.向文档中添加内容及中间竖线“丨”。

     Strings4="",s5="";

     float lengtg1=0;

       for (int i=0;i<记录条数;i++){

          s1="│";

      for (int j=0;j<表格数据[0].length;j++){

              s3="";

           if (表格数据[i][j]==null)

             表格数据[i][j]=" ";

           s4=表格数据[i][j];

            lengtg1=0;

           for (int j1=0;j1<表格数据[i][j].length();j1++){

              s5=s4.substring(j1,j1+1);

              s1=s1+s5;

           if (s5.compareTo("z")<0){

          if (s5.compareTo("0")<0)

              lengtg1=lengtg1+0.51f;

               else lengtg1=lengtg1+0.51f;  

               }

           else lengtg1=lengtg1+1;  //中文字个数

    }

    while (lengtg1<列数据宽度[j]) {

          s1=s1+" ";

          lengtg1=lengtg1+0.51f;

      }

        s1=s1+"│";

        lengtg1=0;

     }

   document.add(new Paragraph(s1, font));          

  4.向文档中添加下一行顶部表格线。

    if (i<记录条数-1){

       s1="├";

        for (int j=0;j<列数;j++){

         for (int k=0;k<列数据宽度[j];k++)

              s1=s1+"─";

         if (j!=列数-1) s1=s1+"┼";

        }

     s1=s1+"┤";

     document.add(new Paragraph(s1, font));                      

     }

   5.如果表格到达最后一行,向文档中添加底部表格线。

     s1="└";

     for(int j=0;j<列数;j++){

      for (int k=0;k<列数据宽度[j];k++)

           s1=s1+"─";

           if (j!=列数-1) s1=s1+"┴";

        }

      s1=s1+"┘";

       document.add(new Paragraph(s1, font));              

6.将拼接好的内容输出到创建的PDF文件中,保存关闭。

      System.err.println(de.getMessage());

      System.err.println(ioe.getMessage());

          document.close();

5、从网页导入数据程序实现

从任意网页导入数据分二步进行:1、根据地址读出网页源代码。2、分析网页内容,解析出有效数据并导入到当前数据表中。

第一部分代码主要为:

       url = new URL(地址);               // 创建URL对象

      conn =url.openConnection();            // 获得连接对象

       conn.connect();                  // 打开到url引用资源的通信链接

       InputStream is = conn.getInputStream();// 获取流对象

       InputStreamReader in = new InputStreamReader(is,"UTF-8");//转换字符流

      BufferedReader br = new BufferedReader(in); // 创建缓冲流对象

      String 一行数据= br.readLine()) ;  // 读取信息,解析网页

第二部分需要应用正则变换实现,正则表达式主要有"<[^>]+>",此外需要删去"</script"结尾的语句成分。程序主要部分如下:

      for (inti = 0; (一行数据 = br.readLine()) != null; i++){//读文件

          if ((k1==0)&&(一行数据.lastIndexOf("<script")>=0)&&

                              (一行数据.lastIndexOf("<\/script")<0) ) {

                 //首先清除无用的<script----</script 语句

                k2=0; k1=1; s5[k2]=一行数据; k2++;}

         elseif  (k1==1) {  //在出现<script之后

               if (一行数据.lastIndexOf("</script")>=0){//到尾

                     if (一行数据.lastIndexOf("name")>=0){ k3=1; }

                        k1=0; k2=0; k3=0; }

                      else {  s5[k2]=一行数据; k2++; }

                if (一行数据.lastIndexOf("name")>=0){

                     s4[c]=一行数据.replaceAll(x1+"name"+x1+":"+x1, "").replaceAll(x1+",", "");

                      c++; k3=1; }}

                else {s4[c]=一行数据; c++; }

                 网页内容0=网页内容0+一行数据;

       }

      s2="";

    for (int i = 0; i<c; i++){

            s1=s4[i]; s1=s1.replaceAll("<[^>]+>", "");//清除全部标记

            s1=s1.replaceAll("\|", "");//清除|

            s1=s1.replaceAll("\s{2}", "");//清除2个以上长度的空格

            if (s1.trim().length()>0){//清除空行

                s2=s2+s1+x2+x3; }

     }

 

   6、总结

   我记得,最早接触程老师部件系统的时候,是大三下学期的时候。那个时候的自己,正处于大学的迷茫期,感觉自己大学学了这么久,却还什么都不懂,大一大二整天宅在寝室玩游戏。虽然专业课的考试成绩都还过得去,但是感觉特别的空虚。

   这个时候正好遇到程老师在召集班上java课程成绩好点的同学参加部件的研发工作。当时特别想学点东西,仅仅是单纯的让自己学点知识,不再枯燥无味的整天沉迷在游戏中,让自己不再感觉那么的空虚,所以报名参加了这个工作。刚开始的时候,程老师让我先阅读了解老师自己写的一些代码,但是当我阅读的时候,我发现自己几乎看不懂那些代码,那个时候我甚至还不知道Jpanel、Jframe、Jbutton是做什么用的,根本不了解一个界面是如何进行设置、定义、绘画出来的。也不知道鼠标点击事件以及键盘事件是如何被监听触发的。那个时候突然感觉自己极度的匮乏,对知识的匮乏,于是那段时间由整天玩游戏,变成了整天宅在寝室看马士兵的java基础视频,看传智播客的教学视频。由于大学期间寝室整体睡觉都比较晚,都是12点左右才会睡觉。往常那个时间还在玩游戏,改成经常12点1点还在看视频。那样一直持续的看教学视频,有时候听的脑袋都有点模糊了。但是感觉每天躺倒床上睡觉的时候特别的充实。

   就这样过了一段时间,程老师有一天问我,进展如何,我回答说我这段时间在看基础的教学视频。程老师告诉我,不能单纯的只看视频来学习,最好的学习方式是先动手实践,在实践中遇到不懂的再去学习,这样学习效率才是最高的。于是,我停止了整天无脑的看视频。开始继续程老师交给的任务。尝试编写一个具有导入导出功能的模块。通过百度,查询了很多的资料,知道了poi,jacob,itext的作用,并且找到了几个试验程序,接下来开始自己动手慢慢试验,通过反复修改,试验。在几天后,成功的编写出了一个可以导出到word的小模块,并且得到了老师的肯定和表扬。

   当时候自己觉得非常的开心,感觉特别有成就感,对自己充满了信心。在接下来的日子里,我通过教学视频,以及书籍的方式,自学了jsp,servlet,SSH框架,ORACLE,设计模式等其他知识。在大四的时候找到份不错的工作。所以非常感谢程老师在我大学低谷的时候对我的教导,指引了我学习的方向。

 


 

参考文献

 

1. 数据库系统原理与应用                 ---程学先

2. JAVA 中基于 JACOB 的 COM组件调用研究       ---李瑞,李永刚

3.James Bond and Philosophy                 ---James South,Jacob M. Held

4. Jacob Mellis                     --- Agnes F Vandome , JohnMcBrewster

5. 让POI架起Java与Office之间的桥梁一  

6. COM 原理概述 [ J ]                       ---  冯正全

7.一种基于COM技术的BBS实现模型            ---  崔晓松,蒋波

8.COM技术及其程序设计 [ J ]                   ---张金波,孙海翠

 


致谢

在此毕业之际,我怀着感恩的心,向四年来陪伴我一起度过的老师和同学以及亲人们,致以最崇高的敬意和最真挚的谢意。

首先衷心地感谢我的导师_________________,对我循循善诱的教诲,指导我的学业与毕业设计。在课题的研究和论文的写作中,老师严谨的治学精神,丰富的学识,让我获益匪浅,一直激励着我奋进。还要感谢大学期间认真教导我的代课教师们。感谢你们教给了我专业的知识和做人的道理。

感谢我的家人,在这大学即将毕业,我也即将走向真正的独立的时刻,仍然给了我无尽的物质和精神上的帮助,没有你们的支持,我绝对没有办法顺利的完成这次毕业设计,乃至顺利的毕业,感谢你们。

     感谢我参考过的那些书籍的作者,正是由于你们的无私奉献,才构成了整个充满魅力的互联网,让我在其中方便的获取所需的知识,来完成这次毕业设计和充实我的身心。




文献综述:


导入导出部件技术研究

 

前言

本课题是基于湖北省教育厅立项课题--基于部件的信息系统开发(2003A006)的基础上,对软部件数据通信功能方向进行深入研究。

对于数据交互的功能,社会上早有研究。而将数据交互功能应用于通用部件系统的,也有一些事例。最早于2001便出现了基于VFP的部件库最小系统。其中便包括一些数据交互的功能设计。但是,VFP是单机上的数据库,目前已经不受支持,停止升级,其基础上的部件库不具有商业应用价值。2005年,湖北工业大学“软部件技术研究”项目通过鉴定,宣称达到世界先进水平,其中主要是研制成功若干基于JAVA的部件,但是,其数量只有几个,特别是其中没有设计数据通信方面的部件。

本文便是通过查阅大量资料及文献,通过对当前软件复用技术现状的分析,进而对软件复用技术中存在的一些问题有更清楚的认识。深入的分析和研究基于JAVA的导入导出等数据通信方面通用软部件,使软部件库功能更加齐全,为所有的行业的通用部件研究提供一个事例。使通用部件系统能够得到更加广泛的应用,使其具有显著的商业价值。

 

 


 

研究方向及国内外研究背景

对比建筑业、汽车制造业、计算机硬件业等产业,其形成规模化效应的成功道路都是将生产可复用的标准化构件与基于可复用构件的系统组装相结合。软件产业规模化也必然基于软件复用。软件作为人类知识的固化,具有复杂的逻辑性、构造性,广泛的应用领域,以及持续的演化等特性,这使得软件复用技术较为复杂,但软件复用一直是软件工程的研究和追求目标之一。近年来随着面向对象技术的成熟、领域工程研究的深入,以及软件构件/构架技术(包括分布式对象技术,如CORBADCOMEJB等)的发展,软件复用已经具备了现实的技术基础。其中,软件构件/构架技术是实现软件复用的核心技术

本课题致力于研究构建技术--通用部件系统中信息交互模块,也就是传统的导入导出功能部件。根据分析,与系统的交互对象一般包括:数据库、纯文本文件、有格式的文本文件、网络资源等。而通用部件的研究,在国内和国外都早有先例。

 

在国外:

在1968年的NATO软件工程会议上,Dough Mcilroy在其论文Mass Produce SoftwareComponents中提出软件复用的概念,希望以代码复用的方式实现软件开发的大规模生产。他设想软件构件可根据它们的通用性、性能、应用平台进行分类,使复杂的软件系统可以像硬件设计一样,通过标准的构件进行识别、组装,这也是类构件软件复用思想的雏形,虽然在以后的10年中,软件复用研究并未取得实质进展,但已经初步形成了软件复用的萌芽。

到1979年,Lanergan发表论文,对其在Rayther Missice Divison中的一项软件复用项目进行总结,使得人们的焦点又重新回到软件复用这个概念上面来。Lanergan项目小组通过对大量COBOL源程序的分析,发现设计和代码中有60%的冗余,因此可标准化并被复用。在此后的几年里,其他软件工程师也通过研究发现商业、金融等系统的大部分逻辑结构和设计模式都属于编辑、维护、报表等类型的模块,可通过对这些模块重新设计和标准化而得到较高的复用率。这是软件复用的再发现期。

1983年,Hed BiggerstuffA和Alan Petis在美国的NewPort组织了第一次有关软件复用的研讨会。随后在1984年和1987年,美国IEEE Transaction on SoftwareEngineering和IEEE Software分别出版了有关软件复用的专辑。1991年,第一届软件复用国际研讨会(IWSR)在德国举行,之后在1993年又举行了第二次研讨会。在此期间,欧洲实施了几个有关软件复用的重点项目,如ESF(EurekaSoftware Factory),其主要目标是提供软件复用的工具支持。标志着软件复用的发展期已经来临。

1994年的软件复用国际研讨会议改称软件复用国际会议,此时软件复用技术已引起了计算机科学界的广泛重视,越来越多的人投入到这一技术的研究中。面向对象技术的崛起给软件复用技术以新的希望,出现了类库、构件等新的复用方式,微软的ActiveX是其典型代表。软件复用研究重新成为热点,被视为解决软件危机、提高软件生产效率和质量的现实可行的途径。软件的构件化开发和软件复用已经成为互联网时代软件开发的大趋势。软件复用是解决“软件危机”的重要手段之一。

构建是软件复用的基础,据Gartner小组的一份报告推测,所有软件解决方案中将有70%是使用像预建的构建和模板这样的“积木”来建造的。因此,理解软件模型和规范是十分重要的。软件构建模型是解决构建之间的借口、实现互操作的理论基础。经过多年的发展,构件的模型及规范已给出,较有影响的有COM序列、COBRA和EJB。CORBA技术最早出现的,1991年OMG颁布了COBRA1.0标准;在其最早推出的时候,只提供了远程方法调用,在当时并不能被称为分布式对象计算,只是属于网络计算里的一种,接着推出的javabean,也还不足以和上述两大流派抗衡,目前的EJB,除了语言外还有构件的标准以及构建之间协同工作通讯的框架。于是,也就形成了目前的三大流派。

 

在国内:

IT软件等行业相对于国外起步比较晚。我们软件行业一直处于中下游水平,成为软件大国和软件强国是中国每一个IT工作者的梦想和奋斗的目标。

最早在“七五”、“八五”期间,中科院院士杨芙清教授便提出了大型软件开发环境的研究--青鸟工程。青鸟工程面向我国软件产业基础建设的需求,以实用的软件工程技术为依托,研究开发具有自主版权的软件工程环境,为软件产业提供基础设施—软件工具、平台和环境,建立工业化生产的基本手段,促进我国软件开发由手工作坊式转向用计算机辅助开发,以提高软件开发效率,改善软件产品质量。开创了国内可复用技术研究的先河。

“九五”期间,青鸟工程的任务是在前期攻关工作的基础上,为形成我国软件产业规模提供技术支持。重点是研究软件的工业化生产技术,开发软件工业化生产系统——青鸟软件生产线系统,即基于构件—构架模式的软件开发技术及系统,为软件开发提供整体解决方案,推行软件工业化生产模式,促进软件产业规模的形成。

1995年杨芙清院士在发表的《软件复用》中强调软件复用是“对已有软件的重点使用,该软件可能是已经存在的软件,也可能是专门设计的可复用构件”,提出生成技术和组装技术两类软件复用技术。

1999年又有论文《软件复用及构件技术》中提出应用系统中的三类成分:通用基本构件、领域共性构件、应用专用构件,指出“符合标准的零部件(构件)生产以及基于标准构件的产品生产(组装)是产业工程化、工业化的必由之路”。

2001年起,程学先教授对基于部件的信息系统开发这一课题发起研究。并于2003年在湖北省教育厅正式立项(2003A006),2004年湖北工业大学将之列入重大课题予以支持。

之后,国内的很多公司逐渐接受和认可了软件复用的思想。并在开发的工程中引用这种思想,逐渐形成了各个公司自己单独的软件复用体系。

 

存在的问题

虽然国内外目前针对可复用的研究已经有很多了。在软件生产中也很多地方用到了可复用的思想。但是在实际的开发过程中依然存在着很多的问题。例如:

金蝶公司的ERP系统,这个系统是南方地区比较出名的企业资源管理系统。金蝶公司有他们自己的一套体系,他们将很多常用的功能,单据、发票、信息的增删改查、不同系统,不同数据库的信息交互、人机交互界面等都进行了封装,集成到了ECLIPSE平台上,形成了金蝶公司独特的开发平台—bos开发平台。这个平台突出体现了软件复用的思想,但是有着很大的局限性,因为它仅仅实现在ERP业务中最常用的功能和模块的复用,在数据导入导出方面功能单一,局限于与EXCEL的数据互传。所有保留的表的字段和信息都只适用于企业。

神州数码公司在其一系列“智慧城市”项目中一再宣称其设计程序具有自适应性,易维护,但主要是在数据维护、查询与报表制作上,而且界面相对单一。

深圳纵横软件宣称其软件的特点: 一、用户完全自定义管理:包括报表、单据、公式,单据打印、货品图片、设置用户及权限、条码枪录入等。二、数据维护:包括强大的数据检索、数据统计、报表、图表、强大的数据存储、查询和汇总、灵活排序、数据备份、支持互联网,支持脱机开单,可绑定IP, 可实时定时访问、统计分析。三、软件维护:支持二次开发、有强大的再扩充性等。其软件收到业主广泛欢迎,但是,同样范围较狭窄,并未得到业界一致认同。

在用友深圳 T6企业管理软件 V6.1上市说明中宣称支持自适应,另外,支持从EXCEL导入单据,包括的单据有:采购订单、销售订单、发货单、采购入库单、材料出库单、销售出库单、生产订单、预测单、委外订单、盘点单、调拨单等

国外大型软件公司在所提供的集成开发环境中也隐含有软件复用技术,为开发者提供了使用方便、性能可靠的软件构建。例如,microsoft公司的系列可视化产品、ESRI公司的MapObject、Intergraph公司的GeoMedia等。

但是就目前的现状来看,这些软件产品依然存在很大的局限性,由于没有统一的规范以及规约,实现软件复用所组成的功能模块各行其是,这些公司尽管在不同程度上实现了本行业的软件复用,显著提高了生产效率,降低了软件维护成本,但是应用一般都局限在该公司的业务范围内,社会人士、领域的精英参与进来的还甚少,缺少全行业内具有规范性与标准化的系统模块级的软件复用产品。

 


参考文献

[1]               王晓芬,李莲治等.从源程序中获取可重用构建--对象和类[J].小型微型计算机系统,1998

[2]               高济,王进.基于Agents的软件合成框架ABFSC[J].计算机学报,1999

[3]               李晓东.基于DOM的web信息提取[J].计算机学报,1999

[4]               徐如志,钱乐秋等.基于XML的软件构建查询匹配算法研究[J].软件学报,2003

[5]               王渊峰,张涵等.基于刻画描述的构建检测[J].软件学报,2000

[6]               冯铁,张家晨等,基于框架和角色模型的软件体系结构规约[J].软件学报,2002

[7]               贾宇.基于领域特征空间的构建语义表示方法[J].软件学报,2002

[8]               Tullio Vardanega,Gert Caspersen,Jan Storbank Pedersen. A Case Study in theReuse of On-board Embedded Real-Time SoftWare [J]. Springer-Verlag Volume 1999

[9]               杨芙清.构件化软件设计与实现[M].清华大学出版社,2008

[10]           常继传.可复用软件构建的表示和检索[D].北京大学计算机科学技术系, 1998

[11]           [美]Alan W.Brown著,廖泰安 译.大规模基于构件的软件开发[M].机械工业出版社,2003

[12]           程学先.数据库原理与技术(第二版)[M].  湖北:中国水利出版社, 2009

[13]           李瑞,李永刚.JAVA 中基于 JACOB 的COM 组件调用研究[J].  微计算机信息,2007    

[14]           James South,JacobM. Held.James Bond and Philosophy[M].  TransitionVendor出版社, 2006          

[15]           Avik Sengupta.POI架起Java与Office之间的桥梁[EB/OL].  赛迪网

[16]                http://tech.ccidnet.com/art/3093/20050907/327715_2.html,2005

[17]           崔晓松,蒋波.一种基于COM技术的BBS实现模型[J].   微计算机信息,2002    

[18]           (美)埃克尔著,陈昊鹏 译. Java编程思想(第4版)[M].  机械工业出版社, 2007

[19]           刘峰,郑滔编著.应用集成原理与技术. 清华大学出版社,2011.06.

[20]           王映辉编著.软件构件与体系结构-原理、方法与技术.  机械工业出版社,2009

[21]           秦汝明主编,董建国主审.计算机辅助机械设计. 西安电子科技大学出版社,2005

[22]           黄国兴,耿红琴编.计算机导论教学指导与习题解答.  清华大学出版社,2011

[23]           Randy.COM/DCOM Unleashed [M].Macmillan computer Publishing, 2003

[24]           Dale Rogerson.INSIDE COM :Microsoft's Components Object Model with Cdrom[M].Microslft press, 1999

[25]           Richard C.Leinecker.COM + Unleashed[M].Sams/Macmillan/Pearson, 2001

[26]           David S.Platt.The Essence of COM [M].Prentice Hall/Pearson, 2001

[27]           LIN Ying-xian.Developent of Enterprise'sInformation System Based on J2EE Technology[M].Journal of Jimei UniversityNatural Science,2002

[28]           Kurt Gabrick,Dave Weiss.J2EE and XML Development[M].Manning Publications, 2003

 





https://m.sciencenet.cn/blog-2551-837519.html

上一篇:管理信息系统部件设计关键技术探讨----文献综述
下一篇:第六届蓝桥杯湖北省预赛成绩分析

0

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-18 19:44

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部