CN115618827B - 防止电子表格系统堆栈溢出的计算方法及装置 - Google Patents
防止电子表格系统堆栈溢出的计算方法及装置 Download PDFInfo
- Publication number
- CN115618827B CN115618827B CN202211637336.XA CN202211637336A CN115618827B CN 115618827 B CN115618827 B CN 115618827B CN 202211637336 A CN202211637336 A CN 202211637336A CN 115618827 B CN115618827 B CN 115618827B
- Authority
- CN
- China
- Prior art keywords
- cell
- stack
- dependent
- current cell
- custom
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/166—Editing, e.g. inserting or deleting
- G06F40/174—Form filling; Merging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/166—Editing, e.g. inserting or deleting
- G06F40/177—Editing, e.g. inserting or deleting of tables; using ruled lines
- G06F40/18—Editing, e.g. inserting or deleting of tables; using ruled lines of spreadsheets
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Software Systems (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本申请公开了防止电子表格系统堆栈溢出的计算方法及装置,属于电子表格信息处理领域,具体包括:创建自定义堆栈;将目标单元格作为当前单元格,执行压栈步骤,包括:将当前单元格的单元格标识压入自定义堆栈,判断系统堆栈中单元格的数量是否达到预设的深度阈值;若达到深度阈值,则退出嵌套计算,将自定义堆栈中栈顶元素作为当前单元格,执行压栈步骤;若未达到深度阈值,则计算当前单元格,并判断当前单元格的依赖单元格是否存在依赖关系;若依赖单元格存在依赖关系,则将当前单元格的依赖单元格作为当前单元格,执行压栈步骤;若依赖单元格不存在依赖关系,则迭代执行退栈步骤至自定义堆栈为空,并将最近一次计算结果作为目标单元格的值。
Description
技术领域
本申请涉及电子表格信息处理技术领域,尤其涉及一种防止电子表格系统堆栈溢出的计算方法及装置。
背景技术
电子表格提供了大量的内置函数与多种类型的图表,多用于批量数据处理。电子表格支持表格导入、导出以及数据输入、输出、计算、排序、筛选等功能,能够帮助用户制作各种复杂的表格文档,进行繁琐的数据计算,并能对输入的数据进行各种复杂统计运算后显示为可视化的图表。被广泛应用于智能化办公、数据管理与统计等领域。
电子表格的各个单元格中的数据之间往往会因为计算公式而存在依赖关系,当计算一个单元格中的数值时,需要找出这个单元格的所有依赖单元格,并根据各个单元格之间的依赖顺序依次进行计算。但找寻依赖关系,构建依赖链以及确认依赖顺序是一个复杂且耗时的过程。针对这一问题一种递归计算方法应运而生,这种递归计算方法不需要构建依赖链,只需要找到当前单元格的上一层依赖单元格进行计算,若当前单元格存在多重依赖关系,则将当前单元格的上一层单元格作为当前单元格依次迭代计算即可,这种递归算法不需要提前构建依赖链,确认依赖顺序,每次递归计算只查找当前单元格的上一层依赖单元格,但当单元格依赖嵌套深度过大递归次数过多时就会造成系统堆栈溢出,导致计算失败甚至系统崩溃。
发明内容
本申请实施例通过提供一种防止电子表格系统堆栈溢出的计算方法及装置,解决了现有技术中普通表格公式计算复杂且耗时,递归计算方法虽然简单但容易造成堆栈溢出的问题,实现了既能使用递归计算方法又可以避免递归计算方法堆栈溢出。
第一方面,本申请实施例提供了一种防止电子表格系统堆栈溢出的计算方法,包括:为电子表格创建用于按系统堆栈计算顺序存储单元格标识的自定义堆栈;其中,所述自定义堆栈的可用存储空间是所述系统堆栈的几千倍;将目标单元格作为当前单元格,执行压栈步骤;所述压栈步骤包括:将所述当前单元格的单元格标识压入所述自定义堆栈,并在计算所述当前单元格之前判断所述系统堆栈中单元格的数量是否达到预设的深度阈值;若所述系统堆栈中单元格的数量达到所述深度阈值,则退出系统堆栈的嵌套计算,将所述自定义堆栈中栈顶的单元格标识所对应的单元格作为当前单元格,并计算所述当前单元格,即将所述当前单元格压入所述系统堆栈;若所述系统堆栈中单元格的数量未达到所述深度阈值,则计算当前单元格,并判断所述当前单元格的依赖单元格是否存在依赖关系;若所述当前单元格的依赖单元格存在依赖关系,则将所述当前单元格的依赖单元格作为当前单元格,执行所述压栈步骤;若所述当前单元格的依赖单元格不存在依赖关系,则迭代执行退栈步骤至所述自定义堆栈为空,并将最近一次计算结果作为所述目标单元格的值;所述退栈步骤包括:将所述自定义堆栈栈顶的所述单元格标识所对应的单元格压入系统堆栈并计算,弹出所述自定义堆栈中完成计算的所述单元格标识。
结合第一方面,在第一种可能的实现方式中,所述将所述当前单元格的单元格标识压入所述自定义堆栈,包括:在所述电子表格的计算引擎上创建计算函数;其中,所述计算函数包含多个用于表示所述单元格标识的参数;利用所述计算函数获取所述单元格标识;在所述计算函数的入口把所述单元格标识压入所述自定义堆栈。
结合第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述单元格标识包括:所述单元格所在的工作表名、行号与列号。
结合第一方面,在第三种可能的实现方式中,所述退出系统堆栈的嵌套计算,包括:调用计算引擎利用全局变量令嵌套函数退出所述嵌套计算,使得系统堆栈清空。
结合第一方面,在第四种可能的实现方式中,所述计算当前单元格,包括:调用计算引擎,并为所述当前单元格创建局部变量;其中,所述局部变量会被自动压入所述系统堆栈进行计算。
结合第一方面,在第五种可能的实现方式中,所述判断所述当前单元格的依赖单元格是否存在依赖关系,包括:根据单元格信息判断所述依赖单元格是否存在公式;若所述当前单元格的所述依赖单元格存在公式则所述依赖单元格存在依赖关系;若所述当前单元格的所述依赖单元格不存在公式则所述依赖单元格不存在依赖关系。
结合第一方面,在第六种可能的实现方式中,所述深度阈值是根据多次系统堆栈溢出而确定的一个安全数值。
第二方面,本申请实施例提供了一种防止电子表格系统堆栈溢出的计算装置,包括:创建模块,用于为电子表格创建用于按系统堆栈计算顺序存储单元格标识的自定义堆栈;其中,所述自定义堆栈的可用存储空间是所述系统堆栈的几千倍;压栈模块,用于将目标单元格作为当前单元格,执行压栈步骤;所述压栈步骤包括:将所述当前单元格的单元格标识压入所述自定义堆栈,并在计算所述当前单元格之前判断所述系统堆栈中单元格的数量是否达到预设的深度阈值;退出嵌套计算模块,用于若所述系统堆栈中单元格的数量达到所述深度阈值,则退出系统堆栈的嵌套计算,将所述自定义堆栈中栈顶的单元格标识所对应的单元格作为当前单元格,并计算所述当前单元格,即将所述当前单元格压入所述系统堆栈;判断模块,用于若所述系统堆栈中单元格的数量未达到所述深度阈值,则计算当前单元格,并判断所述当前单元格的依赖单元格是否存在依赖关系;迭代模块,用于若所述当前单元格的依赖单元格存在依赖关系,则将所述当前单元格的依赖单元格作为当前单元格,执行所述压栈步骤;终值模块,用于若所述当前单元格的依赖单元格不存在依赖关系,则迭代执行退栈步骤至所述自定义堆栈为空,并将最近一次计算结果作为所述目标单元格的值;所述退栈步骤包括:将所述自定义堆栈栈顶的所述单元格标识所对应的单元格压入系统堆栈并计算,弹出所述自定义堆栈中完成计算的所述单元格标识。
结合第二方面,在第一种可能的实现方式中,所述将所述当前单元格的单元格标识压入所述自定义堆栈,包括:在所述电子表格的计算引擎上创建计算函数;其中,所述计算函数包含多个用于表示所述单元格标识的参数;利用所述计算函数获取所述单元格标识;在所述计算函数的入口把所述单元格标识压入所述自定义堆栈。
结合第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述单元格标识包括:所述单元格所在的工作表名、行号与列号。
结合第二方面,在第三种可能的实现方式中,所述退出系统堆栈的嵌套计算,包括:调用计算引擎利用全局变量令嵌套函数退出所述嵌套计算,使得系统堆栈清空。
结合第二方面,在第四种可能的实现方式中,所述计算当前单元格,包括:调用计算引擎,并为所述当前单元格创建局部变量;其中,所述局部变量会被自动压入所述系统堆栈进行计算。
结合第二方面,在第五种可能的实现方式中,所述判断所述当前单元格的依赖单元格是否存在依赖关系,包括:根据单元格信息判断所述依赖单元格是否存在公式;若所述当前单元格的所述依赖单元格存在公式则所述依赖单元格存在依赖关系;若所述当前单元格的所述依赖单元格不存在公式则所述依赖单元格不存在依赖关系。
结合第二方面,在第六种可能的实现方式中,所述深度阈值是根据多次系统堆栈溢出而确定的一个安全数值。
本申请实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:
本申请实施例提供了一种防止电子表格系统堆栈溢出的计算方法及装置,通过设置自定义堆栈,添加深度阈值以及判断系统堆栈当前深度的方法,有效控制了系统堆栈中单元格的嵌套计算深度,解决了递归计算方法容易造成堆栈溢出的问题,实现了既能保留递归计算方法简单与快速的优点,同时又可以解决递归计算方法容易导致堆栈溢出的问题。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对本申请实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的防止电子表格系统堆栈溢出的计算方法的流程图;
图2为本申请实施例提供的将单元格标识压入自定义堆栈的流程示意图;
图3为本申请实施例提供的防止电子表格系统堆栈溢出的计算装置的示意图;
图4为本申请实施例提供的嵌套计算时的系统堆栈示意图;
图5A为本申请实施例提供的当前单元格不存在依赖单元格时系统堆栈的示意图;
图5B为本申请实施例提供的当前单元格不存在依赖单元格时自定义堆栈的示意图;
图6为本申请实施例提供的电子表格示意图;
图7为本申请实施例提供的设备示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
以下对本申请实施例涉及的部分技术做出说明,以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本申请的范围和精神。同样,为了清楚和简明,以下的描述中省略了部分对公知功能和结构的描述。
自定义堆栈:在本申请实施例中,是为解决系统堆栈在进行递归计算时易引发的系统堆栈溢出而创建的一个堆栈,自定义堆栈的可用存储空间是系统堆栈的几千倍。自定义堆栈用于压入单元格的单元格标识,系统堆栈用于计算单元格,压入单元格的局部变量。自定义堆栈所压入的单元格顺序与系统堆栈保持一致。
计算函数:在本申请实施例中,是一种控制单元格标识在自定义堆栈中压入与弹出的方法,用于控制自定义堆栈中单元格的压入顺序与系统堆栈保持一致。所有压入自定义堆栈的单元格标识都从计算函数的入口进入,在计算函数的出口弹出。
全局变量:全局变量用于记录系统堆栈嵌套层数,嵌套层数能够反映系统堆栈中的单元格数量。每进行一次嵌套计算,全局变量增1,直至退出嵌套计算系统堆栈被清空时,全局变量也跟着归零。在本申请实施例中,每在计算函数的入口将单元格标识压入自定义堆栈一次,全局变量增1,在计算函数出口全局变量会减1,全局变量始终与系统堆栈中的单元格数量保持一致。
如图6所示,当鼠标选中一个单元格时(数值12所在的单元格),在电子表格上方会显示当前选中的单元格位置标识(B1)以及单元格中的公式(=C1/2)。在图6中单元格A1依赖单元格B1,单元格B1依赖单元格C1,单元格C1依赖单元格D1,单元格D1依赖单元格E1,故可以整理出一条依赖链:A1->B1->C1->D1->E1,按照这个依赖链,如果需要计算A1,则需要通过单元格E1中的数值,计算出单元格D1,再计算出单元格C1,再计算出单元格B1,最后算出单元格A1。如图4所示,当计算机计算单元格A1时,在计算的过程中系统会为单元格A1创建一些局部变量存入系统堆栈,发现单元格A1依赖单元格B1,于是又找到单元格B1开始计算,在计算过程中又会为单元格B1创建一些局部变量存入系统堆栈,以此类推,直至找到一个不存在依赖单元格的单元格E1(或已经计算出结果的单元格)才能计算出单元格D1,C1,B1与A1。其中,单元格A1、B1、C1、D1与E1以及单元格中的公式仅用于解释说明,不用于对本申请实施例保护范围的限制。
需要说明的是,上述A1->B1->C1->D1->E1是本申请实施例中对依赖链的一种表示形式,其中的“->”用于指示单元格之间的单向依赖关系,亦可用“<-”指示单元格之间的单向被依赖关系。本领域技术人员在说明依赖链时可采用其他多种表示形式,不用于对本申请实施例保护范围的具体限制。此外,在本申请实施例中所述的方法并不直接使用依赖链,而是每次只找当前单元格的依赖单元格,在迭代的过程中所找到的每一个依赖单元格的顺序恰好与依赖链顺序一致。
图1是本申请实施例提供的防止电子表格系统堆栈溢出的计算方法的流程示意图,包括步骤101至步骤113。其中,图1仅为本申请实施例示出的一种执行顺序,并不代表电子表格公式按需计算方法的唯一执行顺序,在可实现最终结果的情况下,图1所示出的步骤可以被并列或颠倒执行。
步骤101:为电子表格创建自定义堆栈。在本申请实施例中,系统堆栈通常无法人为控制,在某些情况下其存储空间只有1M,为电子表格创建的自定义堆栈存储空间可达几个G,能够存储大量数据,可以防止系统堆栈达到深度阈值后数据丢失。如图7所示系统堆栈与自定义堆栈都运行于系统存储器内。
步骤102:将目标单元格作为当前单元格。具体为,确定目标单元格,将目标单元格作为当前单元格开始执行压栈步骤。在本申请实施例中,目标单元格是真正计算的单元格,当前单元格是目标单元格开始执行压栈步骤或在计算目标单元格的过程中需要被计算的依赖链上的其他单元格。在本申请实施例中,存在依赖链A1->B1->C1->D1->E1,若确定单元格A1为目标单元格,则当前单元格依次为单元格A1、B1、C1、D1与E1。
执行压栈步骤,压栈步骤包括步骤103至步骤113,具体如下:
步骤103:将当前单元格的单元格标识压入自定义堆栈。步骤103的具体实现方式如图2所示,包括步骤201至步骤203,具体为:
步骤201:在所述电子表格的计算引擎上创建计算函数。其中,所述计算函数包含多个用于表示所述单元格标识的参数。具体地,在本申请实施例中,计算函数一种示例如下:Calculate(string worksheetName, int row, int col),其中worksheetName,row与col是计算函数中所包含的多个参数,与单元格标识中的多个信息一一对应,计算函数能够用来识别并获取单元格标识。
步骤202:利用计算函数获取单元格标识。
步骤203:在计算函数的入口把单元格标识压入自定义堆栈。具体地,计算函数Calculate()在方法的入口将单元格标识压入自定义堆栈。例如,在步骤103中选中单元格A1时表格上方有公式,故A1存在依赖单元格,将单元格A1对应的表名,行号与列号压入自定义堆栈。需要注意的是,单元格标识是一种能够唯一确定一个单元格的定位信息,在本申请实施例中使用表名,行号与列号可以唯一确定一个单元格,在不改变本申请实施例所述的方法的前提下,本领域技术人员可以利用其他能够唯一定位一个单元格的信息实现本申请所述的方法,亦可对这些唯一定位信息进行重新命名,仍属于本申请所保护的范围。
步骤104:判断系统堆栈中单元格数量是否达到深度阈值。具体为,在计算单元格时,系统会为单元格创建一些局部变量并将这些局部变量存入系统堆栈。为防止系统堆栈溢出,每次有单元格的局部变量进入系统堆栈时都会统计一次并与预设的深度阈值进行比较。其中,深度阈值是根据多次系统堆栈溢出而确定的一个安全数值。在本申请实施例中深度阈值示例性取3。由上述步骤可知单元格A1只是压入了自定义堆栈,还未计算,故单元格A1还未进入系统堆栈,此时系统堆栈中的单元格数量为0。此外,在本申请实施例中“系统堆栈中单元格数量”是为了便于理解而使用的一种表达方式,可以将其理解为全局变量的嵌套层数,也可将其理解为嵌套深度与深度阈值取模的余数,其中的嵌套深度可以理解为压栈步骤的执行次数。
若系统堆栈中单元格数量达到深度阈值,则执行步骤105至步骤106,具体如下:
步骤105:退出系统堆栈的嵌套计算。具体为,系统堆栈中单元格的数量达到深度阈值,会退出系统堆栈的嵌套计算。在系统堆栈中所压入的单元格都存在依赖关系,无法计算出目标单元格。计算引擎通过全局变量使嵌套函数退出嵌套计算,在退出嵌套计算的过程中系统堆栈也会弹出所有单元格的局部变量导致系统堆栈为空,自定义堆栈在没有计算出目标单元格之前会保留堆栈中的单元格标识。其中,系统堆栈无法人为控制,在退出计算或计算完成时系统堆栈会弹出其堆栈中的局部变量,进而使系统堆栈清空。
步骤106:将自定义堆栈中栈顶的单元格标识所对应的单元格作为当前单元格。具体为,在步骤105中还未计算出目标单元格,需要进行新一轮计算。将自定义堆栈栈顶的单元格标识所对应的单元格作为当前单元格重新执行压栈步骤。在本申请实施例中,在判断单元格C1的依赖单元格D1时发现达到阈值,此时系统堆栈中压入的单元格数量为3达到深度阈值,停止嵌套计算,使得系统堆栈被清空,在新一轮计算过程中先计算自定义堆栈栈顶的单元格标识所对应的单元格D1,即是开始计算单元格D1,系统为单元格D1创建的局部变量被压入系统堆栈。
若系统堆栈中单元格数量未达到深度阈值,则执行步骤107至步骤108,具体如下:
步骤107:计算当前单元格。具体地,在计算单元格时,系统会为单元格创建一些局部变量,并自动将这些局部变量存入系统堆栈;计算引擎根据当前单元格的公式确定当前单元格的依赖单元格。计算当前单元格即是当前单元格压入系统堆栈的过程。在计算当前单元格的过程中系统会找到当前单元格的依赖单元格进行计算,如果当前单元格的依赖单元格不存在依赖关系则可以直接通过依赖单元格计算出当前单元格;如果当前单元格的依赖单元格存在依赖关系则需要先计算出依赖单元格。
步骤108:判断当前单元格的依赖单元格是否存在依赖关系。具体为,根据单元格信息判断当前单元格的依赖单元格是否存在公式;若依赖单元格存在公式则依赖单元格存在依赖关系;若依赖单元格不存在公式则依赖单元格不存在依赖关系。例如,存在依赖链:A1->B1->C1->D1->E1,A1为目标单元格,将单元格A1作为当前单元格开始执行压栈步骤,则需要先将单元格B1、C1、D1与E1依次作为当前单元格计算出结果才能最终计算出目标单元格A1。单元格信息如图6所示,当鼠标选中单元格时即可在电子表格上方的单元格信息中看到所选中单元格的位置标识(B1)与单元格所使用的公式(=C1/2)。当选中单元格,若上方公式框中出现公式则该单元格存在依赖关系,公式中出现的位置标识所对应的单元格即为该单元格的依赖单元格,如选中单元格B1时上方的公式为=C1/2,则单元格C1为单元格B1的依赖单元格;若上方公式框中为空白,则该单元格不存在公式因此也不存在依赖关系。
若当前单元格的依赖单元格存在依赖关系,则执行步骤109,具体如下:
步骤109:将当前单元格的依赖单元格作为当前单元格。具体为,将当前单元格的依赖单元格作为当前单元格先进行计算,在返回执行压栈步骤时会首先执行步骤103,判断此时的当前单元格是否存在依赖关系,反复迭代执行直至找到依赖链末尾一个包含具体数值的单元格可以计算出每次迭代的当前单元格。
在本申请实施例中,步骤101至步骤109执行流程具体如下:在依赖链A1->B1->C1->D1->E1中,系统计算单元格A1时找到其依赖单元格B1,判断出单元格B1存在依赖关系,故需要先计算单元格B1,将单元格B1作为当前单元格执行压栈步骤,又找到单元格B1的依赖单元格C1,判断出单元格C1存在依赖关系,需要先计算出单元格C1,将单元格C1作为当前单元格执行压栈步骤,又找到单元格C1的依赖单元格D1,将单元格D1作为当前单元格执行压栈步骤,在根据步骤104判断单元格单元格D1时发现达到阈值,不再执行步骤107至步骤109。此时,单元格D1只压入了自定义堆栈,单元格C1进入了系统堆栈,但无法计算出其值。执行步骤105至步骤106,退出系统堆栈的嵌套计算,系统堆栈被清空,将此时自定义堆栈的栈顶单元格标识所对应的单元格D1作为当前单元格,开始计算单元格D1,使得单元格D1进入系统堆栈,在步骤108中判断时,单元格D1的依赖单元格E1不存在依赖关系,则执行步骤110至步骤113。
若当前单元格的依赖单元格不存在依赖关系,则执行退栈步骤,包括步骤110至步骤113,具体如下:
步骤110:判断自定义堆栈是否为空。
若自定义堆栈不为空,则执行步骤111至步骤112,具体如下:
步骤111:计算自定义堆栈的栈顶的单元格标识所对应的单元格。具体为,开始计算自定义堆栈栈顶的单元格标识所对应的单元格,在计算过程中该单元格会被压入系统堆栈,计算完成后系统堆栈会自动将其弹出。
步骤112:弹出自定义堆栈中完成计算的单元格标识。具体为,弹出自定义堆栈中完成计算的单元格标识,即弹出自定义堆栈栈顶的单元格标识。继续迭代执行退栈步骤至自定义堆栈为空。
若自定义堆栈为空,则执行步骤113,具体如下:
步骤113:将最近一次的计算结果作为目标单元格的值。
由上述实施例可知,将单元格D1作为当前单元格计算时,判断出单元格D1的依赖单元格E1不存在依赖关系,则执行步骤110至步骤113。具体为:此时自定义堆栈不为空,开始计算自定义堆栈栈顶单元格D1,在计算过程中会找到单元格D1的依赖单元格E1,此时系统堆栈与自定义堆栈如图5A与图5B所示,在系统堆栈中通过单元格E1计算出单元格D1,系统堆栈自动弹出完成计算的单元格E1与D1,自定义堆栈相应弹出计算完成的单元格,开始计算此时自定义堆栈栈顶的单元格标识对应的单元格C1,C1被压入系统堆栈,系统堆栈在计算单元格C1时会找到其依赖单元格D1进行计算,计算成功后弹出,同时弹出自定义堆栈中计算完成的单元格C1,迭代执行此步骤直至计算出最后一个单元格A1时自定义堆栈为空,将最近一次的计算结果即A1的计算结果作为目标单元格A1中的数值。
虽然本申请提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。本实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或客户端产品执行时,可以按照本实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。
如图3所示,本申请实施例还提供了防止电子表格系统堆栈溢出的计算装置300。该装置包括:创建模块301、压栈模块302、退出嵌套计算模块303、判断模块304、迭代模块305与终值模块306。
创建模块301用于为电子表格创建自定义堆栈。
压栈模块302用于将目标单元格作为当前单元格,执行压栈步骤;所述压栈步骤包括:将所述当前单元格的单元格标识压入所述自定义堆栈,并判断系统堆栈中单元格的数量是否达到预设的深度阈值。压栈模块302具体用于:确定目标单元格,将目标单元格作为当前单元格。在所述电子表格的计算引擎上创建计算函数;其中,所述计算函数包含多个用于表示所述单元格标识的参数;利用所述计算函数获取所述单元格标识;在计算函数的入口把单元格标识压入自定义堆栈。单元格的局部变量每次进入系统堆栈时都会统计并与预设的深度阈值进行比较。其中,深度阈值是根据多次系统系统溢出而确定的一个安全数值。
退出嵌套计算模块303用于若所述系统堆栈中单元格的数量达到所述深度阈值,则退出系统堆栈的嵌套计算,将所述自定义堆栈中栈顶的单元格标识所对应的单元格作为当前单元格,执行所述压栈步骤。退出嵌套计算模块303具体用于:在系统堆栈中所压入的单元格都存在依赖关系,无法计算出目标单元格。计算引擎通过全局变量使嵌套函数退出嵌套计算,在退出嵌套计算的过程中系统堆栈会自动弹出所有单元格的局部变量导致系统堆栈为空,自定义堆栈在没有计算出目标单元格之前会保留堆栈中的单元格标识。将自定义堆栈栈顶的单元格标识所对应的单元格作为当前单元格重新执行压栈步骤。
判断模块304用于若所述系统堆栈中单元格的数量未达到所述深度阈值,则计算当前单元格,并判断所述当前单元格的依赖单元格是否存在依赖关系。判断模块304具体用于:在计算单元格时,系统会为单元格创建一些局部变量并将这些局部变量存入系统堆栈;计算引擎根据当前单元格的公式确定当前单元格的依赖单元格。计算当前单元格即是当前单元格压入系统堆栈的过程。根据单元格信息判断当前单元格是否存在公式;若当前单元格存在公式则当前单元格存在依赖单元格;若当前单元格不存在公式则当前单元格不存在依赖单元格。
迭代模块305用于若所述当前单元格存在依赖单元格,则将所述当前单元格的依赖单元格作为当前单元格,执行所述压栈步骤。迭代模块305具体用于:在计算当前单元格的过程中发现当前单元格的计算需要依赖其他单元格,故系统会找到当前单元格的依赖单元格,如果依赖单元格不存在依赖关系则可以直接通过依赖单元格计算出当前单元格;若果依赖单元格存在依赖关系则需要先计算出依赖单元格。将当前单元格的依赖单元格作为当前单元格先进行计算,同时在返回执行压栈步骤。
终值模块306用于若所述当前单元格不存在依赖单元格,则迭代执行退栈步骤至所述自定义堆栈为空,并将最近一次计算结果作为所述目标单元格的值;所述退栈步骤包括:将所述自定义堆栈栈顶的所述单元格标识所对应的单元格压入系统堆栈并计算,弹出所述自定义堆栈中完成计算的所述单元格标识。终值模块306具体用于:迭代执行退栈步骤,当自定义堆栈不为空时,计算自定义堆栈栈顶的单元格标识所对应的单元格,在计算完成后将其弹出自定义堆栈直至将自定义堆栈中所有单元格标识所对应的单元格都计算出来,将最近一次的计算结果作为目标单元格中的值。
上述实施例阐明的装置或模块,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。为了描述的方便,描述以上装置时以功能分为各种模块分别描述。在实施本申请时可以把各模块的功能在同一个或多个软件和/或硬件中实现。当然,也可以将实现某功能的模块由多个子模块或子单元组合实现。
本申请中所述的方法、装置或模块可以以计算机可读程序代码方式实现控制器按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(英文:Application Specific Integrated Circuit;简称:ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC625D、AtmelAT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内部包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
本申请实施例还提供了一种设备,所述设备包括:处理器;用于存储处理器可执行指令的存储器;所述处理器执行所述可执行指令时,实现如本申请实施例所述的方法。
本申请实施例还提供了一种非易失性计算机可读存储介质,其上存储有计算机程序或指令,当该计算机程序或指令被执行时,使如本申请实施例中所述的方法被实现。
此外,在本发明的各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独存在,也可以两个或两个以上模块集成在一个模块中。
上述存储介质包括但不限于随机存取存储器(英文:Random Access Memory;简称:RAM)、只读存储器(英文:Read-Only Memory;简称:ROM)、缓存(英文:Cache)、硬盘(英文:Hard Disk Drive;简称:HDD)或者存储卡(英文:Memory Card)。所述存储器可以用于存储计算机程序指令。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的硬件的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,也可以通过数据迁移的实施过程中体现出来。该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,移动终端,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施方式采用递进的方式描述,各个实施方式之间相同或相似的部分互相参见即可,每个实施方式重点说明的都是与其他实施方式的不同之处。本申请的全部或者部分可用于众多通用或专用的计算机系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、移动通信终端、多处理器系统、基于微处理器的系统、可编程的电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
以上实施例仅用以说明本申请的技术方案,而非对本申请限制;尽管参照前述实施例对本申请进行了详细的说明,本领域普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请技术方案的范围。
Claims (10)
1.一种防止电子表格系统堆栈溢出的计算方法,其特征在于,包括:
为电子表格创建用于按系统堆栈计算顺序存储单元格标识的自定义堆栈;其中,所述自定义堆栈的可用存储空间是所述系统堆栈的几千倍;
将目标单元格作为当前单元格,执行压栈步骤;所述压栈步骤包括:将所述当前单元格的单元格标识压入所述自定义堆栈,并在计算所述当前单元格之前判断所述系统堆栈中单元格的数量是否达到预设的深度阈值;
若所述系统堆栈中单元格的数量达到所述深度阈值,则退出系统堆栈的嵌套计算,将所述自定义堆栈中栈顶的单元格标识所对应的单元格作为当前单元格,并计算所述当前单元格,即将所述当前单元格压入所述系统堆栈;
若所述系统堆栈中单元格的数量未达到所述深度阈值,则计算当前单元格,并判断所述当前单元格的依赖单元格是否存在依赖关系;
若所述当前单元格的依赖单元格存在依赖关系,则将所述当前单元格的依赖单元格作为当前单元格,执行所述压栈步骤;
若所述当前单元格的依赖单元格不存在依赖关系,则迭代执行退栈步骤至所述自定义堆栈为空,并将最近一次计算结果作为所述目标单元格的值;所述退栈步骤包括:将所述自定义堆栈栈顶的所述单元格标识所对应的单元格压入系统堆栈并计算,弹出所述自定义堆栈中完成计算的所述单元格标识。
2.根据权利要求1所述的方法,其特征在于,所述将所述当前单元格的单元格标识压入所述自定义堆栈,包括:
在所述电子表格的计算引擎上创建计算函数;其中,所述计算函数包含多个用于表示所述单元格标识的参数;
利用所述计算函数获取所述单元格标识;
在所述计算函数的入口把所述单元格标识压入所述自定义堆栈。
3.根据权利要求1或2所述的方法,其特征在于,所述单元格标识包括:
所述单元格所在的工作表名、行号与列号。
4.根据权利要求1所述的方法,其特征在于,所述退出系统堆栈的嵌套计算,包括:
调用计算引擎利用全局变量令嵌套函数退出所述嵌套计算,使得系统堆栈清空。
5.根据权利要求1所述的方法,其特征在于,所述计算当前单元格,包括:
调用计算引擎,并为所述当前单元格创建局部变量;其中,所述局部变量会被自动压入所述系统堆栈进行计算。
6.根据权利要求1所述的方法,其特征在于,所述判断所述当前单元格的依赖单元格是否存在依赖关系,包括:
根据单元格信息判断所述依赖单元格是否存在公式;
若所述当前单元格的所述依赖单元格存在公式则所述依赖单元格存在依赖关系;
若所述当前单元格的所述依赖单元格不存在公式则所述依赖单元格不存在依赖关系。
7.根据权利要求1所述的方法,其特征在于,所述深度阈值是根据多次系统堆栈溢出而确定的一个安全数值。
8.一种防止电子表格系统堆栈溢出的计算装置,其特征在于,包括:
创建模块,用于为电子表格创建用于按系统堆栈计算顺序存储单元格标识的自定义堆栈;其中,所述自定义堆栈的可用存储空间是所述系统堆栈的几千倍;
压栈模块,用于将目标单元格作为当前单元格,执行压栈步骤;所述压栈步骤包括:将所述当前单元格的单元格标识压入所述自定义堆栈,并在计算所述当前单元格之前判断所述系统堆栈中单元格的数量是否达到预设的深度阈值;
退出嵌套计算模块,用于若所述系统堆栈中单元格的数量达到所述深度阈值,则退出系统堆栈的嵌套计算,将所述自定义堆栈中栈顶的单元格标识所对应的单元格作为当前单元格,并计算所述当前单元格,即将所述当前单元格压入所述系统堆栈;
判断模块,用于若所述系统堆栈中单元格的数量未达到所述深度阈值,则计算当前单元格,并判断所述当前单元格的依赖单元格是否存在依赖关系;
迭代模块,用于若所述当前单元格的依赖单元格存在依赖关系,则将所述当前单元格的依赖单元格作为当前单元格,执行所述压栈步骤;
终值模块,用于若所述当前单元格的依赖单元格不存在依赖关系,则迭代执行退栈步骤至所述自定义堆栈为空,并将最近一次计算结果作为所述目标单元格的值;所述退栈步骤包括:将所述自定义堆栈栈顶的所述单元格标识所对应的单元格压入系统堆栈并计算,弹出所述自定义堆栈中完成计算的所述单元格标识。
9.一种设备,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
所述处理器执行所述可执行指令时,实现如权利要求1至7中任意一项所述的方法。
10.一种非易失性计算机可读存储介质,其特征在于,包括用于存储计算机程序或指令,当该计算机程序或指令被执行时,使如权利要求1至7中任一项所述的方法被实现。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211637336.XA CN115618827B (zh) | 2022-12-20 | 2022-12-20 | 防止电子表格系统堆栈溢出的计算方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211637336.XA CN115618827B (zh) | 2022-12-20 | 2022-12-20 | 防止电子表格系统堆栈溢出的计算方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115618827A CN115618827A (zh) | 2023-01-17 |
CN115618827B true CN115618827B (zh) | 2023-03-10 |
Family
ID=84880588
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211637336.XA Active CN115618827B (zh) | 2022-12-20 | 2022-12-20 | 防止电子表格系统堆栈溢出的计算方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115618827B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107729240A (zh) * | 2017-09-30 | 2018-02-23 | 山东省科学院自动化研究所 | 嵌入式软件堆栈溢出检测方法和装置 |
CN112541033A (zh) * | 2020-12-01 | 2021-03-23 | 山东师范大学 | Vba栈结构的演示方法、系统、存储介质及计算机设备 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100483396C (zh) * | 2007-05-25 | 2009-04-29 | 金蝶软件(中国)有限公司 | 一种电子数据表、电子数据表的单元的计算方法和装置 |
US9075787B2 (en) * | 2010-11-30 | 2015-07-07 | Think-Cell Software Gmbh | Defining a reusable spreadsheet-function by extracting the function from a complex calculation in a spreadsheet document |
CN103500157A (zh) * | 2013-09-02 | 2014-01-08 | 用友软件股份有限公司 | 基于动态公式的表格填充装置和方法 |
US11397608B2 (en) * | 2020-05-18 | 2022-07-26 | Sudharshan Srinivasan | Multi-dimensional spreadsheet system enabling stack based programming using a virtual machine |
CN113239591B (zh) * | 2021-05-18 | 2023-10-27 | 北京科技大学 | 面向dcu集群的大规模有限元网格并行分区的方法及装置 |
-
2022
- 2022-12-20 CN CN202211637336.XA patent/CN115618827B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107729240A (zh) * | 2017-09-30 | 2018-02-23 | 山东省科学院自动化研究所 | 嵌入式软件堆栈溢出检测方法和装置 |
CN112541033A (zh) * | 2020-12-01 | 2021-03-23 | 山东师范大学 | Vba栈结构的演示方法、系统、存储介质及计算机设备 |
Also Published As
Publication number | Publication date |
---|---|
CN115618827A (zh) | 2023-01-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10963292B2 (en) | Techniques to manage virtual classes for statistical tests | |
Littlestone et al. | The weighted majority algorithm | |
US8584004B2 (en) | Asynchronous user defined functions | |
CN108256113B (zh) | 数据血缘关系的挖掘方法及装置 | |
CN111966912B (zh) | 基于知识图谱的推荐方法、装置、计算机设备及存储介质 | |
CN110363330B (zh) | 一种路径规划方法、装置、计算机设备及可读存储介质 | |
CN109840248B (zh) | 一种作业流程优化方法、装置及存储介质 | |
CN112748993A (zh) | 任务执行方法、装置、存储介质及电子设备 | |
CN115618827B (zh) | 防止电子表格系统堆栈溢出的计算方法及装置 | |
CN110569315A (zh) | 基于数据仓库的数据处理方法和装置 | |
CN111143463A (zh) | 一种基于主题模型的银行数据仓库的构建方法及装置 | |
US20130018773A1 (en) | Order matching | |
CN112396249A (zh) | 一种基于订座变化识别的市场需求值的计算方法和装置 | |
CN113127359A (zh) | 一种测试数据的获得方法及装置 | |
CN107203551B (zh) | 一种数据处理方法及装置 | |
CN111258724A (zh) | 一种分布式系统的数据处理方法、装置、设备和存储介质 | |
CN112948381B (zh) | 数据处理方法、系统、计算机设备及可读存储介质 | |
CN117290113B (zh) | 一种任务处理方法、装置、系统和存储介质 | |
CN113962415B (zh) | 持续集成环境的流水线优化方法与装置 | |
CN114897625A (zh) | 银行线上业务办理中的风险控制方法及装置 | |
CN114943615A (zh) | 交易处理方法、银行服务器和银行自助终端 | |
CN117376129A (zh) | 配置对账方法、装置、控制设备和存储介质 | |
CN115328906A (zh) | 企业资金扶持额度的测算方法及装置 | |
CN118779336A (zh) | 一种机构撤并的数据处理方法、装置、设备及介质 | |
CN114971873A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |