CN114357943A - 一种通用高效Excel读取处理方法、工具、介质及设备 - Google Patents
一种通用高效Excel读取处理方法、工具、介质及设备 Download PDFInfo
- Publication number
- CN114357943A CN114357943A CN202111465168.6A CN202111465168A CN114357943A CN 114357943 A CN114357943 A CN 114357943A CN 202111465168 A CN202111465168 A CN 202111465168A CN 114357943 A CN114357943 A CN 114357943A
- Authority
- CN
- China
- Prior art keywords
- cell
- excel
- file
- entity class
- excel file
- 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.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开了一种通用高效Excel读取处理方法、工具、介质及设备,属于软件开发领域。该方法包括根据具体业务需求对导入的Excel文件创建实体类对象,并导入Excel文件相应的公共参数,以适配不同Excel文件的不同格式;利用Apache POI技术读取Excel文件,并判断Excel文件的文件格式,根据文件格式的不同,利用实体类对象中相应的自定义注解和公共参数,对Excel文件采用不同的处理过程进行数据处理以及统一异常处理。本申请在同时支持.xlx和.xlsx格式导入;通过参数化来解决不同业务Excel文件的表头占位、关键列设定、指定工作簿导入等问题;统一解决日期格式、公式读取、科学计数法等问题;实体类注解,方便表头设定和表头校验,得到数据结果。
Description
技术领域
本申请涉及软件开发技术领域,特别涉及一种通用高效Excel读取处理方法、工具、介质及设备。
背景技术
软件实际应用中,有很多场景需要用到Excel文件上传,且很多场景下的Excel的文件大小、数据量都是比较大的,故Excel文件上传处理程序需要高效地对Excel文件进行读取和解析。
面对各行各业、各种业务需求,Excel文件导入也存在较多复杂性:Excel文件导入时,数据文件可能存在多种版本格式如.xls或.xlsx都要能够统一适应;且在单个Excel文件表中存在多个Sheet工作簿,业务工作簿的指定也是问题;在数据表中的,表头占位问题和表尾可能出现无关业务的数据,都会影响导入;文件数据中,单元格的格式也包含多种格式,就在多种数据类型,如日期格式化、公式类型单元格数据读取、科学计数法等,都是需要处理的;在Excel文件导入开发中,针对不同表头的文件的开发这样比较麻烦是事情。
发明内容
针对现有技术存在表头占位和表尾的无关数据影响Excel文件的导入,多种版本格式无法统一适应,业务工作簿无法精确指定,文件数据类型需要处理的问题,本申请主要提供一种通用高效Excel读取处理方法、工具、介质及设备。
为了解决上述问题,本申请采用的一个技术方案是:提供一种通用高效Excel读取处理方法,其包括:
根据具体业务需求对待导入的Excel文件创建实体类对象,并导入Excel文件相应的公共参数,以适配Excel文件的文件格式;
利用Apache POI技术读取Excel文件,并判断Excel文件的文件格式,其中文件格式包括.xls格式和.xlsx格式;
根据文件格式的类型,利用实体类对象中相应的自定义注解和公共参数,对Excel文件进行对应的数据处理,其中
若数据处理的过程存在异常,则进行统一异常处理,输出异常对应的异常信息,若数据处理的过程不存在异常,则将数据处理的处理结果存储到实体类列表中。
本申请采用的另一个技术方案是:提供一种通用高效Excel读取处理工具,其包括:
用于根据具体业务需求对待导入的Excel文件创建实体类对象,并导入Excel文件相应的公共参数,以适配Excel文件的文件格式的模块;
用于利用Apache POI技术读取Excel文件,并判断Excel文件的文件格式的模块,其中文件格式包括.xls格式和.xlsx格式;
用于根据文件格式的类型,利用实体类对象中相应的自定义注解和公共参数,对Excel文件进行对应的数据处理的模块,其中
若数据处理的过程存在异常,则进行统一异常处理,输出异常对应的异常信息,若数据处理的过程不存在异常,则将数据处理的处理结果存储到实体类列表中。
本申请采用的另一个技术方案是:提供一种计算机可读存储介质,其存储有计算机指令,该计算机指令被操作以执行方案一中的通用高效Excel读取处理方法。
本申请采用的另一个技术方案是:提供一种计算机设备,其包括处理器和存储器,存储器存储有计算机指令,该计算机指令被操作以执行方案一中的通用高效Excel读取处理方法。
本申请的技术方案可以达到的有益效果是:本申请设计了一种通用高效Excel读取处理方法、工具、介质及设备。该方法采用自定义注解,在数据解析时可以获取字段注解来做数据格式化操作,并采用公共参数配置以应对不同数据格式样式的数据表,大大增强导入程序的通用性;自定义数据处理中心,可格式化日期字段,可直接读取带公式的单元格数据;采用统一异常处理,表头校验不通过或出现其他异常程序抛出相应异常信息。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本申请一种通用高效Excel读取处理方法的一个具体实施方式的示意图;
图2是本申请一种通用高效Excel读取处理方法的具体流程图;
图3是本申请一种通用高效Excel读取处理工具的一个具体实施方式的示意图。
通过上述附图,已示出本申请明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本申请构思的范围,而是通过参考特定实施例为本领域技术人员说明本申请的概念。
具体实施方式
下面结合附图对本申请的较佳实施例进行详细阐述,以使本申请的优点和特征能更易于被本领域技术人员理解,从而对本申请的保护范围做出更为清楚明确的界定。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
Excel文件导入时可能存在多种版本格式,这会导致多种版本格式(如.xlx文件格式和.xlsx文件格式)无法统一适应;在单个Excel文件中存在多张工作表,那么在进行数据处理的过程中,工作表指定也是问题;在工作表中,表头占位问题和表尾可能出现无关业务的数据会影响Excel文件的导入;在进行数据处理的过程中,单元格的格式存在着多种数据类型,如日期格式、公式类型、科学计数法等需要统一处理。
市面上绝大多数的Excel文件导入采用的是根据Wrokbook获取工作表Sheet,读取数据后再循环数据表处理数据的模式,而本申请还使用SAXParser解析器对导入的Excel文件进行读取解析,并且数据解析和数据处理同步进行。
针对以上提到的缺点,本申请具备以下特性:本申请同时支持.xlx文件格式和.xlsx文件格式的Excel文件导入;本申请配置公共参数,通过参数化来解决不同Excel文件的表头占位、关键列设定、指定工作簿导入等问题;本申请采用统一数据格式化处理,统一解决日期格式、公式读取、科学计数法等问题;本申请通过创建实体类对象,方便表头设置和表头校验,得到数据结果;本申请针对需要导入的Excel文件生成相应实体类对象,并传入指定公共参数值,即可完成Excel文件的数据读取,无需干预数据读取过程。
下面以具体地实施例对本申请的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本申请的实施例进行描述。
图1示出了本申请一种通用高效Excel读取处理方法的一个具体实施方式,在该具体实施方式中,通用高效Excel读取处理方法主要包括:
步骤S101,根据具体业务需求对待导入的Excel文件创建实体类对象,并导入Excel文件相应的公共参数,以适配Excel文件的文件格式。
本实施方式中,根据具体业务需求创建一定数量的实体类对象,实体类对象采用自定义注解,在相应的数据字段上添加@Excel注解,从而在数据解析时可以获取该数据字段的注解来进行数据格式化操作;通过注解方式映射数据字段去匹配Excel文件的表头字段,可以用作表头校验和字段赋值;在数据表头有调整时只需要调整相应的实体类对象中的数据字段即可,增强了本方法的灵活性。针对多个待导入的Excel文件的不同文件格式,传入对应的公共参数,解决表头占位、关键列设定、指定工作簿导入等问题,大大增强了本方法的通用性。
本申请需要说明的是,针对一份待导入的Excel文件,只能映射一个实体类,一个实体类中根据具体业务需求,包含一定数量的对象,即数据字段,也就是说实体类对象中为具体的业务需要的数据字段。例如,一份待导入的Excel文件中的工作表Sheet1里面存在订单号、运单号以及下单时间三列,但是具体业务需求只用到订单号和运单号,那么需要创建的实体类对象中就要创建订单号和运单号的数据字段。在某一数据字段上设置@Excel注解,注解name=”订单编号”,即声明工作表中需要有订单编号这一列,才能将工作表中的订单编号和物流运单编号的数据读取到后台。
需要说明的是,目前定义的公共参数有:
titleCheck:表头校验参数,表示是否进行表头校验,默认为true,进行表头校验;
xlsEnable:.xls格式允许导入参数,表示是否允许.xls后缀格式的Excel文件的导入,默认为true,允许导入;
xlsxEnable:.xlsx格式允许导入参数,表示是否允许.xlsx后缀格式的Excel文件的导入,默认为true,允许导入;
singleSheet:单一工作表参数,表示是否只导入单一工作表,默认为true,一个Excel文件只导入一张工作表Sheet,多余的忽略;
sheetNum:工作表数目参数,表示Excel文件的工作表Sheet的数量,默认只导入一张工作表Sheet,导入多张的话,默认从sheetIndex开始往后取;
sheetIndex:工作表索引参数,表示需要导入工作表Sheet,默认为0,即导入第一张工作表Sheet1,singleSheet为true时有效,为false时,读取Excel文件内的所有工作表Sheet;
headRows:表头占位参数,表示表头占用的行数;
titleIndex:标题索引参数,表示表头字段和实体类对象的对应关系在哪一行,从0开始算,第一行为0;
keyIndex:关键字段参数,表示程序会以该字段判断excel该行数据是否有效,如果关键字段数据为空,则该行数据无效,主要作用是避免空行,默认以第一列,即A列作为关键列;
keyExclude:关键字段排除参数,表示如果keyIndex对应的列的值在keyExclude内,该行数据也当做无效处理;
dateFormat:日期格式化参数,表示导入时间处理格式;
mapSpecialKey:映射特殊密钥参数,表示当返回实体类列表List或List<Map>的结果为map时,是否采用特殊密钥key,默认设置为false,返回的密钥key为表头名称,在极特殊情况下,表头有重复,设置为true,则返回的密钥key为单元格编号,例如A-Z列。
在图1所示的具体实施方式中,通用高效Excel读取处理方法还包括:
步骤S102,利用Apache POI技术读取Excel文件,并判断Excel文件的文件格式,其中文件格式包括.xls格式和.xlsx格式。
本实施方式中,Apache POI技术是用Java编写的免费开源的跨平台的Java API,Apache POI计数提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。
在本申请的一个具体实例中,利用Apache POI技术读取Excel文件的数据到后台,并使用POIFSFileSystem.hasPOIFSHeader(inputstream)判断Excel文件的.xls格式;使用POIXMLDocument.hasOOXMLHeader(inputstream)判断Excel文件的.xlsx格式。
在图1所示的具体实施方式中,通用高效Excel读取处理方法还包括:
步骤S103,根据文件格式的类型,利用实体类对象中相应的自定义注解和公共参数,对Excel文件进行对应的数据处理,其中若数据处理的过程存在异常,则进行统一异常处理,输出异常对应的异常信息,若数据处理的过程不存在异常,则将数据处理的处理结果存储到实体类列表中。
本实施方式中,根据导入的Excel文件的文件格式是.xls格式还是.xlsx格式,进行不同的数据处理过程。在数据处理过程中采用统一异常处理,在表头校验不一致或出现其他异常程序时抛出相应的异常信息。
在本申请的一个具体实施例中,根据文件格式的类型,利用实体类对象中相应的自定义注解和公共参数,对Excel文件进行对应的数据处理,进一步包括:若文件格式为.xls格式,则通过工作薄解析的方式,利用实体类对象中相应的自定义注解和公共参数中相应的参数,读取解析Excel文件;若文件格式为.xlsx格式,则利用自定义SAX解析的方式,利用实体类对象中相应的自定义注解和公共参数中相应的参数,读取解析Excel文件。
本实施例中,.xls格式的Excel文件,采用工作薄解析的方式解析数据,在数据解析时采用自定义注解可以获取字段注解来做数据格式化操作。.xlsx格式的Excel文件,采用自定义SAX解析的方式解析数据,边解析边处理数据,减少系统资源占用,解决超大文件导入导致系统内存溢出问题。
需要说明的是,目前定义的实体类对象相关的自定义注解属性有:
format:对时间字段进行格式化;
name:代表表头名称;
width:指导出时Excel文件中每列的宽度,其单位为字符,一个汉字等于2个字符;
rm0Suffix:是否去除.0后缀,默认设置为true,表示不去除后缀,需要去除后缀可设置为true;
convertENum:是否将科学计数法数据转换为正常数据,默认设置false,表示不需要转换,需要转换可设置为true;
trim:是否去除前后空格,默认设置为true,表示去除前后空格,需要保留可设置为false。
在本申请的一个具体实施例中,通过工作薄解析的方式,利用实体类对象中相应的自定义注解和公共参数中相应的参数,读取解析Excel文件,进一步包括:创建Excel文件流,并利用Excel文件流生成Excel文件的工作簿,根据工作簿获取Excel文件的多张工作表;根据公共参数中的工作表数目参数,对多张工作表进行判断,获取多张工作表中的待处理工作表;根据公共参数中的标题索引参数,获取待处理工作表的表头信息,并将表头信息缓存到映射集合中;将实体类对象中的表头字段与表头信息进行校验,若校验不一致,则直接返回对应的异常信息;若校验一致,则循环遍历待处理工作表中的每一单元格,获取其单元格信息,单元格信息包括单元格编号和单元格数值;对实体类对象、单元格信息及表头信息进行数据格式化处理,进行格式统一,并在数据格式化处理过程中,通过JAVA反射机制,获取与实体类对象的相关字段的自定义注解,得到相关字段的自定义注解的实体类属性值;通过自定义实体类反射处理工具,利用实体类属性值对实体类对象的指定字段进行赋值;通过公共参数中的关键字段参数和关键字段排除参数对赋值后的每行单元格的数据进行判断,若判断当前行单元格的数据存在有效数据,则进行数据抓取,并将当前行单元格的数据作为数据处理的处理结果存储到实体类列表中。
本实施例中,映射集合即Map集合,循环遍历待处理工作表中的每一单元格是先循环每行的单元格,在每行单元格中读取每列单元格的编号和数值,故单元格信息中的单元格编号指的是单元格列编号。针对.xls格式的Excel文件采用Wrokbook读取解析,再循环处理数据的方式,包括设置表头、表头校验、循环遍历每行每个单元格取值、数据格式化、实体类对象赋值、有效数据行判断的处理过程,并在处理过程中解决日期格式化和公式类型单元格数据获取的问题。
在本申请的一个具体实施例中,获取其单元格信息,单元格信息包括单元格编号和单元格数值,包括:利用单元格原生方法,判断单元格的单元格格式并作相应的取值处理,其中单元格格式包括日期格式和公式格式;根据单元格中的预存公式对单元格格式的取值进行计算,若预存公式能正常计算,则返回预存公式的计算值;若预存公式计算异常,则将预存公式当做字符串处理。
本实施例中,通过自定义取值的方法处理了单元格的异常数值。
在本申请的一个具体实例中,利用工作薄和公共参数中相应的参数对Excel文件设置表头,将表头信息存储在Map集合中,利用公共参数mapSpecialKey判断导入的工作表是否存在表头重复,若表头重复,则mapSpecialKey为true,实体类对象强转为map类型并且key为单元格列编号,使用put方法直接对实体类对象赋值;若表头不重复,则mapSpecialKey为false,key为表头名称,并通过实体类对象中相应的自定义注解进行表头校验,把实体类的所有字段放进Map集合里,然后循环判断每个字段是否存在“Excel”注解,如果存在“Excel”注解且该表头名称跟导入的表头名称一致,否则在表头校验不一致,抛出相应的异常信息;在表头校验一致时继续读取Excel文件中每个单元格的单元格编号和单元格数值,通过每列单元格编号,即单元格列编号的匹配已经获取到表头的Map集合(key为单元格列编号,Value如果是返回实体类对象则为列表头名称,如果是返回map则为单元格列编号),识别出该单元格对应的表头名称或单元格列编号(A-Z列),将实体类对象、单元格数值、表头名称或是单元格列编号传入数据格式化、实体类赋值方法,并利用公共参数中相应的参数抓取单元格中的有效数据。
需要说明的是,表头不用处理,只用于单元格列编号匹配出该单元格对应的表头名称。
在本申请的一个具体实例中,在通过实体类对象中相应的自定义注解进行表头校验时,如果表头校验失败,则抛出相应的异常信息,即意味着进程结束,说明Excel文件工作表的表头数据跟实体类设定的不一致,不满足既定业务需求。此外针对表头校验,利用公共参数声明表头校验是以实体类字段注解为准还是工作表表头为准,比如说导入的公共参数中以实体类对象注解为校验标准,在实体类中orderNo字段上有@Excel注解,注解name=“订单编号”logisticsNo字段上有@Excel注解,注解logisticsNo=“物流运单编号”,但是工作表上只有订单编号和下单时间,因为按实体类对象注解为标准进行校验,那么“物流运单编号”在工作表上没有,则抛异常信息。
在本申请的一个具体实施例中,利用自定义SAX解析的方式,利用实体类对象中相应的自定义注解和公共参数中相应的参数,读取解析Excel文件,进一步包括:通过ApachePOI技术中的文件路径单元创建Excel文件的XSSFReader对象,以读取Excel文件中的数据,并获取Excel文件的各个工作表的共享字符串表;通过SAXParser解析器创建Excel文件的XMLReader对象,并利用XMLReader对象解析Excel文件进行数据处理的开始触发方法,若开始触发方法完毕,则利用共享字符串表获得工作表的单元格内容;以及利用XMLReader解析Excel文件进行数据处理的结束触发方法,若结束触发方法完毕,则结束数据处理,其中单元格内容包括单元格索引值和单元格内容值。
本实施例中,针对.xlsx格式Excel文件,数据处理过程都是直接在解析Excel文件进行数据处理的开始触发方法、解析Excel文件进行数据处理的结束触发方法中执行的,采用SAXParser解析器解析数据,边解析边处理数据,减少系统资源占用,解决超大文件导入导致系统内存溢出问题。
在本申请的一个具体实例中,根据Excel文件获取文件流,根据文件流创建OPCPackage,创建XSSFReader对象,XSSFReader对象是用来读取海量Excel数据文件,主要原理是借助临时存储空间存储excel。SAX解析的核心就是自己写一个处理器。继承DefaultHandler就行,(DefaultHandler实现的是ContentsHandler接口),我们写的处理器里面会依次调用函数startElement()开始解析节点,函数characters()保存节点内容,函数endElement()结束解析节点,函数characters()方法要注意这个方法里面里newString(ch,start,length)得到的并不是单元格的值,得到的是单元格索引值或是单元格内容值,如果单元格类型是字符串、INLINESTR、数字、日期得到的是单元格索引值,如果单元格类型是布尔值、错误、公式,则是单元格内容值。得到单元格索引值了再从SharedStringsTable里面根据索引取,能够根据索引获取单元格的内容。
在本申请的一个具体实施例中,利用XMLReader对象解析Excel文件进行数据处理的开始触发方法,包括:利用XMLReader对象读取Excel文件当前行的单元格;根据单元格对应的节点属性获取单元格对应的属性值;根据属性值获取单元格样式,并根据单元格样式判断单元格的类型是否为日期格式,其中若是,则设置时间类型的属性标识,从公共参数中获取已定义的日期格式。则开始触发方法完毕,并得到单元格索引值,根据单元格索引值在共享字符串表中获取单元格内容值。
本实施例中,自定义判断和设置时间类型格式的方法,在方法中根据单元格节点属性获取属性值,然后再获取单元格样式,再可判断该单元格类型是否是日期类型,如果是日期类型,则将属性标识dateFlag设置为true,并从公共参数中获取定义好的日期格式。
在本申请的一个具体实施例中,利用XMLReader解析Excel文件进行数据处理的结束触发方法,还包括:根据预先设置好的时间类型的属性标识,对Excel文件中相应的单元格数值进行日期格式化处理;根据公共参数中的工作表数目参数和标题索引参数,获取多张工作表中的待处理工作表的表头信息,并将表头信息缓存到映射集合中;循环遍历待处理工作表中的每一单元格,获取其单元格信息,单元格信息包括单元格编号和单元格数值;将实体类对象、单元格信息及表头信息进行数据格式化处理,进行格式统一,并在数据格式化处理过程中,通过JAVA反射机制,获取与实体类对象的相关字段的自定义注解,得到自定义注解的实体类属性值;通过自定义实体类反射处理工具,利用通过实体类属性值对实体类对象的指定字段进行赋值;将实体类对象中的表头字段与表头信息进行校验,若校验不一致,则直接返回对应的异常信息;若校验一致,则通过公共参数中的关键字段参数和关键字段排除参数对赋值后的每行单元格的数据进行判断,若判断当前行单元格的数据存在有效数据,则进行数据抓取,并将当前行单元格的数据作为数据处理的处理结果存储到实体类列表中,并且结束触发方法完毕。
本实施例中,.xlsx格式采用SAXParser解析器读取解析,在解析过程中做数据处理,同样也包含:包括:设置表头、表头校验、循环遍历每行取每个单元格取值、数据格式化、实体类对象赋值、有效数据行判断的处理过程,并在解析过程中添加日期格式监听方法。SAX解析不需要像DOM解析那样在内存中建立一个dom对象,占用内存,SAX解析是逐行解析的,每次读入内存的只是一行xml文档内容,所以占用内存少,速度快,效率高点。故.xlsx文件格式导入处理效率高,支撑海量数据导入,支持五十万级数据。
需要说明的是,自定义实体类反射处理工具指的是EntityReflectUtil,其中setValueToField()方法的作用是给实体类对象的相关字段设置值,相当于调用set方法,通过传入实体类对象、字段名称以及数值,该方法利用JAVA反射机制将数值赋值给该实体类对象的指定字段。因为该实体类对象在处理过程中是Object类型,所以只能通过JAVA反射机制赋值。已知导入的实体类对象,在数据格式时也已知字段名称、格式化的数据,将这三个参数通过调用EntityReflectUtil.setValueToField()方法即可实现实体类对象的赋值。
图2是本申请一种通用高效Excel读取处理方法的具体流程图。
在图2所示的具体实例中,针对待导入的Excel文件,创建需要导入的实体类对象,目的是为了方便开发调整和维护。当需要调整字段或增删字段时,只需要维护实体类对象即可。针对待导入的Excel文件,导入需要的公共参数,可以适配Excel文件的不同文件格式,增强本方法的通用性。然后通过Apache POI技术读取判断文件格式并作相应的数据处理,其中针对.xls格式,文件流生成Wrokbook:创建HSSFWorkbook(inputstream)生成工作薄Wrokbook;设置表头:根据工作薄Wrokbook获取工作表Sheet,用公共参数sheetNum判断需要处理的工作表Sheet有哪些,用公共参数titleIndex指定单元格编号,获取表头信息,并利用公共参数mapSpecialKey将表头信息缓存到Map集合,其中如果mapSpecialKey为true则Map集合的key为单元格编号,反之则为表头上的值;表头校验:通过JAVA反射获得实体类对象上的表头注解与获取到的表头信息进行校验,校验完成后,如果Excel表上的表头字段与实体类对象定义的表头存在不一致,则直接抛出异常并返回异常信息;循环遍历每行每个单元格取值:获取整个电子表格,循环每一行其中在循环每一个单元格获取其单元格编号和其数值;数据格式化:获取到单元格后,传入实体类对象、单元格数值及表头信息,在方法中通过JAVA反射机制,获取导入实体类对象有关Excel的注解,如去除.0后缀、科学计数法处理等;实体类对象赋值:以上完成数据格式化后,用实体类和字段名通过自定义EntityReflectUtil反射设置实体类属性值给实体类字段赋值,相当于Java的set方法。判断该行数据是否算有效数据:通过公共参数keyIndex和keyExclude判断该行数是否有算有效数据,如果判断为无效数据则不抓取其行数据值。
在图2所示的具体实例中,针对.xlsx格式,采用SAX解析Excel文件,通过根据filePath构建XSSFReader对象,然后通过SharedStringsTable获取Excel文件全部工作表Sheet的共享字符串表,再通过SAXParser创建XMLReader对象。利用XMLReader解析并做一下操作:
首先,利用XMLReader解析Excel文件进行数据处理的开始触发方法,即解析XML每个开始标签的触发方法:读取当前行单元格,并进行日期格式处理,判断日期格式,设置时间类型。返回单元格的值:单元格内容标签<v>结束时自动触发;
然后,利用XMLReader解析Excel文件进行数据处理的结束触发方法,即解析XML到结束标签的触发方法:根据时间类型做日期格式处理;设置表头;循环遍历每行每个单元格取值;数据格式化;实体类对象赋值;表头校验;判断该行数据是否算有效数据;
最后,将.xls格式或.xlsx格式的Excel文件的处理结果返回到实体类列表List或List<Map>中。
图3示出了本申请一种通用高效Excel读取处理工具的具体实施方式,在该具体实施方式中,通用高效Excel读取处理工具主要包括:
模块301,用于根据具体业务需求对待导入的Excel文件创建实体类对象,并导入Excel文件相应的公共参数,以适配Excel文件的文件格式的模块;
模块302,用于利用Apache POI技术读取Excel文件,并判断Excel文件的文件格式的模块,其中文件格式包括.xls格式和.xlsx格式;
模块303,用于根据文件格式的类型,利用实体类对象中相应的自定义注解和公共参数,对Excel文件进行对应的数据处理的模块,其中若数据处理的过程存在异常,则进行统一异常处理,输出异常对应的异常信息,若数据处理的过程不存在异常,则将数据处理的处理结果存储到实体类列表中。
本实施方式中,通过创建实体类对象和导入公共参数对需要导入的Excel文件进行适配,增强本通用高效Excel读取处理工具的灵活性和通用性;对.xlsx格式的Excel文件采用自定义SAX解析,体现了本通用高效Excel读取处理工具的高效性;通过程序处理入口,首先Apache POI技术读取Excel文件,然后判断Excel文件的文件格式,然后根据文件格式的类型的不同进行对应的数据处理过程,根据导入的实体类对象匹配和映射工作表中的单元格数据,最后将数据处理的处理结果存储到实体类列表,其中程序处理入口指的是程序创建的类、方法等。
本申请提供的通用高效Excel读取处理工具,可用于执行上述任一实施例描述的通用高效Excel读取处理方法,其实现原理和技术效果类似,在此不再赘述。
在本申请的一个具体实施例中,本申请一种通用高效Excel读取处理工具中的各功能模块可直接在硬件中、在由处理器执行的软件模块中或在两者的组合中。
软件模块可驻留在RAM存储器、快闪存储器、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可装卸盘、CD-ROM或此项技术中已知的任何其它形式的存储介质中。示范性存储介质耦合到处理器,使得处理器可从存储介质读取信息和向存储介质写入信息。
处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application Specific Integrated Circuit,简称:ASIC)、现场可编程门阵列(英文:Field Programmable Gate Array,简称:FPGA)或其它可编程逻辑装置、离散门或晶体管逻辑、离散硬件组件或其任何组合等。通用处理器可以是微处理器,但在替代方案中,处理器可以是任何常规处理器、控制器、微控制器或状态机。处理器还可实施为计算装置的组合,例如DSP与微处理器的组合、多个微处理器、结合DSP核心的一个或一个以上微处理器或任何其它此类配置。在替代方案中,存储介质可与处理器成一体式。处理器和存储介质可驻留在ASIC中。ASIC可驻留在用户终端中。在替代方案中,处理器和存储介质可作为离散组件驻留在用户终端中。
在本申请的另一个具体实施方式中,一种计算机可读存储介质,其存储有计算机指令,计算机指令被操作以执行任一实施例中的通用高效Excel读取处理方法。
在本申请的另一个具体实施方式中,一种计算机设备,其包括处理器和存储器,存储器存储有计算机指令,该计算机指令被操作以执行任一实施例中的通用高效Excel读取处理方法。
在本申请所提供的几个实施例中,应该理解到,所揭露的工具和方法,可以通过其它的方式实现。例如,以上所描述的工具实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,工具或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
以上所述仅为本申请的实施例,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。
Claims (10)
1.一种通用高效Excel读取处理方法,其特征在于,包括:
根据具体业务需求对待导入的Excel文件创建实体类对象,并导入所述Excel文件相应的公共参数,以适配所述Excel文件的文件格式;
利用Apache POI技术读取所述Excel文件,并判断所述Excel文件的文件格式,其中所述文件格式包括.xls格式和.xlsx格式;
根据所述文件格式的类型,利用所述实体类对象中相应的自定义注解和所述公共参数,对所述Excel文件进行对应的数据处理,其中
若所述数据处理的过程存在异常,则进行统一异常处理,输出所述异常对应的异常信息,若所述数据处理的过程不存在异常,则将所述数据处理的处理结果存储到实体类列表中。
2.如权利要求1所述的通用高效Excel读取处理方法,其特征在于,所述根据所述文件格式的类型,利用所述实体类对象中相应的自定义注解和所述公共参数,对所述Excel文件进行对应的数据处理,进一步包括:
若所述文件格式为所述.xls格式,则通过工作薄解析的方式,利用所述实体类对象中相应的自定义注解和所述公共参数中相应的参数,读取解析所述Excel文件;
若所述文件格式为所述.xlsx格式,则利用自定义SAX解析的方式,利用所述实体类对象中相应的自定义注解和所述公共参数中相应的参数,读取解析所述Excel文件。
3.如权利要求2所述的通用高效Excel读取处理方法,其特征在于,所述通过工作薄解析的方式,利用所述实体类对象中相应的自定义注解和所述公共参数中相应的参数,读取解析所述Excel文件,进一步包括:
创建Excel文件流,并利用所述Excel文件流生成所述Excel文件的工作簿,根据所述工作簿获取所述Excel文件的多张工作表;
根据所述公共参数中的工作表数目参数,对多张所述工作表进行判断,获取多张所述工作表中的待处理工作表;
根据所述公共参数中的标题索引参数,获取所述待处理工作表的表头信息,并将所述表头信息缓存到映射集合中;
将所述实体类对象中的表头字段与所述表头信息进行校验,若校验不一致,则直接返回对应的异常信息;
若校验一致,则循环遍历所述待处理工作表中的每一单元格,获取其单元格信息,所述单元格信息包括单元格编号和单元格数值;
对所述实体类对象、所述单元格信息及所述表头信息进行数据格式化处理,进行格式统一,并在所述数据格式化处理过程中,通过JAVA反射机制,获取与所述实体类对象的相关字段的自定义注解,得到所述相关字段的自定义注解的实体类属性值;
通过自定义实体类反射处理工具,利用所述实体类属性值对所述实体类对象的指定字段进行赋值;
通过所述公共参数中的关键字段参数和关键字段排除参数对赋值后的每行单元格的数据进行判断,若判断当前行单元格的数据存在有效数据,则进行数据抓取,并将所述当前行单元格的数据作为所述数据处理的处理结果存储到所述实体类列表中。
4.如权利要求2所述的通用高效Excel读取处理方法,其特征在于,所述利用自定义SAX解析的方式,利用所述实体类对象中相应的自定义注解和所述公共参数中相应的参数,读取解析所述Excel文件,进一步包括:
通过Apache POI技术中的文件路径单元创建所述Excel文件的XSSFReader对象,以读取所述Excel文件中的数据,并获取所述Excel文件的各个工作表的共享字符串表;
通过SAXParser解析器创建所述Excel文件的XMLReader对象,并利用所述XMLReader对象解析所述Excel文件进行数据处理的开始触发方法,若所述开始触发方法完毕,则利用所述共享字符串表获得所述工作表的单元格内容;以及
利用XMLReader解析所述Excel文件进行数据处理的结束触发方法,若所述结束触发方法完毕,则结束数据处理,其中所述单元格内容包括单元格索引值和单元格内容值。
5.如权利要求4所述的通用高效Excel读取处理方法,其特征在于,所述利用所述XMLReader对象解析所述Excel文件进行数据处理的开始触发方法,包括:
利用所述XMLReader对象读取所述Excel文件当前行的单元格;
根据所述单元格对应的节点属性获取所述单元格对应的属性值;
根据所述属性值获取单元格样式,并根据所述单元格样式判断所述单元格的类型是否为日期格式,其中
若是,则设置时间类型的属性标识,从所述公共参数中获取已定义的日期格式。则所述开始触发方法完毕,并得到所述单元格索引值,根据所述单元格索引值在所述共享字符串表中获取所述单元格内容值。
6.如权利要求4所述的通用高效Excel读取处理方法,其特征在于,所述利用XMLReader解析所述Excel文件进行数据处理的结束触发方法,还包括:
根据预先设置好的时间类型的属性标识,对所述Excel文件中相应的单元格数值进行日期格式化处理;
根据所述公共参数中的工作表数目参数和标题索引参数,获取多张工作表中的待处理工作表的表头信息,并将所述表头信息缓存到映射集合中;
循环遍历所述待处理工作表中的每一单元格,获取其单元格信息,所述单元格信息包括单元格编号和单元格数值;
将所述实体类对象、所述单元格信息及所述表头信息进行数据格式化处理,进行格式统一,并在所述数据格式化处理过程中,通过JAVA反射机制,获取与所述实体类对象的相关字段的自定义注解,得到所述自定义注解的实体类属性值;
通过自定义实体类反射处理工具,利用通过所述实体类属性值对所述实体类对象的指定字段进行赋值;
将所述实体类对象中的表头字段与所述表头信息进行校验,若校验不一致,则直接返回对应的异常信息;
若校验一致,则通过所述公共参数中的关键字段参数和关键字段排除参数对赋值后的每行单元格的数据进行判断,若判断当前行单元格的数据存在有效数据,则进行数据抓取,并将所述当前行单元格的数据作为所述数据处理的处理结果存储到所述实体类列表中,并且所述结束触发方法完毕。
7.如权利要求3所述的通用高效Excel读取处理方法,其特征在于,所述获取其单元格信息,所述单元格信息包括单元格编号和单元格数值,包括:
利用单元格原生方法,判断所述单元格的单元格格式并作相应的取值处理,其中所述单元格格式包括日期格式和公式格式;
根据所述单元格中的预存公式对所述单元格格式的取值进行计算,若所述预存公式能正常计算,则返回所述预存公式的计算值;若所述预存公式计算异常,则将所述预存公式当做字符串处理。
8.一种通用高效Excel读取处理工具,其特征在于,包括:
用于根据具体业务需求对待导入的Excel文件创建实体类对象,并导入所述Excel文件相应的公共参数,以适配所述Excel文件的文件格式的模块;
用于利用Apache POI技术读取所述Excel文件,并判断所述Excel文件的文件格式的模块,其中所述文件格式包括.xls格式和.xlsx格式;
用于根据所述文件格式的类型,利用所述实体类对象中相应的自定义注解和所述公共参数,对所述Excel文件进行对应的数据处理的模块,其中
若所述数据处理的过程存在异常,则进行统一异常处理,输出所述异常对应的异常信息,若所述数据处理的过程不存在异常,则将所述数据处理的处理结果存储到实体类列表中。
9.一种计算机可读存储介质,其存储有计算机指令,其特征在于,所述计算机指令被操作以执行权利要求1-7中任一项所述的通用高效Excel读取处理方法。
10.一种计算机设备,其包括处理器和存储器,所述存储器存储有计算机指令,其中所述处理器操作所述计算机指令以执行权利要求1-7中任一项所述的通用高效Excel读取处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111465168.6A CN114357943A (zh) | 2021-12-03 | 2021-12-03 | 一种通用高效Excel读取处理方法、工具、介质及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111465168.6A CN114357943A (zh) | 2021-12-03 | 2021-12-03 | 一种通用高效Excel读取处理方法、工具、介质及设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114357943A true CN114357943A (zh) | 2022-04-15 |
Family
ID=81096778
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111465168.6A Pending CN114357943A (zh) | 2021-12-03 | 2021-12-03 | 一种通用高效Excel读取处理方法、工具、介质及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114357943A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115130443A (zh) * | 2022-06-28 | 2022-09-30 | 飞鸟鱼信息科技有限公司 | 表格数据处理方法、装置、电子设备及存储介质 |
CN115659934A (zh) * | 2022-12-09 | 2023-01-31 | 泰盈科技集团股份有限公司 | 一种表格文档中不同工作表列数据计算存储的方法 |
CN115860677A (zh) * | 2022-12-12 | 2023-03-28 | 中量工程咨询有限公司 | 一种构件工程量数据处理方法、系统、设备及存储介质 |
CN116757170A (zh) * | 2023-08-21 | 2023-09-15 | 成都数联云算科技有限公司 | 一种基于JAVA语言的Excel表格导入方法和系统 |
-
2021
- 2021-12-03 CN CN202111465168.6A patent/CN114357943A/zh active Pending
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115130443A (zh) * | 2022-06-28 | 2022-09-30 | 飞鸟鱼信息科技有限公司 | 表格数据处理方法、装置、电子设备及存储介质 |
CN115659934A (zh) * | 2022-12-09 | 2023-01-31 | 泰盈科技集团股份有限公司 | 一种表格文档中不同工作表列数据计算存储的方法 |
CN115659934B (zh) * | 2022-12-09 | 2023-03-07 | 泰盈科技集团股份有限公司 | 一种表格文档中不同工作表列数据计算存储的方法 |
CN115860677A (zh) * | 2022-12-12 | 2023-03-28 | 中量工程咨询有限公司 | 一种构件工程量数据处理方法、系统、设备及存储介质 |
CN115860677B (zh) * | 2022-12-12 | 2024-03-22 | 中量工程咨询有限公司 | 一种构件工程量数据处理方法、系统、设备及存储介质 |
CN116757170A (zh) * | 2023-08-21 | 2023-09-15 | 成都数联云算科技有限公司 | 一种基于JAVA语言的Excel表格导入方法和系统 |
CN116757170B (zh) * | 2023-08-21 | 2023-10-20 | 成都数联云算科技有限公司 | 一种基于JAVA语言的Excel表格导入方法和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114357943A (zh) | 一种通用高效Excel读取处理方法、工具、介质及设备 | |
CN109558575B (zh) | 在线表格编辑方法、装置、计算机设备及存储介质 | |
CN111367976B (zh) | 基于java反射机制的excel文件数据的导出方法及装置 | |
CN111400387A (zh) | 导入导出数据的转换方法、装置、终端设备及存储介质 | |
CN109766529B (zh) | 一种报表的生成方法及设备 | |
CN111290956B (zh) | 基于脑图的测试方法、装置、电子设备及存储介质 | |
CN110427188B (zh) | 单测断言程序的配置方法、装置、设备及存储介质 | |
CN109271315B (zh) | 脚本代码检测方法、装置、计算机设备及存储介质 | |
CN103235757B (zh) | 基于自动化造数对输入域测试对象进行测试的装置和方法 | |
CN110990411A (zh) | 数据结构的生成方法及装置、调用方法及装置 | |
CN110688315A (zh) | 接口代码检测报告生成方法、电子装置及存储介质 | |
CN110633258B (zh) | 日志插入方法、装置、计算机装置及存储介质 | |
CN113792138B (zh) | 报表生成方法、装置、电子设备及存储介质 | |
CN107368500B (zh) | 数据抽取方法及系统 | |
CN113760894A (zh) | 数据调取方法、装置、电子设备及存储介质 | |
CN111767161A (zh) | 远程调用深度识别方法、装置、计算机设备及可读存储介质 | |
CN112685253A (zh) | 前端报错日志采集方法、装置、设备及存储介质 | |
CN115599388B (zh) | 一种api接口文档生成方法、存储介质及电子设备 | |
CN109542890B (zh) | 数据修改方法、装置、计算机设备及存储介质 | |
CN108228688B (zh) | 一种基于xbrl的模板生成方法、系统及服务器 | |
CN115577689A (zh) | 一种表格组件的生成方法、装置、设备及介质 | |
CN111258838B (zh) | 验证组件生成方法、装置、存储介质及验证平台 | |
CN114186958A (zh) | 将列表数据导出为电子表格的方法、计算设备及存储介质 | |
CN114358596A (zh) | 指标计算方法及装置 | |
CN117573140B (zh) | 一种通过扫描代码生成文档的方法、系统及装置 |
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 |