CN111027294B - 表格汇总的方法、装置及系统 - Google Patents
表格汇总的方法、装置及系统 Download PDFInfo
- Publication number
- CN111027294B CN111027294B CN201911273790.XA CN201911273790A CN111027294B CN 111027294 B CN111027294 B CN 111027294B CN 201911273790 A CN201911273790 A CN 201911273790A CN 111027294 B CN111027294 B CN 111027294B
- Authority
- CN
- China
- Prior art keywords
- cell
- column
- row
- cells
- cross
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种表格汇总的方法、装置及系统,该方法包括:获取放置于同一文件夹下的一个表格文档作为第一待检测表格;遍历第一待检测表格每个单元格的状态和参数,生成每个单元格对应的初始自定义类对象二维数组成员属性;分别逐行、逐列确定第一待检测表格中的合并单元格以及修正跨行数、修正跨列数,修正合并单元格对应的自定义类对象二维数组成员属性,生成第一待检测表格对应的目标自定义类对象二维数组;并生成目标表格;目标表格中的单元格设置为可选按钮单元格,且单元格标识对应第一待检测表格单元格的初始行号和初始列号。实现了多个表格之间信息的汇总,更加便捷得获取需要汇总的单元格信息,提高表格汇总的效率。
Description
技术领域
本发明涉及信息处理技术领域,尤其涉及一种表格汇总的方法、装置及系统。
背景技术
随着电子办公系统的广泛应用,数据表格以其强大的统计能力越来越多的应用于大量数据调查和统计处理过程中。
现有技术的数据表格可以包括Word类型、Excel类型。在进行大量数据表格批量汇总过程中,由于表格的用途、种类不一样,会不可避免的涉及各种表格,例如作“入职人员调查”的表格和作“产品市场调查”的表格,格式肯定不一样。即使是用途相同的表格,具体的表格结构也会存在不同。例如我们不能保证每个单位的“入职人员调查”表格格式一样,也不能保证同一单位不同人做的“入职人员调查”表格格式相同。有的表格可能存在合并单元格,有的表格不存在合并单元格。特别是Word表格,可能还存在某行单元格和其他行单元格不对齐的情况。在很多情况下,特别是在使用调查、采集类表格时,我们需要将这些表中的数据进行汇总分析。若将每个Word或者Excel的表格数据进行人为黏贴拷贝处理,耗时耗力,效率极低且错误率高。
即使采用现有的表格汇总的系统进行表格等数据汇总,由于无法检测表格中的合并单元格信息,也需要人工的参与且对人员要求较高,需在必要时协助表格汇总的系统的修改或者重新编写,导致增加批量处理的成本,批量处理的效率不佳。
发明内容
本发明提供一种表格汇总的方法、装置及系统,包括一种表格结构的分析方法,并依据这一方法提供相同结构的多文档表格数据汇总的方法、装置及系统,包括根据分析出的表格结构,自动生成可视化、交互式表格汇总界面。界面中可选按钮单元格的布局和待检测表格的单元格布局一致。用户通过点选可选按钮单元格选择需要汇总的表格内容,表格汇总的系统会将同一文件夹下,包含相同表格结构的文件内容,自动汇总到一个新的Excel类型电子表格中。在新的表格中将用户选择的单元格值均以独立单元格依次存放,汇总表格中每一行对应一个待检测表格的多个单元格数据。实现了多个文档中相同结构表格的批量数据汇总。可以更加便捷得获取需要汇总的单元格信息,提高表格汇总的效率,节约成本,避免人工操作的错误率,提高多表格间信息汇总的准确率。
第一方面,本发明实施例提供的一种表格汇总的方法,包括:
获取放置于同一文件夹下的一个表格文档作为第一待检测表格,其中所述同一文件夹下包括两个及以上相同结构的表格文档;
遍历所述第一待检测表格每个单元格对应的状态和参数,生成每个单元格对应的初始自定义类对象二维数组成员属性;
根据所述二维数组的成员属性,分别逐行、逐列确定所述第一待检测表格中的合并单元格以及修正跨行数、修正跨列数,并保存在自定义类对象二维数组中;
根据所述修正跨行数、修正跨列数,合并单元格对应的自定义类对象二维数组成员属性,按照合并单元格的报错规律,在数组中移动相应的位置进行保存,复原合并单元格结构,得到第一待检测表格对应的目标自定义类对象二维数组;
根据所述目标自定义类对象二维数组成员,生成目标表格;其中所述目标表格的结构和所述第一待检测表格的结构一致,且所述目标表格用于多个相同结构待检测表格之间的信息汇总;所述目标表格中的单元格设置为可选按钮单元格,并通过目标自定义类对象二维数组成员中的属性值命名单元格标识;所述单元格标识对应第一待检测表格单元格的初始行号和初始列号。
在一种可能的设计中,所述二维数组成员属性包括:初始行号、初始列号、跨行数、跨列数、是否被合并、单元格数据、单元格宽度、单元格高度、根据报错规律单元格是否可以获取、单元格是否为图片。
在一种可能的设计中,还包括:
获取第一待检测表格对应的总行数、总列数,并生成对应的初始自定义类对象二维数组,生成每个单元格对应的初始自定义类对象二维数组成员;
根据所述初始自定义类对象二维数组,得到第一待检测表格对应的目标自定义类对象二维数组,其中所述初始自定义类对象二维数组成员、所述目标自定义类对象二维数组成员与所述自定义类对象二维数组成员均具有所述单元格对应的成员属性。
在一种可能的设计中,逐行确定所述第一待检测表格中的合并单元格以及修正跨列数,包括:
获取第一待检测表格的第一行单元格的宽度之和,得到表宽;
逐行确定每行中可获取到的单元格数量是否等于表格总列数;
若相等,则将所述行中所有单元格的列宽,作为一行存入二维浮点型数组,作为参考列宽数组;每个单元格列宽对应二维浮点数组的一个成员;其中所述行中各个单元格的跨列数均为1,而且不需要进行修正;
若不相等,则确定所述第一待检测表格所述行中可获取到的每个单元格宽度与表宽比值;
将所述比值与第一待检测表格对应的总列数相乘获得跨列数初值;
对所述跨列数初值四舍五入取整后,得到每行对应单元格的跨列数,且跨列数初值在取整前包括整数部分和小数部分,小数部分用于确定修正跨列数;
根据所述参考列宽数组修正单元格跨列数,若所述单元格宽度等于在一行所述参考列宽数组中对应位置的至少一列成员的列宽值,则修正跨列数。
在一种可能的设计中,在得到每行对应单元格的跨列数之后,还包括:
根据所述跨列数初值的小数部分,计算跨列误差;
若所述跨列数初值大于1,且跨列数初值的小数部分小于0.5,则小数部分作为跨列误差一;
若所述跨列数初值大于1,且跨列数初值的小数部分大于等于0.5,则小数部分减1后,作为跨列误差二;所述跨列误差二还包括:若所述跨列数初值小于1,则减1后,作为跨列误差二;
将每行单元格对应的跨列误差一和跨列误差二相加,得到跨列误差总和;
根据所述跨列误差总和,进行修正处理;
若所述跨列误差总和大于等于1,则跨列误差总和向下取整作为循环次数,每次循环获取跨列误差一最大的单元格,并对所述单元格对应的跨列数加1;
若所述跨列误差总和小于等于-1,则跨列误差总和取绝对值后向下取整作为循环次数,每次循环获取所述跨列误差二最小的单元格,若所述单元格对应的跨列数大于1,则对所述单元格对应的跨列数减1;若所述单元格对应的跨列数等于1,则不进行操作,继续获取所述跨列误差二对应第二小的单元格对跨列数进行判断、操作,依此类推。
在一种可能的设计中,还包括:在第一待检测表格的每一行单元格循环完成之后,对整行每个单元格对应的修正跨列数进行求和得到第一总和;
若当前行可以获取到的单元格宽度之和等于表格宽度,则比较基准总列数为表格总列数;
若当前行中可以获取到的单元格宽度之和小于表格宽度,则比较基准总列数为表格总列数-1,即当前行中至少含有一个纵向合并单元格,并将所述第一总和与所述比较基准总列数进行校验;
若所述第一总和大于所述比较基准总列数,则对跨列数最大的单元格的跨列数减1,直到两者相等为止,得到对应的修正跨列数。
在一种可能的设计中,还包括:
在所述第一待检测表格的每一行单元格循环完成之后,对整行每个单元格使用所述参考列宽进行修正得到所述修正跨列数;
从当前行的第一个单元格开始依次进行判断,若所述单元格获取不到,且在所述行中当前单元格之前的单元格跨列数之和小于表格总列数,根据报错规则,说明是纵向合并单元格;
更改所述当前单元格对应的自定义类对象二维数组中成员属性值,表示是合并单元格;
按行由下向上逐行回溯单元格,列值为所述当前单元格所在行之前的单元格的跨列数之和加1,查找可以获取到的单元格,即在列方向的合并单元格第一个单元格;
若查找到所述合并单元格的第一个单元格,则将所述第一个单元格对应的自定义类对象二维数组中成员的跨行数进行修改加1,得到修正跨行数。
在一种可能的设计中,在确定所述单元格在列方向上被合并之后,获取所述合并单元格第一个单元格在行方向上的跨列数;若所述合并单元格第一个单元格行方向上跨列数大于1,则所述合并单元格在行方向和列方向上都存在合并,且所述合并单元格在行方向和列方向排序均为第一个单元格;根据所述跨列数修正当前单元格对应的自定义类对象二维数组中成员属性值。
在一种可能的设计中,还包括:若当前单元格可以获取到,根据所述当前单元格所在行之前的单元格的跨列数之和加1,得到当前单元格对应参考列宽数组中的对应成员位置;
当前单元格宽度与参考列宽数组中对应成员的列宽值进行比较,若找到参考列宽数组存在一行,且对应位置成员列宽值与单元格宽度相等,或者从对应位置开始,与之后连续成员列宽值之和与当前单元格宽度相等,则当前单元格跨列数修定为参考列宽数组中求和的成员数量;
若在参考列宽数组中找不到对应位置列宽值与单元格宽度相等的成员,则不进行修正,且当前单元格所在行后面的单元格也不使用参考列宽数组进行修正。
在一种可能的设计中,还包括:在第一待检测表格的每一行可获取的单元格循环完成之后,对当前行第一个单元格到最后一个可获取的单元格,包括获取到的和获取不到的单元格,对应的修正跨列数进行求和得到第二总和;并将所述第二总和与所述第一待检测表格的总列数进行校验;
若所述第二总和小于所述总列数,根据报错规律,说明当前行最后一个可获取的单元格之后至少存在一个纵向合并单元格;则从最后一个可获取的单元格之后的第一个单元格开始,按行向上回溯,列值为所述最后一个可获取的单元格与其之前的单元格跨列数之和加1,找到合并单元格第一个单元格,获得跨列数之后,修正当前单元格跨列数,将第二总和加上所述跨列数,继续与所述第一待检测表格的总列数进行校验,若相等则本行处理完毕;若仍小于,则说明当前单元格后面还有纵向合并单元格,继续进行校验,直到后面纵向合并单元格的跨列数两者相等为止,当前行处理完毕。
在一种可能的设计中,还包括:若所述第一待检测表格的行中存在修正跨列数大于1的单元格,则对所述行对应的自定义类对象二维数组中成员属性值进行修正;根据确定的跨列数以及所述跨列数对应单元格所在列,依次将所述行的自定义类对象二维数组中每个单元格对应的属性值,按对应的跨列数在行方向上进行相应的后移;其中后移的跨度为合并单元格第一个单元格跨列数-1;后移的成员数量为,表格总列数-合并单元格第一个单元格所在列数-合并单元格第一个单元格跨列数+1;所述第一待检测表格的行中最右侧单元格向左,有所述后移的成员数量的单元格,被移动过来的单元格覆盖;所述合并单元格第一个单元格在行方向上后续跨列数-1的单元格,更改对应的自定义类对象二维数组中成员属性值,表示是合并单元格。
在一种可能的设计中,根据所述目标自定义类对象二维数组成员,生成目标表格,包括:
根据所有单元格对应的目标自定义类对象二维数组成员生成目标表格,在表格汇总的系统界面生成与第一待检测表格结构一致的目标表格,其中目标表格中的单元格设置为可选按钮单元格,且通过使用目标自定义类对象二维数组中成员属性值,为所述每个可选按钮单元格生成对应的单元格标识,每个所述单元格标识对应第一待检测表格单元格的初始行号与初始列号。
在一种可能的设计中,在根据所述目标自定义类对象二维数组成员,生成目标表格之后,还包括:
根据选择指令,获取目标表格中的多个可选按钮单元格对应的单元格标识;
通过所述单元格标识,得到对应第一待检测表格的初始行号与初始列号;
通过所述初始行号和初始列号,得到第一待检测表格对应的单元格数据;
根据批量指令,将同一文件夹下的所有待检测表格,选取与第一待检测表格相同的初始行号与初始列号的单元格,且将所述单元格数据汇总至一个汇总表格;其中所述汇总表格中每一行对应一个待检测表格的多个单元格数据。
第二方面,本发明实施例提供的一种表格汇总的装置,包括:
获取模块,用于获取放置于同一文件夹下的一个表格文档作为第一待检测表格,其中所述同一文件夹下包括两个及以上相同结构的表格文档;
遍历模块,用于遍历所述第一待检测表格每个单元格对应的状态和参数,生成每个单元格对应的初始自定义类对象二维数组成员;
确定模块,用于根据所述二维数组成员属性,分别逐行、逐列确定所述第一待检测表格中的合并单元格以及修正跨行数、修正跨列数,并保存在自定义类对象二维数组中;
数组模块,用于根据所述修正跨行数、修正跨列数,合并单元格对应的自定义类对象二维数组成员属性,按照合并单元格的报错规律,在数组中移动相应的位置进行保存,复原合并单元格结构,得到第一待检测表格对应的目标自定义类对象二维数组;
生成模块,用于根据所述目标自定义类对象二维数组成员,生成目标表格;其中所述目标表格的结构和所述第一待检测表格的结构一致,且所述目标表格用于多个相同结构待检测表格之间的信息汇总;所述目标表格中的单元格设置为可选按钮单元格,并通过目标自定义类对象二维数组成员中的属性值命名单元格标识;所述单元格标识对应第一待检测表格单元格的初始行号和初始列号。
第三方面,本发明实施例提供的一种表格汇总的系统,包括:存储器和处理器,存储器中存储有所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行第一方面中任一项所述的表格汇总的方法。
第四方面,本发明实施例提供的一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行第一方面中任一项所述的表格汇总的方法。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1为本发明一典型应用场景图一;
图2为本发明一典型应用场景图二;
图3为本发明一典型应用场景图三;
图4为本发明一典型应用场景图四;
图5为本发明实施例一的待检测Word表格样例的示意图;
图6为本发明实施例一提供的表格汇总的方法的流程图;
图7为本发明实施例一提供的表格汇总的方法中部分方法的流程图;
图8为本发明实施例一生成的初始二维数组arrayTable中成员的Exist属性值的示意图;
图9为本发明实施例一生成的初始二维数组arrayTable中各成员的Width值的示意图;
图10为本发明实施例一提供的部分方法中初始二维数组arrayTable中成员变量的主要属性值的示意图;
图11为本发明实施例一提供的另一部分方法中目标二维数组arrayTable中成员变量的主要属性值的示意图;
图12为本发明实施例一生成的按钮控件的标识的示意图;
图13为本发明实施例一提供了从第一待检测表格,到程序主界面生成目标表格用户选择界面的和展示布局相关的主要数据转化过程的示意图;
图14为本发明实施例二提供的待检测Word表格样例的示意图;
图15为本发明实施例二提供的生成的初始二维数组arrayTable成员主要属性值的示意图;
图16为本发明实施例二提供的得到的目标arrayTable数组成员的主要属性值示意图;
图17为本发明实施例二提供的根据目标arrayTable数组,在主界面生成的目标表格示意图;
图18为本发明实施例二提供的目标表格的可选单元格标识示意图;
图19为本发明实施例三提供的待检测Excel表格样例的示意图;
图20为本发明实施例三提供的部分方法中获取的各单元格的Cells.MergeCells值和MergeArea.Address值的示意图;
图21为本发明实施例四提供的另一部分方法中解析Word表格可能存在的问题的示意图;
图22为本发明实施例五提供的表格汇总的方法中对比效果示意图;
图23为本发明实施例六提供的表格汇总的装置的结构示意图;
图24为本发明实施例七提供的表格汇总的系统的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例,能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
下面以具体地实施例对本发明的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本发明的实施例进行描述。
图1为本发明一典型应用场景图一,图2为本发明一典型应用场景图二,图3为本发明一典型应用场景图三,图4为本发明一典型应用场景图四。假设某单位人力资源员工,前期让每个新入职员工填报了一份Word类型表格《员工入职登记表》,如图1示出的左侧Word表格,将这些上报的文件放在了某一文件夹下,如图1示出的右侧。现在需要汇总一下每个人的姓名、年龄、联系方式、身份证号、毕业院校、所学专业、照片等。每个人的这些信息存放于一个Word类型表格中,传统方式下需要从文件夹中逐个打开文件进行手工黏贴拷贝。如果文档很多会耗时耗力,错误率高。在此场景下使用本发明编写的表格汇总的系统异常快捷。具体的,首先按图1所示,将包含待汇总的表格文档放到同一文件夹下,启动表格汇总的系统,表格汇总的系统启动后界面如图2所示。由于本次需要汇总的是Word表格,选择图2示出的“选择Word文件(直接推导算法)”。当然根据实际情况可以选择图2中前两个按钮中的一个。这两个按钮分别对应Word类表格和Excel类型表格两中的一种。假设本次选择第一个按钮“选择Word文件(直接推导算法)”。表格汇总的系统会弹出文件选择对话框,如图1示出的右侧。此时需要选择其中一个表格文档作为待检测表格。假设本次选择了李四的文档,表格汇总的系统会根据选择文档中的单元格,自动在表格汇总的系统界面生成具有相同布局表格结构的目标表格,其中目标表格的单元格设置为可选按钮单元格,且可选按钮单元格显示的单元格数据同待检测表格的单元格数据一致,参考图3。工作人员只需要在该目标表格中点选需要字段对应的可选按钮单元格,被选的可选按钮单元格会变成灰色,例如参考图3中所示例的灰色单元格,其中被选的可选按钮单元格也可以变成蓝色、粉色、红色等等,本发明不作具体限定。表格汇总的系统会将选择的单元格数据内容依次存放到一个新生成的Excel类型文档中,每个选择的单元格数据字段都按独立单元格存放。选择完成后,工作人员点击“批量处理”按钮,则表格汇总的系统将同一文件夹下所有表格文档中的相同单元格内容依次拷贝到新生成的Excel类型文档(即汇总表格)中,每个表格文档对应信息在汇总表格中占有行的位置,自动完成了数据的汇总如图4所示。后续若工作人员需调查其他事项,可以设计新的待检测表格格式,让员工提交后,按照上述方法从众多的员工登记表中获取所需的单元格数据来生成新的调查汇总表格。提高表格汇总的效率。
如果要汇总的是Excel表格,参考图2,只需要选择本发明表格汇总的系统的第三个按钮“选择Excel文件”进行选择,其他和Word表格文件处理一样。实施例主要以Word表格、Excle表格为例具体阐述自动识别表格格式,以便后续多表格之间信息的汇总,提高表格批量处理的效率。图5为本发明实施例一的待检测Word表格样例的示意图;图6为本发明实施例一提供的表格汇总的方法的流程图。同时参考图5、图6,如图6所示,本实施例的表格汇总的方法可以包括如下步骤S201、步骤S202、步骤S203、步骤S204和步骤S205。
S201、获取放置于同一文件夹下的一个表格文档作为第一待检测表格,其中同一文件夹下包括两个及以上相同结构的表格文档。
结合图1示出的实施例,本实施例中文件夹中放置多个《员工入职登记表》,且每个《员工入职登记表》的表格格式一致,其中包括合并单元格,现需汇总每个人的姓名、年龄、联系方式、身份证号、毕业院校、所学专业、照片等单元格数据信息,如图1所示,选择“李四”的表格文档作为第一待检测表格。
S202、遍历第一待检测表格每个单元格对应的状态和参数,生成每个单元格对应的初始自定义类对象二维数组成员属性。
具体的,待检测表格可以包括Word和Excel表格。在一种可选的实施例中,遍历第一待检测表格每个单元格对应的状态和参数,其中状态和参数包括:初始行号、初始列号、跨行数、跨列数、是否被合并、单元格数据、单元格宽度、单元格高度、根据报错规律单元格是否可以获取、单元格是否为图片。
本实施例中以Word表格为例,由于Word表格结构千差万别,可能包含有不确定的合并单元格,目前没有可以获得的公开的软件工具获取Word表格合并单元格范围。
在一种可选的实施例中,还包括:获取第一待检测表格对应的总行数、总列数,并生成对应的初始自定义类对象二维数组,生成每个单元格对应的初始自定义类对象二维数组成员;根据初始自定义类对象二维数组,推导得到第一待检测表格对应的目标自定义类对象二维数组。其中初始自定义类对象二维数组成员、目标自定义类对象二维数组成员与自定义类对象二维数组成员均具有和单元格状态和参数对应的成员属性。在一种可选的实施例中,二维数组成员属性包括:初始行号、初始列号、跨行数、跨列数、是否被合并、单元格数据、单元格宽度、单元格高度、根据报错规律单元格是否可以获取、单元格是否为图片。单元格状态和参数可以包括:根据报错规律单元格是否可以获取、单元格是否为图片,初始行号、初始列号、跨行数、跨列数、是否被合并、单元格数据、单元格宽度、单元格高度。
本实施例可以使用Microsoft.Office.Interop.Word的Content.Tables[1]对象获取待检测表格文档中的第一待检测表格,通过Content.Tables.Rows.Count;Content.Tables.Columns.Count属性分别获得第一待检测表格的总行数和总列数。使用Microsoft.Office.Interop.Word的使用Content.Tables[1].Cell(r,c)函数,可以获取到r行c列读取单元格信息。但在读取合并单元格时,无法获取到单元格具体信息,但会出现报错规律。报错会造成信息缺失,但也又一定规律。在所有合并情况下,合并单元格第一个单元格不会报错。如果是单行横向合并,被合并单元格(被合并单元格,为除第一个单元格外的其他合并单元格)报错位置统一被放到行的尾部;如果是单列纵向合并,第一行不受影响,其它行则在该对应位置单元格报错;如果是多行多列合并,则对第一行单元格的影响等同单行横向合并,其他被合并第一列的单元格报错,横向其它被合并的单元格报错信息统一放到行尾。由于Word合并单元格都是矩形的,同时Word单元格宽度可以读到。利用读取合并单元格对应位置时的报错信息和单元格宽度以及合并单元格是矩形的特点,进而可以推导出Word表格合并单元格信息和整体表结构。
本实施例中,为了分析表格结构,需获取表格中单元格对应的状态和参数,在一种可选的实施例中,自定义一个Cell类,并根据初始行号和初始列号生成了自定义类对象二维数组arrayTable,每个数组成员为Cell类的实例化对象,对应表格的一个单元格。还定义了一个image类型的二维数组,如果待检测表格单元格中存储的是图片,则将图片内容保存在对应的数组成员中。具体的,获取第一待检测表格对应的总行数、总列数,并生成对应的初始自定义类对象二维数组arrayTable,其中二维数组成员为Cell类对象,每个数组成员对应每个单元格。详细描述如下:
1.定义一个Cell类,其实例化对象对应表格中的单元格。Cell类包含10个属性,用来记录表格中单元格的状态和参数。有Value:记录表格文字(初始为空)、Width:记录列宽(初始为0)、Height:记录列高(初始为0,这个值在以后的表格汇总的系统中并未用到,因为得不到准确值,在表格汇总的系统界面复现表格结构时,所有独立单元格按统一行高显示)、Exist:根据报错规律,单元格是否可获取(初始为false。在后续处理时,合并单元格的第一个单元格为true,其它合并单元格为false。独立单元格为true)、Rowspan:跨行数(初始为1)、Colspan:跨列数(初始为1)、Iscombin是否为被合并单元格(初始为false,在后续处理时,合并单元格的第一个单元格为false,其它合并单元格为true。独立单元格为false)、Orig_row:对应最初行号(初始为0)、Orig_col:记录最初列号(初始为0),Image_Own:是否包含图片(初始为false)。
2.定义一个自定义类对象二维数组arrayTable,对应整个表格。数据成员为Cell类实例化对象。
3.定义了image类的二维数组对应每个单元格,如果单元格包含图片,存储在对应数组成员中。
4.Select_Cell类定义用户点击选择的单元格的行列号。
5.ArrayList类型的selected变量,记录用户选择的所有Select_Cell类记录。
6.定义float型二维数组baseColWidth,作为参考列宽数组,记录第一待检测表格中各列参考列宽。
为了和表格对应方便,数组行和列的下标从1开始取值,代表表格的第一行和第一列。
为了更好的理解,给出如下具体例子详细逐步分析。参考图5示出的Word表格样例,详细描述表格结构分析过程和对应二维数组arrayTable中成员变量值的变化。使用Microsoft.Office.Interop.Word的内置对象Content.Tables[1]对象获取第一待检测表格,通过Content.Tables.Rows.Count;Content.Tables.Columns.Count属性分别获得第一待检测表格的初始行数为3,初始列数为5。生成3*5的自定义Cell类对象二维数组arrayTable和image类的二维数组,每个数组成员和表格的单元格对应。由于image类的二维数组仅存储图片,不涉及逻辑推断,不做重点论述。主要论述arrayTable数组值的变化过程。
如前述合并单元格的报错规律,图5表格对应的二维数组arrayTable中成员的Exist属性值可以参考图8,图8为本发明实施例一生成的初始二维数组arrayTable中成员的Exist属性值的示意图;如图8示出,值为True表示可以用Content.Tables[1].Cell()函数获取到单元格信息,为False表示读取不到。
使用Content.Tables[1].Cell(r,c).Width属性,可以获取到r行c列单元格宽度,如图5中Word表格样例的每列宽度为85.2,表的宽度为426,则二维数组arrayTable中各成员的Width值如图9所示,图9为本发明实施例一生成的初始二维数组arrayTable中各成员的Width值的示意图。arrayTable数组成员属性中Width值,表示各单元格列宽。
使用Content.Tables[1].Cell(r,c).Range.Text属性,可以获取到r行c列信息的单元格的字符串;使用Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture和wdInlineShapeLinkedPicture属性可以判断单元格是否有图片,如果有,则将图片存储到image类型二维数组中,并将二维数组arrayTable中对应成员的Image_Own置为true。
S203、根据二维数组的成员属性值,分别逐行、逐列确定第一待检测表格中的合并单元格以及修正跨行数、修正跨列数,并保存在自定义类对象二维数组中。
S204、根据修正跨行数、修正跨列数,合并单元格对应的自定义类对象二维数组成员属性,按照合并单元格的报错规律,在数组中移动相应的位置进行保存,复原合并单元格结构,得到第一待检测表格对应的目标自定义类对象二维数组。
图7为本发明实施例一提供的表格汇总的方法中部分方法的流程图,如图7所示,本实施例中涉及的根据修正跨行数、修正跨列数,合并单元格的成员属性,按照合并单元格的报错规律,生成第一待检测表格对应的目标Cell类对象二维数组arrayTable。
具体的,S2031、获取第一待检测表格的第一行单元格的宽度之和,得到表宽;获取第一待检测表格每一行中可以获取到单元格的数量,若等于表格总列数,将每行中各单元格宽度以行的形式存入参考列宽数组;
S2032、逐行确定第一待检测表格中可获取到的单元格总数量是否等于表格总列数,若两者相等,直接确定每个单元格跨列数为一;若不相等,确定每个单元格宽度与表宽比值;
S2033、将比值与第一待检测表格对应的总列数相乘获得跨列数初值;
S2034、对跨列数初值四舍五入取整后,得到每行对应单元格的跨列数,且跨列数初值在取整前包括整数部分和小数部分,小数部分用于确定修正跨列数;
S2035、根据参考列宽数组修正单元格跨列数,若单元格宽度等于参考列宽数组中任意一行对应位置的一列或连续几列成员的列宽值,修正跨列数。
结合上述实施例生成arrayTable数组第一行Exist属性为true的各单元格数量为5,等于表格总列数;各单元宽度存入baseColWidth数组第一行,baseColWidth[1,1]至baseColWidth[1,5]均为85.2,arrayTable数组第二行Exist属性为true的各单元格数量为3,第三行为2,均不满足要求,不再存入baseColWidth数组。
再从第一行开始,arrayTable数组第一行Exist属性为true的各单元格数量为5,等于表格总列数;所以各单元格跨列数均为1,且不需要修正。
所以第一行5个单元格对应的arrayTable数组成员跨列数Colspan属性为1。
同样的,读取生成arrayTable数组第二行Exist属性为true的各单元格的宽度,分别与表的宽度相比,再乘以表的列数,得到跨列数初值。第二行第一个单元格值跨列数初值为85.2/426*5=1,第二个单元格跨列数初值为255.6/426*5=3。第三个单元格跨列数初值为85.2/426*5=1。第四个和第五格单元格,Exist属性为false,不予进行处理。
得到跨列数初值没有小数部分,不需要进行小数部分造成的误差修正。
第二行可获取到的三个单元格宽度为85.2+255.6+85.2=426,等于表格总宽度,所以比较基准总列数为表格总列数,三个单元格跨列数之和为1+3+1=5,等于表格的总列数,不需要修正。
在一种可选的实施例中,在得到每行对应单元格的跨列数之后,还包括:
根据跨列数初值的小数部分,计算跨列误差;
若跨列数初值大于1,且跨列数初值的小数部分小于0.5,则小数部分作为跨列误差一;
若跨列数初值大于1,且跨列初值的小数部分大于等于0.5,则小数部分减1后,作为跨列误差二;跨列误差二还包括:若跨列数初值小于1,则减1后,作为跨列误差二;
将每行单元格对应的跨列误差一和跨列误差二相加,得到跨列误差总和;
根据跨列误差总和,进行修正处理;
若跨列误差总和大于等于1,则跨列误差总和向下取整作为循环次数,每次循环获取跨列误差一最大的单元格,并对单元格对应的跨列数加1;
若跨列误差总和小于等于-1,则跨列误差总和取绝对值后向下取整作为循环次数,每次循环获取跨列误差二最小的单元格,若单元格对应的跨列数大于1,则对单元格对应的跨列数减1;若单元格对应的跨列数等于1,则不进行操作,继续获取跨列误差二对应第二小的单元格对跨列数进行操作,依此类推。在一种可选的实施例中,考虑到计算误差,实际计算时可以将比较阈值1换为略小于1的近似值,如0.99,和将比较阈值-1换为略大于-1的近似值,如-0.99。
再根据参考列宽数组baseColWidth进行修正,第二行第一个单元格arrayTable[2,1].Exist等于true,可以获取到,对应的参考列宽数组第一个成员baseColWidth[1,1]等于85.2,arrayTable[2,1].Width等于85.2,两者值相等,第二行第一个单元格跨列数arrayTable[2,1].Colspan修正为1。第二行第二个单元格arrayTable[2,2].Exist等于true,可以获取到。对应参考列宽数组成员列的位置为,第二行第一个单元格arrayTable[2,1].Colspan+1等于2,对应的参考列宽数组第二个成员baseColWidth[1,2],参考列宽值85.2,小于第二行第二个单元格列宽arrayTable[2,2].Width=255.6,所以参考列宽继续加上第三个成员baseColWidth[1,3]的参考列宽值85.2,等于170.4,仍然小于255.6;继续加上baseColWidth[1,4]的参考列宽值85.2等于255.6,两者相等;共加了baseColWidth数组中的[1,2]、[1,3]、[1,4]3个连续成员。所以arrayTable[2,2].Colspan修正为3。第二行第三个单元格arrayTable[2,3].Exist=true,可以获取到。arrayTable[2,1].Colspan加上arrayTable[2,2].Colspan再加1,等于5,对应的参考列宽数组第五个成员baseColWidth[1,5]值为85.2,arrayTable[2,3].Width=85.2,两者相等。arrayTable[2,3].Colspan跨列数修正为1。
第二行可获取到的三个单元格修正完毕,跨列数之和为1+3+1=5,等于表格的总列数,第二行处理完成。
所以第二行5个单元格对应的arrayTable数组成员跨列数Colspan属性为分别1、3、1、不予处理、不予处理。如图5所示,由于本行存在跨列的单元格,所以需要将被合并单元格对应的二维数组成员变量后移。因为根据报错规律,合并单元格第一行被合并单元格的报错位置统一被放到行的尾部,所以在进行数组成员变量值移动时,采用从表格最后列向前取数的方法移动。arrayTable数组成员需要移动的跨度为合并单元格跨列数减1,本例中需要移动的跨度为3-1=2;需要移动的数量为“表格总列数-合并单元格第一个单元格所在列数-合并单元格第一个单元格跨列数+1”,本例中需要移动的数量为“5-2-3+1”=1。即从第二行第五列,向前数两列,将第二行第三列对应的arrayTable数组成员变量属性值,复制到第二行第五列对应的变量中。然后将被合并的第二行第三列、第二行第四列单元格对应的arrayTable数组成员的Exist属性置为false,Iscombin属性置为true。
同样的,读取生成arrayTable数组第三行Exist属性为true的各单元格的宽度,分别与表的宽度相比,再乘以表的列数,得到跨列数初值。第三行第一个单元格跨列数初值为85.2/426*5=1,第二个单元格对应的Exist属性值为false,不予处理。第三个单元格跨列数初值为85.2/426*5=1。第四、五个单元格对应的Exist属性值为false,不予处理。
跨列数初值没有小数部分,不需要进行小数部分造成的误差修正。
第三行可获取到的两个单元格宽度为85.2+85.2=170.4,小于表格总宽度,所以比较基准总列数为表格总列数-1为4,两个单元格跨列数之和为1+1=2,小于比较基准总列数,不需要修正。
再根据参考列宽数组baseColWidth进行修正,第三行对应arrayTable数组成员Exist属性为true的单元格数量为2。第一个单元格arrayTable[3,1].Exist等于true,可以获取到,arrayTable[3,1].Width等于85.2,对应的参考列宽数组第一个成员baseColWidth[1,1],值为85.2,两者值相等,第三行第一个单元格跨列数arrayTable[3,1].Colspan修正为1。第三行第二个单元格arrayTable[3,2].Exist等于false,获取不到。此时第三行对应arrayTable数组成员Exist属性为true的单元格数量只处理完一个,根据报错规律,是纵向的合并单元格。将arrayTable[3,2].Iscombin属性置为true,arrayTable[3,2].Rowspan置为0。按行由下向上进行回溯,对应列值为第三行第一个单元格跨列数arrayTable[3,1].Colspan加1等于2。向上找到第二行第二列单元格对应得二维数组成员arrayTable[2,2].Exist属性为true,将跨行数arrayTable[2,2].Rowspan加1,置为2;获取跨列数arrayTable[2,2].Colspan为3,由于Word合并单元格都是矩形,所以在表格的第三行,也是应该跨3列的,修改第三行第二列跨列数arrayTable[3,2].Colspan置为3。第三行第三个单元格arrayTable[3,3].Exist=true,可以获取到,对应的参考列宽数组成员列值为,第三行第一单元格跨列数arrayTable[3,1].Colspan,加上第三行第二单元格跨列数arrayTable[3,2].Colspan,再加1,即1+3+1等于5。对应参考列宽数组中的第五个成员baseColWidth[1,5],值为85.2,等于第三行第三列列宽arrayTable[3,3].Width的85.2,第三行第三列单元格跨列数arrayTable[3,3].Colspan修正为1。
第三行可获取到的二个单元格修正完毕,从第三行第一个单元格到最后一个可获取到单元格的跨列数之和为1+3+1=5,等于表格的总列数,第三行处理完成。
所以第三行5个单元格对应的arrayTable数组成员跨列数Colspan属性为分别1、3、1、不予处理、不予处理第三行第二单元格虽然获取不到,但是已经判断出是纵向合并单元格,跨列值从上一行单元格arrayTable[2,2]得到为3,所以需要将被合并单元格对应的二维数组成员变量后移。arrayTable数组成员需要移动的跨度为合并单元格跨列数减1,本例中需要移动的跨度为3-1=2;需要移动的数量为“表格总列数-合并单元格第一个单元格所在列数-合并单元格第一个单元格跨列数+1”,本例中需要移动的数量为“5-2-3+1”=1。即从第三行第五列,向前数两列,将第三行第三列对应的arrayTable数组成员变量属性值,复制到第三行第五列对应的变量中。然后将被合并的第三行第三列、第三行第四列单元格对应的arrayTable数组成员的Exist属性置为false,Iscombin属性置为true,Colspan和Rowspan置为0。
为了更好的理解,参考图10,图10为本发明实施例一提供的部分方法中初始二维数组arrayTable中成员变量的主要属性值的示意图;图10列出了根据图5Word表格样例生成的初始二维数组arrayTable中成员变量的主要属性值,arrayTable数组成员属性中的初始值。参考图11,图11为本发明实施例一提供的另一部分方法中目标二维数组arrayTable中成员变量的主要属性值的示意图,且在图10初始二维数组arrayTable经过前述方法后,生成的目标二维数组arrayTable中成员变量的主要属性值的示意图;并将发生变化的成员变量主要属性值,用灰色标出。
在一种可选的实施例中,在得到每行对应单元格的跨列数之后,还包括:
根据跨列数初值的小数部分,计算跨列误差;
若跨列数初值大于1,且跨列数初值的小数部分小于0.5,则小数部分作为跨列误差一;
若跨列数初值大于1,且跨列数初值的小数部分大于等于0.5,则小数部分减1后,作为跨列误差二;跨列误差二还包括:若跨列数初值小于1,则减1后,作为跨列误差二;将每行单元格对应的跨列误差一和跨列误差二相加,得到跨列误差总和;
根据跨列误差总和,进行修正处理;
若跨列误差总和大于等于1,则跨列误差总和向下取整作为循环次数,每次循环获取跨列误差一最大的单元格,并对单元格对应的跨列数加1;
若跨列误差总和小于等于-1,则跨列误差总和取绝对值后向下取整作为循环次数,每次循环获取跨列误差二最小的单元格,若单元格对应的跨列数大于1,则对单元格对应的跨列数减1;若单元格对应的跨列数等于1,不进行操作,则继续获取跨列误差二对应第二小的单元格对跨列数进行判断、操作。
为便于更好的理解,图14为本发明实施例二提供的待检测Word表格样例的示意图,如图14给出了一个4行8列的,较为复杂的表格例子。参考图15,图15为本发明实施例二提供的生成的初始二维数组arrayTable成员主要属性值的示意图,如图15给出了获取表格单元格参数和状态的初始数值生成的arrayTable数组成员主要属性值。
其中,第一行单元格宽度分别为47.3、47.35、24.15 70.55、94.7、47.35、47.35、47.35,表格宽度为426.1。
arrayTable数组第一行Exist属性为true的各单元格数量为8,等于表格总列数;各单元宽度存入baseColWidth数组第一行,baseColWidth[1,1]至baseColWidth[1,8]分别为第一行各单元列宽,arrayTable数组第二行Exist属性为true的各单元格数量为4,第三行为2,第4行为7,均不满足要求,不再存入baseColWidth数组。
再开始读入第一行,arrayTable数组第一行Exist属性为true的各单元格数量为8,等于表格总列数,arrayTable数组成员跨列数Colspan均为1,且无需修正。
获得第二行单元格宽度为118.8、70.55、获取不到、47.35、94.7、获取不到、获取不到、获取不到。除以表宽乘以列数后,得各单元格跨列数初值2.230462333 1.324571697、0.888993194、1.777986388。
按四舍五入取整后的跨列数分别为2、1、获取不到、1、2、获取不到、获取不到、获取不到。各跨列数的跨列误差一为0.230462333
0.324571697,小数部分跨列误差二分别为-0.111006806、-0.222013612,将单元格对应的跨列误差一和跨列误差二相加,得到跨列误差总和为0.222013612,不大于1,不用修正。
第二行可获取到的四个单元格宽度为118.8+70.55+47.35+94.7=331.4,小于表格总宽度,所以比较基准总列数为表格总列数-1为7,四个单元格总得跨列数2+1+1+2等于6,小于比较基准总列数7,不需要修正。
再根据参考列宽数组baseColWidth进行修正,第二行第一个单元格arrayTable[2,1].Exist=true,可以获取到,对应的参考列宽数组第一个成员baseColWidth[1,1]=47.3,小于第二行第一个单元格的宽度arrayTable[2,1].Width=118.8,所以参考列宽继续加上数组中的第二个成员baseColWidth[1,2]的参考列宽值47.35,等于94.7,仍然小于118.8;继续加上baseColWidth[1,3]的参考列宽值24.15等于118.8。与arrayTable[2,1].Width相等;共加了baseColWidth数组中的[1,1]、[1,2]、[1,3]3个连续成员,所以第二行第一个单元格跨列数arrayTable[2,1].Colspan修正为3。
第二行第二个单元格arrayTable[2,2].Exist=true,可以获取到,arrayTable[2,2].Width=70.55,根据第二行第一个单元格arrayTable[2,1].Colspan=3,对应的baseColWidth数组成员的列位置为3+1等于4。获取baseColWidth[1,4]=70.55,两者相等arrayTable[2,2].Colspan修正为1。
第二行第三个单元格arrayTable[2,3].Exist=false,本行Exist属性的单元格为4且arrayTable[2,1].Colspan+arrayTable[2,2].Colspan小于表格总列数,所以第二行还没有处理完,根据报错规律第二行第三个单元格是纵向合并单元格,将arrayTable[2,3].Iscombin置为true,arrayTable[2,3].Rowspan置为0;按行由下向上回溯找合并单元格第一个单元格,对应列位置为arrayTable[2,1].Colspan+arrayTable[2,2].Colspan+1,即3+1+1等于5。获取到第一行第五列单元格arrayTable[1,5].Exist等于true,说明是合并单元格第一个单元格,将跨行数arrayTable[1,5].Rowspan+1置为2。继续获取arrayTable[1,5].Colspan等于1,说明是单列纵向合并单元格。第二行第三个单元格arrayTable[2,3].Colspan修正为1。
第二行第四个单元格arrayTable[2,4].Exist等于true,可以获取到。arrayTable[2,4].Width=47.35,对应参考列宽数组中列的位置为arrayTable[2,1].Colspan+arrayTable[2,2].Colspan+arrayTable[2,3].Colspan+1,即3+1+1+1等于6。对应baseColWidth[1,6]值为47.35,两者相等,arrayTable[2,4].Colspan修正为1。
第二行第五个单元格arrayTable[2,5].Exist等于true,可以获取到。arrayTable[2,5].Width=94.7,对应参考列宽数组中列的位置为arrayTable[2,1].Colspan+arrayTable[2,2].Colspan+arrayTable[2,3].Colspan+arrayTable[2,4].Colspan+1即3+1+1+1+1等于7。对应baseColWidth[1,7]值为47.35,小于第二行第五个单元格宽度,所以参考列宽继续加上数组中baseColWidth[1,8]的参考列宽值47.35等于94.7,等于第二行第五个单元格宽度,共加了baseColWidth[1,7]和[1,8]两个成员,所以arrayTable[2,5].Colspan修正为2。
到第二行第七个单元格,本行可获取到的4个单元格已经处理完成,且到第二行第1到第7个单元格Colspan值为3,1,1,1,2,和为8。与表格总列数相等。第二行处理完毕。
由于本行存在跨列的单元格,所以需要将被合并单元格对应的二维数组成员变量后移。
根据第二行第一个单元格得跨列数3,移动arrayTable对应的数组成员。移动跨度为3-1=2;移动数量为“表格总列数-合并单元格第一个单元格所在列数-合并单元格第一个单元格跨列数+1”,即8-1-3+1=5。即将第二行第六列到第二行第二列的单元格,依次向右移动两个单元格。将第二行第二列、第二行第三列对应的arrayTable对应的数组成员Exist属性值置为false,Iscombin属性值置为true,Colspan和Rowspan置为0。
继续后续单元格跨列数获取和单元格对应数组成员的移动。
根据第二行第七列单元格(从第二行第五列单元格移动而来)的跨列数2,移动arrayTable对应的数组成员。移动跨度为2-1=1;移动数量为8-7-2+1=0。即不需要移动。将第二行第八列对应的arrayTable对应的数组成员Exist属性值置为false,Iscombin属性值置为true,Colspan和Rowspan置为0。
第三行单元格宽度为“获取不到”、70.55、获取不到、47.35、获取不到、获取不到、获取不到、获取不到。除以表宽乘以列数后,得个跨列数初值分别为1.324571697、0.888993194。按四舍五入取整的跨列数分别为1。跨列误差一部分为0.324571697,跨列误差二部分-0.111006806,相加求和后得到误差总和为0.213564891,不大于1,不用修正。本行总得跨列数1+1等于2。
第三行可获取到的两个单元格宽度为70.55+47.35=117.9,小于表格总宽度,所以比较基准总列数为表格总列数-1为7,两个单元格跨列数之和为1+1=2,小于比较基准总列数,不需要修正。
再根据参考列宽数组baseColWidth对第三行单元格跨列数进行修正,arrayTable对应第三行单元格Exist属性为true的有两个。第一个单元格arrayTable[3,1].Exist=false,获取不到,根据报错规律为纵向合并单元格,将arrayTable[3,1].Iscombin置为true,Rowspan置为0;按行由下向上进行回溯,对应列值为第一列。向上查找第二行第一列单元格对应得二维数组成员arrayTable[2,1].Exist属性为true,将跨行数arrayTable[2,1].Rowspan+1置为2;获取跨列数arrayTable[2,1].Colspan为3,由于Word合并单元格都是矩形,所以在表格的第三行,也是应该跨3列的,修改第三行第一列单元格跨列数arrayTable[3,1].Colspan为3。
第三行第二列单元格arrayTable[3,2].Exist=true,对应的参考列宽数组的列值为arrayTable[3,1].Colspan+1,即3+1等于4,获取baseColWidth[1,4]=70.55,等于第三行第二列单元格的宽度arrayTable[3,2].Width=70.55,所以第三行第二列单元格跨列数arrayTable[3,2].Colspan修正为1。
第三行第三列单元格arrayTable[3,3].Exist等于false,获取不到。之前arrayTable对应第三行成员Exist属性为true的单元格只处理了一个,根据报错规律,第三行第三列单元格为纵向合并单元格。将arrayTable[3,3].Iscombin置为true,Rowspan置为0;按行由下向上进行回溯,对应列值为arrayTable[3,1].Colspan+arrayTable[3,2].Colspan+1,即3+1+1等于5。首先获取到第二行第五列单元格arrayTable[2,5].Exist等于false,继续向上回溯,获取到第一行第五列单元格arrayTable[1,5].Exist等于true,将跨行数arrayTable[1,5].Rowspan+1等于3。继续获取arrayTable[1,5].Colspan等于1,说明是单列合并单元格。第三行第三列单元格arrayTable[3,3].Colspan修正为1。
第三行第四列单元格arrayTable[3,4].Exist等于true,可以获取到。对应的参考列宽数组的列值为arrayTable[3,1].Colspan+arrayTable[3,2].Colspan+arrayTable[3,3].Colspan+1,即3+1+1+1=6,获取baseColWidth[1,6]=47.35,等于arrayTable[3,4].Width,第三行第四列单元格arrayTable[3,4].Colspan修正为1。
第三行第四列单元格处理完后,arrayTable中对应第三行单元格Exist属性为true的单元格都处理完成,第三行第一列至第四列跨列数之和为3+1+1+1=6,小于表格总列数,根据报错规律,第五列为纵向合并单元格。将arrayTable[3,5].Iscombin置为true,Rowspan置为0,按行由下向上进行回溯,对应列值为arrayTable[3,1].Colspan+arrayTable[3,2].Colspan+arrayTable[3,3].Colspan+arrayTable[3,4].Colspan+1,即3+1+1+1+1等于7。首先获取到第二行第七列单元格arrayTable[2,7].Exist=true,将跨行数arrayTable[2,7].Rowspan+1置为2。继续获取arrayTable[2,7].Colspan等于2。由于Word合并单元格都是矩形,所以在表格的第三行对应位置也是应该跨2列的,修改第三行第五列单元格跨列数arrayTable[3,5].Colspan为2。
第三行第五列单元格处理完后,arrayTable中对应第三行单元格Exist属性为true的单元格都处理完成,第三行第一列至第五列跨列数之和为3+1+1+1+2=8,等于表格总列数,第三行处理完成。
由于本行存在跨列的单元格,所以需要将被合并单元格对应的二维数组成员变量后移。
根据第三行第一个单元格得跨列数3,移动arrayTable对应的数组成员。移动跨度为3-1=2;移动数量为“表格总列数-合并单元格第一个单元格所在列数-合并单元格第一个单元格跨列数+1”,即8-1-3+1=5。即将第三行第六列到第三行第二列的单元格,依次向右移动两个单元格。将第三行第二列、第三行第三列对应的arrayTable对应的数组成员Exist属性值置为false,Iscombin属性值置为true,Colspan和Rowspan置为0。
继续后续单元格跨列数获取和单元格对应数组成员的移动。
根据第三行第七列单元格(从第三行第五列单元格移动而来)的跨列数2,移动arrayTable对应的数组成员。移动跨度为2-1=1;移动数量为8-7-2+1=0。即不需要移动。将第三行第八列对应的arrayTable对应的数组成员Exist属性值置为false,Iscombin属性值置为true,Colspan和Rowspan置为0。
第四行单元格宽度分别为55.05、39.6、24.15、70.55、获取不到、47.35、47.35、47.35。除以表宽乘以列数后,分别得跨列数初值为1.033560197、0.743487444、0.453414691、1.324571697、0.888993194、0.888993194、0.888993194。由于可获取单元格跨列数最小为1,修正按四舍五入取整后的跨列数分别为1、1、1、1、获取不到、1、1、1。小数误差一部分等于0.033560197+0.324571697=0.358131894,小数误差二部分等于-0.256512556、-0.546585309、-0.111006806、-0.111006806、-0.111006806求和得-1.136118282,误差和为-0.777986388不小于-1,不用修正。
第四行可获取到的七个单元格宽度之和为55.05+39.6+24.15+70.55+47.35+47.35+47.35=331.4,小于表格总宽度,所以比较基准总列数为表格总列数-1为7,七个单元格跨列数之和为1+1+1+1+1+1+1等于7,等于比较基准总列数,不需要修正。
再根据参考列宽数组baseColWidth对第四行单元格跨列数进行修正,第一个单元格arrayTable[4,1].Exist=true,对应的参考列宽数组的列值为baseColWidth[1,1]=47.3,小于arrayTable[4,1].Width=55.05,参考列宽继续加入baseColWidth[1,2]的值,即47.3+47.35等于94.65,两者还是不相等,并且大于55.05。第四行从当前单元格开始不再根据参考列宽数组进行跨列数修正。
第四行Exist为true的单元格总的跨列数为7,小于表格总列数,说明存在纵向合并单元格,第四行逐列读入对应的arrayTable数组成员判断Exist属性。读入第5个单元格arrayTable[4,5].Exist等于false,说明是纵向合并单元格,将arrayTable[4,5].Iscombin置为true,arrayTable[4,5].Rowspan置为0;按行由下向上进行回溯,对应列值为arrayTable[4,1].Colspan+arrayTable[4,2].Colspan+arrayTable[4,3].Colspan+arrayTable[4,4].Colspan+1=1+1+1+1+1=5。首先获取到第三行第五列单元格arrayTable[3,5].Exist等于false,继续向上回溯;获取到第二行第五列单元格arrayTable[2,5].Exist等于false,继续向上回溯;获取到第一行第五列单元格arrayTable[1,5].Exist等于true,将跨行数arrayTable[1,5].Rowspan+1置为4。继续获取arrayTable[1,5].Colspan等于1。说明是单列纵向合并单元格。修正第四行第五列单元格跨列数arrayTable[1,5].Colspan为1。第四行修正后的跨列数为1+1+1+1+1+1+1+1=8等于表格总列数。第四行处理完成。第四行各单元格跨列数都为1,不需要进行跨列移动。
图16为本发明实施例二提供的得到的目标arrayTable数组成员的主要属性值示意图。
根据图16所示的目标arrayTable数组,生成程序主界面的目标表格,如图17所示。图17所示目标表格的可选单元格标识如图18所示。其中图17为本发明实施例二提供的根据目标arrayTable数组,在主界面生成的目标表格示意图,图18为本发明实施例二提供的目标表格的可选单元格标识示意图。
上述描述是分析Word类型表格结构过程。在实际场景中还会经常使用到Excel类型的图表。
图19为本发明实施例三提供的待检测Excel表格样例的示意图;图20展示了本发明实施例三提供的部分方法中获取的各单元格的Cells.MergeCells值和MergeArea.Address值的示意图,Excel表格判断合并单元格的两个主要依据参数;分析图19Excel表格样例各单元格的Cells.MergeCells值和MergeArea.Address值。
在本发明表格汇总的系统界面左起第三个按钮可以实现Excel类型的图表的汇总,如图2所示。
Excel类型表格结构分析方法比较简单,使用现有的开发工具,能够获得合并单元格位置和范围,因此不需要多次循环判断和修正。在本发明中不作为重点论述。其它部分和Word类型表格处理一致。
Excel类型表格结构分析,使用Microsoft.Office.Interop.Excel的UsedRange.Cells.Rows.Count和Cells.Columns.Count属性获得待检测表格的初始行号和初始列号。每个单元格可以通过使用Microsoft.Office.Interop.Excel的Worksheets.Cells属性读取到。使用Cells.MergeCells属性判断是否为合并单元格;使用MergeArea.Address属性判断合并单元格的范围。并且通过字符串拆解转换,将合并单元格范围的地址信息解析为跨行数和跨列数,并赋值给合并单元格第一个单元格对应的二维数组成员变量的属性。
将合并单元格范围内,被合并的各单元格对应二维数组arrayTable成员的Exist属性置为false,但合并单元格的第一个单元格Exist属性置为true。
结合前述Excel类型表格的特性,如下提供了Word类型表格结构的分析方法。
图21为本发明实施例四提供的另一部分方法中解析Word表格可能存在的问题的示意图,示例解析Word表格可能存在的问题;使用表格汇总的系统自动将待检测的Word类型表格另存为Excel表格,并利用前述方式分析表格结构,生成的二维数组arrayTable成员变量属性值,得到表格结构。在本发明表格汇总的系统界面左起第二个按钮可以实现Word类型的表格汇总,参考图2。
但是这种方法存在的问题是如果多个待合并表格结构相同,但格式不完全相同的情况下,生成的二维数组以及数组成员变量值有可能不同。比如待合并表格相同位置单元格,由于宽度和高度不同,在另存为Excel表格时,会被Excel解析为不同范围的合并单元格。如图21所示,图21为本发明实施例四提供的另一部分方法中解析Word表格可能存在的问题的示意图,即Word表格拷贝到Excel中会出现的一个问题。这样会导致本应该对应到二维数组相同成员,却对应到不同成员。甚至可能影响生成的二维数组大小。这样在后续汇总多表格数据时,对应不到相同位置的值。
前述步骤执行完成后,生成并修正了对应图5表格的目标二维数组arrayTable和存储图片的image类数组。
S205、根据目标自定义类对象二维数组成员,生成目标表格;其中目标表格的结构和第一待检测表格的结构一致,且目标表格用于多个相同结构待检测表格之间的信息汇总;其中目标表格的结构和第一待检测表格的结构一致是指在表格汇总的系统界面显示为相同。
目标表格中的单元格设置为可选按钮单元格,并通过目标自定义类对象二维数组成员中的属性值命名单元格标识;单元格标识对应第一待检测表格单元格的初始行号和初始列号。
具体的,根据目标自定义类对象二维数组成员,生成目标表格,包括:
根据所有单元格对应的目标自定义类对象二维数组成员生成目标表格,在表格汇总的系统界面生成与第一待检测表格结构一致的目标表格,其中目标表格中的单元格设置为可选按钮单元格,且通过使用目标自定义类对象二维数组中成员属性值,为每个可选按钮单元格生成对应的单元格标识,每个单元格标识对应第一待检测表格单元格的初始行号与初始列号。
本实施例中根据二维数组中成员的属性值,利用VisualStudio开发工具提供的tableLayoutPanel控件,生成大小为表格行数*表格列数的控件tableLayoutPanel1。控件每一格对应于二维数组中每一个成员。判断数组成员的Exist属性值是否为true,如果为true则动态生成一个button按钮控件,使用tableLayoutPanel.Controls.Add方法与tableLayoutPanel1控件单元格绑定,并生成点击响应函数button_Click。button按钮控件的标识是使用arrayTable数组成员中的Orig_row加Orig_col生成的。当用户点击按钮时,拆解按钮控件的标识,获得初始表格单元格的行号和列号。这样能够保证即使表格合并单元格的存在,导致arrayTable数组成员有移动的情况下,也能对应到原始表格正确的行和列。按钮控件的标识如图12所示,图12为本发明实施例一生成的按钮控件的标识的示意图,第一待检测表格,对应系统界面生成可选按钮单元格的标识。
button按钮控件显示的内容为arrayTable数组成员Value属性值,也就是表格单元格中的值。如果待检测表格单元格中是图片,即arrayTable数组成员image属性为true,则在对应的二维image类数组中读出图片,作为button的BackgroundImage显示。
根据数组成员的跨列数属性值、跨行属性值,设置tableLayoutPanel1控件的SetColumnSpan和SetRowSpan属性值。这样button按钮控件的布局就和待汇总表格一致了。参考图13,图13本发明实施例一提供了从第一待检测表格,到程序主界面生成目标表格用户选择界面的和展示布局相关的主要数据转化过程的示意图,如图13显示了从图5Word表格样例、目标arrayTable数组主要与显示布局相关的成员属性、tableLayoutPanel1主要属性和可选单元格标识、表格汇总的系统界面展示的过程。
在一种可选的实施例中,在根据目标自定义类对象二维数组成员,生成目标表格之后,还包括:
根据选择指令,获取目标表格中的多个可选按钮单元格对应的单元格标识;
通过单元格标识,得到对应第一待检测表格的初始行号与初始列号;
通过初始行号和初始列号,得到第一待检测表格对应的单元格数据;
根据批量指令,将同一文件夹下的所有待检测表格,选取与第一待检测表格相同的初始行号与初始列号的单元格,且将单元格数据汇总至一个汇总表格;其中汇总表格中每一行对应一个待检测表格的多个单元格数据。
由于在分析表格布局时,对于发现的合并单元格要将对应的二维数组成员值的后移,这样按钮如果直接取tableLayoutPanel控件的下标或者二维数组的下标可能无法对应到第一待检测表格表格中正确的单元格。所以这时要用到二维数组成员的初始行号和初始列号属性。用初始行号和初始列号属性值来动态生成button按钮的标识。当用户点击时,通过字符串解析button控件的标识得到对应表格单元格的编号。这样通过二维数组成员的下标确定按钮的显示位置,而通过二维数组成员初始行号和初始列号属性对应表格实际的单元格,达到了按钮与第一待检测表格中单元格实际单元格一一对应。
为每个按钮生成点击响应函数,并将表格中的文本赋值到button的文本。用户在使用时一目了然。
如果待检测表格单元格中是图片,即二维数组成员是否图片属性为真,则在对应的image数组中读出图片,作为button的BackgroundImage显示。
本实施例结合前述设置的一个Select_Cell类记录用户选择的单元格的行号和列号,定义了一个ArrayList类型的变量selected,用来存储Select_Cell类对象。在可选按钮单元格响应函数button_Click中,用户每点击一个表格汇总的系统主界面上对应表格的button按钮,就生成一个Select_Cell类对象,并存入selected变量中。Select_Cell类对象存储的行号和列号不是取button按钮的下标值,而是通过拆解button的标识取得。因为如前S203,生成button按钮的标识是使用arrayTable数组成员中的Orig_row加Orig_col生成的。这样能够保证即使表格合并单元格的存在,导致arrayTable数组成员有移动的情况下,也能对应到原始表格正确的行和列。例如用户点击图13程序主界面生成的目标表格第二行最右侧按钮控件,取到的对应表格的行列号是2和3,而不是2和5。通过行列号2和3,能够对应到图5表格值为8的单元格。
用户通过点选表格汇总的系统界面生成的按钮控件选择需要汇总的表格单元格,在点选表格汇总的系统界面上的“批量处理”按钮,表格汇总的系统会将同一文件夹下,包含相同表格结构的文件内容,汇总到一个新的Excel类型的电子表格中。在新的表格中将用户点选的单元格值均以独立单元格依次存放,每个表格文档的表格数据为一行,效果可以参见图4。
需要说明的是,待汇总表格只要与第一待检测表格结构相同,按前述的算法,即使目标表格呈现的结构不同,由于生成的目标表格可选单元格标识相同,在用户点选时会被解析为相同的初始行号和初始列号,对应到待汇总表格相同位置单元格。参考图22,图22为本发明实施例五提供的表格汇总的方法中对比效果示意图,如图22所示,3行5列的待检测表格无论合并单元格为图中三张表格的任一情况,表格结构相同,第二行宽窄比例不一样。但无论选择哪一个作为第一待检测表格,在表格汇总的系统界面上判断的合并单元格可能不一样,但可选单元格的标识是一样的。利用本发明提供的表格汇总的方法获取提取合并单元格在初始未合并时的信息,以便多个相同结构的待检测表格之间信息的汇总,避免人工操作出现错误,提高表格汇总的效率。
图23为本发明实施例六提供的表格汇总的装置的结构示意图,如图23所示,本实施例中表格汇总的装置可以包括:
获取模块31,用于获取放置于同一文件夹下的一个表格文档作为第一待检测表格,其中同一文件夹下包括两个及以上相同结构的表格文档;
遍历模块32,用于遍历第一待检测表格每个单元格对应的状态和参数,生成每个单元格对应的初始自定义类对象二维数组成员;
确定模块33,用于根据单元格的成员属性,分别逐行、逐列确定第一待检测表格中的合并单元格以及修正跨行数、修正跨列数,并保存在自定义类对象二维数组中;
数组模块34,用于根据修正跨行数、修正跨列数,合并单元格对应的自定义类对象二维数组成员属性,按照合并单元格的报错规律,在数组中移动相应的位置进行保存,复原合并单元格结构,得到第一待检测表格对应的目标自定义类对象二维数组;
生成模块35,用于根据目标自定义类对象二维数组成员,生成目标表格;其中目标表格的结构和第一待检测表格的结构一致,且目标表格用于多个相同结构待检测表格之间的信息汇总;目标表格中的单元格设置为可选按钮单元格,并通过目标自定义类对象二维数组成员中的属性值命名单元格标识;单元格标识对应第一待检测表格单元格的初始行号和初始列号。
在一种可能的设计中,二维数组成员属性包括:初始行号、初始列号、跨行数、跨列数、是否被合并、单元格数据、单元格宽度、单元格高度、根据报错规律单元格是否可以获取、单元格是否为图片。
在一种可能的设计中,还包括:
获取第一待检测表格对应的总行数、总列数,并生成对应的初始自定义类对象二维数组,生成每个单元格对应的初始自定义类对象二维数组成员;
根据初始自定义类对象二维数组,生成第一待检测表格对应的目标自定义类对象二维数组,其中初始自定义类对象二维数组成员、目标自定义类对象二维数组成员与自定义类对象二维数组成员均具有单元格对应的成员属性。
在一种可能的设计中,逐行确定第一待检测表格中的合并单元格以及修正跨列数,包括:
获取待检测表格的第一行单元格的宽度之和,得到表宽;
逐行确定每行中可获取到的单元格数量是否等于表格总列数;
若相等,则将行中所有单元格的列宽,作为一行存入二维浮点型数组,作为参考列宽数组;每个单元格列宽对应二维浮点数组的一个成员;其中行中各个单元格的跨列数均为1,而且不需要进行修正;
若不相等,则确定第一待检测表格行中可获取到的每个单元格宽度与表宽的比值;
将比值与第一待检测表格对应的总列数相乘获得跨列数初值;
对跨列数初值四舍五入取整后,得到每行对应单元格的跨列数,且跨列数初值在取整前包括整数部分和小数部分,小数部分用于确定修正跨列数;
根据参考列宽数组修正单元格跨列数,若单元格宽度等于在一行参考列宽数组中对应位置的至少一列成员的列宽值,则修正跨列数。
在一种可能的设计中,在得到每行对应单元格的跨列数之后,还包括:
根据跨列数初值的小数部分,计算跨列误差;
若跨列数初值大于1,且跨列数初值的小数部分小于0.5,则小数部分作为跨列误差一;
若跨列数初值大于1,且跨列数初值的小数部分大于等于0.5,则小数部分减1后,作为跨列误差二;跨列误差二还包括:若跨列数初值小于1,则减1后,作为跨列误差二;
将每行单元格对应的跨列误差一和跨列误差二相加,得到跨列误差总和;
根据跨列误差总和,进行修正处理;
若跨列误差总和大于等于1,则跨列误差总和向下取整作为循环次数,每次循环获取跨列误差一最大的单元格,并对单元格对应的跨列数加1;
若跨列误差总和小于等于-1,则跨列误差总和取绝对值后向下取整作为循环次数,每次循环获取跨列误差二最小的单元格,若单元格对应的跨列数大于1,则对单元格对应的跨列数减1;若单元格对应的跨列数等于1,则不进行操作,继续获取跨列误差二对应的第二小的单元格对跨列数进行判断、操作,依此类推。
在一种可能的设计中,在第一待检测表格的每一行单元格循环完成之后,对整行每个可获取单元格对应的修正跨列数进行求和得到第一总和,
若当前行可以获取到的单元格宽度之和等于表格宽度,则比较基准总列数为表格总列数;
若当前行中可以获取到的单元格宽度之和小于表格宽度,则比较基准总列数为表格总列数-1,即当前行中至少含有一个纵向合并单元格,并将第一总和与比较基准总列数进行校验;
若第一总和大于比较基准总列数,则对跨列数最大的单元格的跨列数减1,直到两者相等为止,得到对应的修正跨列数。
在一种可能的设计中,还包括:在第一待检测表格的每一行单元格循环完成之后,对整行每个单元格使用参考列宽进行修正得到修正跨列数;
从当前行的第一个单元格开始依次进行判断,若单元格获取不到,且在行中当前单元格之前的单元格跨列数之和小于表格总列数,根据报错规则,说明是纵向合并单元格;
更改当前单元格对应的自定义类对象二维数组中成员属性值,表示是合并单元格;
按行由下向上逐行回溯单元格,列值为当前单元格所在行之前的单元格的跨列数之和加1,查找可以获取到的单元格,即在列方向的合并单元格第一个单元格;
若查找到合并单元格的第一个单元格,则将第一个单元格对应的自定义类对象二维数组中成员的跨行数进行修改加1,得到修正跨行数。
在一种可能的设计中,还包括:在确定单元格在列方向上被合并之后,获取合并单元格第一个单元格在行方向上的跨列数;若合并单元格第一个单元格行方向上跨列数大于1,则合并单元格在行方向和列方向上都存在合并,且合并单元格在行方向和列方向排序均为第一个单元格;根据跨列数修正当前单元格对应的自定义类对象二维数组中成员属性值。
在一种可能的设计中,还包括:若当前单元格可以获取到,根据当前单元格所在行之前的单元格的跨列数之和加1,得到当前单元格对应参考列宽数组中的对应成员位置;
当前单元格宽度与参考列宽数组中对应成员的列宽值进行比较,若找到参考列宽数组存在一行,且对应位置成员列宽值与单元格宽度相等,或者从对应位置开始,与之后连续成员列宽值之和与当前单元格宽度相等,则当前单元格跨列数修定为参考列宽数组中求和的成员数量;
若在参考列宽数组中找不到对应位置列宽值与单元格宽度相等的成员,则不进行修正,且当前单元格所在行后面的单元格也不使用参考列宽数组进行修正。
在一种可能的设计中,还包括:在第一待检测表格的每一行可获取的单元格循环完成之后,对当前行第一个单元格到最后一个可获取的单元格,包括获取到的和获取不到的单元格,对应的修正跨列数进行求和得到第二总和;并将第二总和与第一待检测表格的总列数进行校验;
若第二总和小于总列数,根据报错规律,说明当前行最后一个可获取的单元格之后至少存在一个纵向合并单元格;则从最后一个可获取的单元格之后的第一个单元格开始,按行向上回溯,列值为最后一个可获取的单元格与其之前的单元格跨列数之和加1,找到合并单元格第一个单元格,获得跨列数之后,修正当前单元格跨列数,将第二总和加上跨列数,继续与第一待检测表格的总列数进行校验;若相等则本行处理完毕;若仍小于,则说明当前单元格后面还有纵向合并单元格,继续进行校验,直到后面纵向合并单元格的跨列数两者相等为止,当前行处理完毕。
在一种可能的设计中,还包括:若第一待检测表格的行中存在修正跨列数大于1的单元格,则对行对应的自定义类对象二维数组中成员属性值进行修正;根据确定的跨列数以及跨列数对应单元格所在列,依次将行的自定义类对象二维数组中每个单元格对应的属性值,按对应的跨列数在行方向上进行相应的后移;其中后移的跨度为合并单元格第一个单元格跨列数-1;后移的成员数量为,表格总列数-合并单元格第一个单元格所在列数-合并单元格第一个单元格跨列数+1;第一待检测表格的行中最右侧单元格向左,有后移的成员数量的单元格,被移动过来的单元格覆盖;合并单元格第一个单元格在行方向上后续跨列数-1的单元格,更改对应的自定义类对象二维数组中成员属性值,表示是合并单元格。
在一种可能的设计中,根据目标自定义类对象二维数组成员,生成目标表格,包括:
根据所有单元格对应的目标自定义类对象二维数组成员生成目标表格,在表格汇总的系统界面生成与第一待检测表格结构一致的目标表格,其中目标表格中的单元格设置为可选按钮单元格,且通过使用目标自定义类对象二维数组中成员属性值,为每个可选按钮单元格生成对应的单元格标识,每个单元格标识对应第一待检测表格单元格的初始行号与初始列号。
在一种可能的设计中,在根据目标自定义类对象二维数组成员,生成目标表格之后,还包括:
根据选择指令,获取目标表格中的多个可选按钮单元格对应的单元格标识;
通过单元格标识,得到对应第一待检测表格的初始行号与初始列号;
通过初始行号和初始列号,得到第一待检测表格对应的单元格数据;
根据批量指令,将同一文件夹下的所有待检测表格,选取与第一待检测表格相同的初始行号与初始列号的单元格,且将单元格数据汇总至一个汇总表格;其中汇总表格中每一行对应一个待检测表格的多个单元格数据。
图24为本发明实施例七提供的表格汇总的系统的结构示意图,如图24所示,本实施例的表格汇总的系统40可以包括:处理器41和存储器42。
存储器42,用于存储计算机表格汇总的系统(如实现上述表格汇总的方法的应用表格汇总的系统、功能模块等)、计算机指令等;
上述的计算机表格汇总的系统、计算机指令等可以分区存储在一个或多个存储器42中。并且上述的计算机表格汇总的系统、计算机指令、数据等可以被处理器41调用。
处理器41,用于执行存储器42存储的计算机表格汇总的系统,以实现上述实施例涉及的方法中的各个步骤。
具体可以参见前面方法实施例中的相关描述。
处理器41和存储器42可以是独立结构,也可以是集成在一起的集成结构。当处理器41和存储器42是独立结构时,存储器42、处理器41可以通过总线43耦合连接。
本实施例的服务器可以执行图2所示方法中的技术方案,其具体实现过程和技术原理参见图2所示方法中的相关描述,此处不再赘述。
此外,本申请实施例还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,当用户设备的至少一个处理器执行该计算机执行指令时,用户设备执行上述各种可能的方法。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过表格汇总的系统指令相关的硬件来完成。前述的表格汇总的系统可以存储于一计算机可读取存储介质中。该表格汇总的系统在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储表格汇总的系统代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (14)
1.一种表格汇总的方法,其特征在于,包括:
获取放置于同一文件夹下的一个表格文档作为第一待检测表格,其中所述同一文件夹下包括两个及以上相同结构的表格文档;
遍历所述第一待检测表格每个单元格的状态和参数,生成每个单元格对应的初始自定义类对象二维数组成员属性;
根据所述二维数组的成员属性值,分别逐行、逐列确定所述第一待检测表格中的合并单元格以及修正跨行数、修正跨列数,并保存在自定义类对象二维数组中;
根据所述修正跨行数、修正跨列数,合并单元格对应的自定义类对象二维数组成员属性,按照合并单元格的报错规律,在数组中移动相应的位置进行保存,复原合并单元格结构,得到第一待检测表格对应的目标自定义类对象二维数组;
根据所述目标自定义类对象二维数组成员,生成目标表格;其中所述目标表格的结构和所述第一待检测表格的结构一致,且所述目标表格用于多个相同结构待检测表格之间的信息汇总;所述目标表格中的单元格设置为可选按钮单元格,并通过目标自定义类对象二维数组成员中的属性值命名单元格标识;所述单元格标识对应第一待检测表格单元格的初始行号和初始列号;
所述二维数组成员属性包括:初始行号、初始列号、跨行数、跨列数、是否被合并、单元格数据、单元格宽度、单元格高度、根据报错规律单元格是否可以获取、单元格是否为图片。
2.根据权利要求1所述的方法,其特征在于,所述方法,还包括:
获取第一待检测表格对应的总行数、总列数,并生成对应的初始自定义类对象二维数组,生成每个单元格对应的初始自定义类对象二维数组成员;
根据所述初始自定义类对象二维数组,生成第一待检测表格对应的目标自定义类对象二维数组,其中所述初始自定义类对象二维数组成员、所述目标自定义类对象二维数组成员与所述自定义类对象二维数组成员均具有所述单元格对应的成员属性。
3.根据权利要求2所述的方法,其特征在于,逐行确定所述第一待检测表格中的合并单元格以及修正跨列数,包括:
获取第一待检测表格的第一行单元格的宽度之和,得到表宽;
逐行确定每行中可获取到的单元格数量是否等于表格总列数;
若相等,则将所述行中所有单元格的列宽,作为一行存入二维浮点型数组,作为参考列宽数组;每个单元格列宽对应二维浮点数组的一个成员;其中所述行中各个单元格的跨列数均为1,而且不需要进行修正;
若不相等,则确定所述第一待检测表格所述行中可获取到的每个单元格宽度与表宽的比值;
将所述比值与第一待检测表格对应的总列数相乘获得跨列数初值;
对所述跨列数初值四舍五入取整后,得到每行对应单元格的跨列数,且跨列数初值在取整前包括整数部分和小数部分,小数部分用于确定修正跨列数;
根据所述参考列宽数组修正单元格跨列数,若所述单元格宽度等于在一行所述参考列宽数组中对应位置的至少一列成员的列宽值,则修正跨列数。
4.根据权利要求3所述的方法,其特征在于,在得到每行对应单元格的跨列数之后,还包括:
根据所述跨列数初值的小数部分,计算跨列误差;
若所述跨列数初值大于1,且跨列数初值的小数部分小于0.5,则小数部分作为跨列误差一;
若所述跨列数初值大于1,且跨列数初值的小数部分大于等于0.5,则小数部分减1后,作为跨列误差二;所述跨列误差二还包括:若所述跨列数初值小于1,则减1后,作为跨列误差二;
将每行单元格对应的跨列误差一和跨列误差二相加,得到跨列误差总和;
根据所述跨列误差总和,进行修正处理;
若所述跨列误差总和大于等于1,则跨列误差总和向下取整作为循环次数,每次循环获取跨列误差一最大的单元格,并对所述单元格对应的跨列数加1;
若所述跨列误差总和小于等于-1,则跨列误差总和取绝对值后向下取整作为循环次数,每次循环获取所述跨列误差二最小的单元格,若所述单元格对应的跨列数大于1,则对所述单元格对应的跨列数减1;若所述单元格对应的跨列数等于1,则不进行操作,继续获取所述跨列误差二对应第二小的单元格对跨列数进行判断、操作。
5.根据权利要求3所述的方法,其特征在于,所述方法,还包括:在第一待检测表格的每一行单元格循环完成之后,对整行每个可获取单元格对应的修正跨列数进行求和得到第一总和;
若当前行可以获取到的单元格宽度之和等于表格宽度,则比较基准总列数为表格总列数;
若当前行中可以获取到的单元格宽度之和小于表格宽度,则比较基准总列数为表格总列数-1,即当前行中至少含有一个纵向合并单元格,并将所述第一总和与所述比较基准总列数进行校验;
若所述第一总和大于所述比较基准总列数,则对跨列数最大的单元格的跨列数减1,直到两者相等为止,得到对应的修正跨列数。
6.根据权利要求5所述的方法,其特征在于,所述方法,还包括:在所述第一待检测表格的每一行单元格循环完成之后,对整行每个单元格使用所述参考列宽进行修正得到所述修正跨列数;
从当前行的第一个单元格开始依次进行判断,若所述单元格获取不到,且在所述行中当前单元格之前的单元格跨列数之和小于表格总列数,根据报错规则,说明是纵向合并单元格;
更改所述当前单元格对应的自定义类对象二维数组中成员属性值,表示是合并单元格;
按行由下向上逐行回溯单元格,列值为所述当前单元格所在行之前的单元格的跨列数之和加1,查找可以获取到的单元格,即在列方向的合并单元格第一个单元格;
若查找到所述合并单元格的第一个单元格,则将所述第一个单元格对应的自定义类对象二维数组中成员的跨行数进行修改加1,得到修正跨行数。
7.根据权利要求5所述的方法,其特征在于,还包括:在确定所述单元格在列方向上被合并之后,获取所述合并单元格第一个单元格在行方向上的跨列数;若所述合并单元格第一个单元格行方向上跨列数大于1,则所述合并单元格在行方向和列方向上都存在合并,且所述合并单元格在行方向和列方向排序均为第一个单元格;根据所述跨列数修正当前单元格对应的自定义类对象二维数组中成员属性值。
8.根据权利要求7所述的方法,其特征在于,所述方法,还包括:若当前单元格可以获取到,根据所述当前单元格所在行之前的单元格的跨列数之和加1,得到当前单元格对应参考列宽数组中的对应成员位置;
当前单元格宽度与参考列宽数组中对应成员的列宽值进行比较,若找到参考列宽数组存在一行,且对应位置成员列宽值与单元格宽度相等,或者从对应位置开始,与之后连续成员列宽值之和与所述当前单元格宽度相等,则当前单元格跨列数修定为参考列宽数组中求和的成员数量;
若在参考列宽数组中找不到对应位置列宽值与单元格宽度相等的成员,则不进行修正,且当前单元格所在行后面的单元格也不使用参考列宽数组进行修正。
9.根据权利要求8所述的方法,其特征在于,还包括:在第一待检测表格的每一行可获取的单元格循环完成之后,对当前行第一个单元格到最后一个可获取的单元格,包括获取到的和获取不到的单元格,对应的修正跨列数进行求和得到第二总和;并将所述第二总和与所述第一待检测表格的总列数进行校验;
若所述第二总和小于所述总列数,根据报错规律,说明当前行最后一个可获取的单元格之后至少存在一个纵向合并单元格;则从最后一个可获取的单元格之后的第一个单元格开始,按行向上回溯,列值为所述最后一个可获取的单元格与其之前的单元格跨列数之和加1,找到合并单元格第一个单元格,获得跨列数之后,修正当前单元格跨列数,将第二总和加上所述跨列数,继续与所述第一待检测表格的总列数进行校验;若相等则本行处理完毕;若仍小于,则说明当前单元格后面还有纵向合并单元格,继续进行校验,直到后面纵向合并单元格的跨列数两者相等为止,当前行处理完毕。
10.根据权利要求9所述的方法,其特征在于,还包括:若所述第一待检测表格的行中存在修正跨列数大于1的单元格,则对所述行对应的自定义类对象二维数组中成员属性值进行修正;根据确定的跨列数以及所述跨列数对应单元格所在列,依次将所述行的自定义类对象二维数组中每个单元格对应的属性值,按对应的跨列数在行方向上进行相应的后移;其中后移的跨度为合并单元格第一个单元格跨列数-1;后移的成员数量为,表格总列数-合并单元格第一个单元格所在列数-合并单元格第一个单元格跨列数+1;所述第一待检测表格的行中最右侧单元格向左,有所述后移的成员数量的单元格,被移动过来的单元格覆盖;所述合并单元格第一个单元格在行方向上后续跨列数-1的单元格,更改对应的自定义类对象二维数组中成员属性值,表示是合并单元格。
11.根据权利要求10所述的方法,其特征在于,根据所述目标自定义类对象二维数组成员,生成目标表格,包括:
根据所有单元格对应的目标自定义类对象二维数组成员生成目标表格,在表格汇总的系统界面生成与第一待检测表格结构一致的目标表格,其中目标表格中的单元格设置为可选按钮单元格,且通过使用目标自定义类对象二维数组中成员属性值,为每个所述可选按钮单元格生成对应的单元格标识,每个所述单元格标识对应第一待检测表格单元格的初始行号与初始列号。
12.根据权利要求11所述的方法,其特征在于,在根据所述目标自定义类对象二维数组成员,生成目标表格之后,还包括:
根据选择指令,获取目标表格中的多个可选按钮单元格对应的单元格标识;
通过所述单元格标识,得到对应第一待检测表格的初始行号与初始列号;
通过所述初始行号与初始列号,得到第一待检测表格对应的单元格数据;
根据批量指令,将同一文件夹下的所有待检测表格,选取与第一待检测表格相同的初始行号与初始列号的单元格,且将所述单元格数据汇总至一个汇总表格;其中所述汇总表格中每一行对应一个待检测表格的多个单元格数据。
13.一种表格汇总的系统,其特征在于,包括:存储器和处理器,存储器中存储有所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1-12任一项所述的表格汇总的方法。
14.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-12任一项所述的表格汇总的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911273790.XA CN111027294B (zh) | 2019-12-12 | 2019-12-12 | 表格汇总的方法、装置及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911273790.XA CN111027294B (zh) | 2019-12-12 | 2019-12-12 | 表格汇总的方法、装置及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111027294A CN111027294A (zh) | 2020-04-17 |
CN111027294B true CN111027294B (zh) | 2023-05-30 |
Family
ID=70208327
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911273790.XA Active CN111027294B (zh) | 2019-12-12 | 2019-12-12 | 表格汇总的方法、装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111027294B (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111723142A (zh) * | 2020-06-24 | 2020-09-29 | 厦门海迈科技股份有限公司 | 一种数据处理方法及装置 |
CN112632930B (zh) * | 2020-07-27 | 2022-11-04 | 腾讯科技(深圳)有限公司 | 表格数据控制方法及装置 |
CN111859895B (zh) * | 2020-07-28 | 2023-11-03 | 明度智云(浙江)科技有限公司 | 一种对批量文档内表格进行比对的方法、系统和存储介质 |
CN111898352A (zh) * | 2020-07-31 | 2020-11-06 | 平安普惠企业管理有限公司 | 表格文件汇总方法、设备及计算机可读存储介质 |
CN112255965A (zh) * | 2020-10-22 | 2021-01-22 | 中山市华盛家具制造有限公司 | 一种设备加工中nc程序的获取方法 |
CN112347746A (zh) * | 2020-10-28 | 2021-02-09 | 傲普(上海)新能源有限公司 | 一种动态合并网页表格的方法 |
CN112307030B (zh) * | 2020-11-05 | 2023-12-26 | 金蝶软件(中国)有限公司 | 一种维度组合获取方法及相关设备 |
CN112800735A (zh) * | 2021-01-29 | 2021-05-14 | 浪潮云信息技术股份公司 | 一种数据填报系统的构建方法 |
CN113254627B (zh) * | 2021-04-16 | 2023-07-25 | 国网河北省电力有限公司经济技术研究院 | 数据读取方法、装置及终端 |
CN113449226B (zh) * | 2021-07-19 | 2023-06-09 | 杭州每刻科技有限公司 | 一种表格创建方法 |
CN113627318B (zh) * | 2021-08-06 | 2024-09-06 | 北京理工大学 | 一种表格结构识别方法 |
CN113987112B (zh) * | 2021-12-24 | 2022-04-08 | 杭州恒生聚源信息技术有限公司 | 表格信息抽取方法、装置、存储介质及电子设备 |
CN115618154B (zh) * | 2022-12-19 | 2023-03-10 | 华南理工大学 | 一种表格的标记语言标签与单元格锚框鲁棒对齐方法 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0644500A2 (en) * | 1993-09-17 | 1995-03-22 | Xerox Corporation | Method and system for producing a table image having focus and context areas showing direct and indirect data representations |
CN102520941A (zh) * | 2011-12-01 | 2012-06-27 | 大唐移动通信设备有限公司 | 一种生成可执行文档的方法及装置 |
KR20130021482A (ko) * | 2011-08-23 | 2013-03-06 | 주식회사 인프라웨어 | Html 테이블의 셀 단위 편집 방법 |
CN103577572A (zh) * | 2013-11-01 | 2014-02-12 | 河海大学 | 一种智能化的数据图表批量绘制及处理方法 |
CN104516867A (zh) * | 2013-09-30 | 2015-04-15 | 北大方正集团有限公司 | 一种表格重排方法和系统 |
CN104572604A (zh) * | 2013-10-09 | 2015-04-29 | 北大方正集团有限公司 | 文字分栏处理方法及装置 |
CN106202156A (zh) * | 2016-06-16 | 2016-12-07 | 中山大学 | 一种基于WebGIS系统的钻孔柱状图在线生成方法 |
CN107977455A (zh) * | 2017-12-15 | 2018-05-01 | 广州市齐明软件科技有限公司 | ceb文件全文搜索方法、装置以及计算机可读存储介质 |
CN110096507A (zh) * | 2019-04-25 | 2019-08-06 | 北京博跃科技有限公司 | 一种页面复杂表格渲染方法、系统、终端及介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4997749B2 (ja) * | 2005-12-07 | 2012-08-08 | 富士ゼロックス株式会社 | 文書処理方法、プログラム及びシステム |
-
2019
- 2019-12-12 CN CN201911273790.XA patent/CN111027294B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0644500A2 (en) * | 1993-09-17 | 1995-03-22 | Xerox Corporation | Method and system for producing a table image having focus and context areas showing direct and indirect data representations |
KR20130021482A (ko) * | 2011-08-23 | 2013-03-06 | 주식회사 인프라웨어 | Html 테이블의 셀 단위 편집 방법 |
CN102520941A (zh) * | 2011-12-01 | 2012-06-27 | 大唐移动通信设备有限公司 | 一种生成可执行文档的方法及装置 |
CN104516867A (zh) * | 2013-09-30 | 2015-04-15 | 北大方正集团有限公司 | 一种表格重排方法和系统 |
CN104572604A (zh) * | 2013-10-09 | 2015-04-29 | 北大方正集团有限公司 | 文字分栏处理方法及装置 |
CN103577572A (zh) * | 2013-11-01 | 2014-02-12 | 河海大学 | 一种智能化的数据图表批量绘制及处理方法 |
CN106202156A (zh) * | 2016-06-16 | 2016-12-07 | 中山大学 | 一种基于WebGIS系统的钻孔柱状图在线生成方法 |
CN107977455A (zh) * | 2017-12-15 | 2018-05-01 | 广州市齐明软件科技有限公司 | ceb文件全文搜索方法、装置以及计算机可读存储介质 |
CN110096507A (zh) * | 2019-04-25 | 2019-08-06 | 北京博跃科技有限公司 | 一种页面复杂表格渲染方法、系统、终端及介质 |
Non-Patent Citations (4)
Title |
---|
Automatic extraction of table metadata from digital documents;Liu Ying 等;《Proceedings of the 6th ACM/IEEE-CS joint conference on Digital libraries》;339-340 * |
The split-apply-combine strategy for data analysis;Wickham Hadley;《Journal of statistical software》;第40卷;1-29 * |
一种面向PDF文件的表格数据抽取方法的研究与实现;唐皓瑾;《中国优秀硕士学位论文全文数据库信息科技辑》(第08期);I138-1558 * |
网页中实体表格信息抽取方法的研究;刘岩;《中国优秀硕士学位论文全文数据库信息科技辑》(第03期);I138-6314 * |
Also Published As
Publication number | Publication date |
---|---|
CN111027294A (zh) | 2020-04-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111027294B (zh) | 表格汇总的方法、装置及系统 | |
CN110292775B (zh) | 获取差异数据的方法及装置 | |
Gattoufi et al. | A taxonomy for data envelopment analysis | |
CN109918370B (zh) | 一种基于web的可配置表单应用前端的开发方法及系统 | |
US9075787B2 (en) | Defining a reusable spreadsheet-function by extracting the function from a complex calculation in a spreadsheet document | |
CN111367976B (zh) | 基于java反射机制的excel文件数据的导出方法及装置 | |
Di Minin et al. | A quick introduction to Zonation | |
CN110807045A (zh) | 数据展示方法、装置、设备及计算机可读存储介质 | |
US7890519B2 (en) | Summarizing data removed from a query result set based on a data quality standard | |
CN110096434A (zh) | 一种接口测试方法及装置 | |
US9678628B2 (en) | Method for generating control-code by a control-code-diagram | |
US11176203B2 (en) | Interactive representation of multi-dimensional datasets | |
Ioannakis et al. | RETRIEVAL—an online performance evaluation tool for information retrieval methods | |
CN106528511A (zh) | 表单的分析方法和装置 | |
Varelas et al. | Benchmarking large-scale continuous optimizers: The bbob-largescale testbed, a COCO software guide and beyond | |
US10417234B2 (en) | Data flow modeling and execution | |
CN114168565B (zh) | 业务规则模型的回溯测试方法、装置、系统及决策引擎 | |
CN115422903A (zh) | 报表输出方法、装置、电子设备及计算机可读取存储介质 | |
US8781997B2 (en) | Reusing reporting components in customized cubes | |
Franke et al. | Damast: A Visual Analysis Approach for Religious History Research. | |
CN117094296A (zh) | 基于vb语言的表格拆分方法、智能终端及存储介质 | |
CN111797125A (zh) | 报表的创建方法、装置、电子设备及计算机可读存储介质 | |
CN109358919A (zh) | 通用页面的动态配置方法、装置、计算机设备及存储介质 | |
Marques et al. | Towards a requirements traceability process centered on the traceability model | |
JP2005242587A (ja) | クロス表作成のためのプログラム及び方法及び装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |