将电子数据表模型转换为可调用、经编译的例行程序的程序/方法

文档序号:6654928阅读:207来源:国知局
专利名称:将电子数据表模型转换为可调用、经编译的例行程序的程序/方法
技术领域
本发明涉及计算机程序以及操作这种程序的方法,用于将电子数据表模型转换为可调用的例行程序。
背景技术
电子数据表是许多人用来进行模型处理的交互式环境。它们非常普及,因为用户可以将数字、文本和公式输入到任何单元中并且所述公式可以是其它单元的函数。这就允许实现受控的且递增构造的复合模型,所述复合模型可以容易地被调试,因为可以容易地查看公式和结果值。
不同于传统的编程语言,电子数据表的模型作者不需要使他们关注排序所有将被执行的操作。相反地,对于每个单元,他们仅仅需要隐含地告知所述电子数据表该单元依赖的是哪些单元。相反,例如C语言的编程者需要明确地规定整个程序的精确操作顺序。
除了简单的算术运算符之外,电子数据表还带有嵌入的函数集合,并且还允许所述用户增加其它的函数,所述函数已经嵌入到例如C的高级语言中,或者已经从厂商(他们已经构造了那些函数)购得。
电子数据表的一个缺点是它们仅能在交互式电子数据表环境之中被访问。将非常有用的是,使得在电子数据表中的模型对使用传统语言的更大型系统的编程者来说是可利用的。
另一个缺点是对于交互式电子数据表环境,每个公式都必须被解释,这使得计算远慢于经编译的代码。所述差别可能是数百倍。
电子数据表也对依赖于它们的公司造成巨大的操作风险。IT部门所高度关注的是用户将电子数据表传送,而接收者将更改模型,使得它们不正确。使用户仅仅访问经编译的例行程序消除了这个问题。

发明内容
本发明涉及电子数据表模型被转换为可调用、经编译的例行程序。这允许以任何语言访问所述模型,并且加速所述电子数据表计算。它也对更广阔的观众打开了编码和分配模型的世界,因为相比较于知道如何以例如C的语言编程,更多的人知道如何去使用电子数据表。并且可以使得所述经编译的模型对其它操作系统和平台(如此,例如视窗电子数据表,像Excel,可以被转换为Unix上可调用的库)的用户是可利用的。
所述经编译的例行程序其本身也可以变为电子数据表内插式附件(这由本发明完成),其将允许电子数据表用户继续使用电子数据表来创建“超级模型”,所述超级模型在由本发明创建的经编译的模型之上构造。
将所述电子数据表转换为以能够从另一语言调用的经编译代码的过程有两个主要步骤首先将所述电子数据表转换为例如C的语言,第二步使用用于所述程序代码的语言的编译器将所述程序代码编译为计算机目标代码。使用已经可用的工具执行第二步,而第一步需要一些将在此描述的子步骤。
另外,人们必须首先创建函数库,所述函数模拟被嵌入到电子数据表中的每个函数。这包括金融、数学和三角学、日期和时间、文本、统计学、数据库、查找和引用、以及信息函数。这个库必须具有每个函数的版本,这些版本可以采用由电子数据表函数接受的所有数据类型。通过创建可以存储数字和文本的数据类型使其非常方便。
还必须创建库以支持类型转换器函数,例如,tonumber()和tostring()。这些函数调用将被插入到电子数据表单元的函数调用中以允许由电子数据表自动进行的相同的固有类型转换。
本发明优选地被实现为计算机程序,其将电子数据表模型转换为程序代码,并且接着编译所述程序代码以提供可调用函数库,该可调用数据库可以调用自其它程序或甚至其它电子数据表。


本发明的这些和其它的目的、特征和优点将通过下列详细的描述和所附流程图而更加明显,其中图1A-1E是描述本发明优选实施例的流程图;图2A-2E是描述图1A-1E流程图的第一步骤的进一步细节的流程图;图3A-3C是描述本发明第二步骤的进一步细节的流程图;图4是描述本发明第三步骤的进一步细节的流程图;图5A-5C是描述本发明第四步骤的进一步细节的流程图;图6A和6B是描述本发明第五步骤的进一步细节的流程图;图7A和7B是图2A-2E流程图的第一步骤的进一步细节的流程图;图8是描述本发明第二步骤的进一步细节的流程图;图9A和9B是描述本发明第三步骤的进一步细节的流程图;图10A-10C是描述本发明第四步骤的进一步细节的流程图。
具体实施例方式
如上所示,人们必须首先创建函数库,所述函数模拟被嵌入到电子数据表中的每个函数。这包括金融、数学和三角学、日期和时间、文本、统计学、数据库、查找和引用、以及信息函数。这个库必须具有每个函数的版本,这些版本可以采用由电子数据表函数接受的所有数据类型。通过创建可以存储数字和文本的数据类型使其非常方便。在C中,这是利用联合来完成的。
还必须创建库以支持类型转换器函数,例如,tonumber()和tostring()。这些函数调用将被插入到电子数据表单元的函数调用中以允许由电子数据表自动进行的相同的固有类型转换。例如,包含公式=“123”+4的电子数据表单元A1将显示结果127。如此,将被生成的C代码的程序行必将以A1=tonumber(“123”)+4的形式。
利用这些在适当位置的库,将电子数据表模型转换为程序代码的方法的优选实施例包括图1-10的步骤和所附论述本发明全部的操作将在下面的伪码和图1A-1E中进行描述。以该伪码对其它附图的参考提供了对作出参考的步骤的进一步详细描述。
初始化获得现有的范围名称获得工作薄中所有非空单元的列表确定函数输出单元进行递归调用以创建文本行[参见图2A-2E]确定函数输入单元构造函数原型行改变文本行中的公式x^y到pow(x,y)%到/100<>到!=&到+或者strcat()确定内插式附件函数列表和信息(库名,c函数名,电子数据表函数名,自变量表,调用约定)调整保留名(日期,时间,等)成为串保留名创建需要调用到那些函数中的代码行类型定义函数变量声明加载库获得过程地址以相关顺序排序[参见图3A-3C]确定间接循环必须开始的点插入间接循环开始创建将元素插入到阵列中的代码[参见图4]构造声明构造间接函数[参见图5A-5C]向函数增加支持变化数量的自变量的代码行[参见图6A和6B]提取阵列常量增加类型转换器函数调用(包括串调整)增加通过串调整而创建的新声明插入间接循环结尾增加释放所声明存储器的代码增加返回语句写代码到磁盘,如果需要,插入切细(chopped up)的函数写内插式附件代码编译并连接第一程序编译并连接第二程序清除电子数据表和磁盘图2A-2E这个步骤由被给有单元引用的子例行程序组成,并且创建代码行,为cell_reference=cell_formula并且接着,对cell_formula中的任何单元引用,递归调用其自身以生成用于新单元引用的C代码。
然而,需要一些额外的步骤以对纯公式起作用。完整的例行程序是检查这个cell_reference是否已经完成。如果已经完成,退出例行程序从单元获得formula_text如果为空白,使其为“0”用pow(x,y)替换x^y使函数不嵌套[参见图7A和7B]扩展公式[参见图8]注意“=”是否在公式中替换“IF”语句[参见图9A和9B]检查cell_reference中的保留字,并且如果需要就改变if已移除的等式或者单元包含数字then增加所创建的文本行else增加被创建为在formula_text周围具有双引号的文本行while未利用formula_text(从左到右扫描它)新原子=获得下一个原子[参见图10A-10C]获得新原子的工作表名称if新原子是一个单元和移除的等式then更新相关性(cell_reference,新原子)递归调用工作表名称和新原子else if新原子是范围名称和移除的等式then
更新相关性(cell_reference,新原子)if新原子已经完成,thengoto skiprangeendif增加所创建的文本行,其具有特定的标记以指示后面的扩展for范围中的每个单元获得它的扩展地址if扩展地址还不是范围名称then使扩展地址为范围名称endif更新相关性(新原子,扩展地址)范围中的下个单元for范围中的每个单元进行递归调用范围中的下个单元skiprangeend ifendifwend图3A-3C以相关性顺序排序的一个方法是取得已经在图2A-2E的方法中获得的代码行并且在不工作时将它们移动到代码行的新集合。并且,保存这个点所看到的全部变量的列表,对这些变量的每一个,还保存该变量所依赖的其它变量的列表。根据所述变量的赋值语句是否已经被移动到所排序的代码行列表,而可保存另一列表。
例如,可以存在一个称作variables_seen的一维列表,一个称作num_dependencies的一维阵列,以及称作dependencies的二维阵列。Variables_seen可以包括例如A1,A2,myrangename等的串。如果A1被包含在公式=B1*5+C2中并且是可见的第三变量,那么num_dependencies(3)将是2,并且dependencies(3,1)将是“B1”并且dependencies(3,2)将是“C2”。
伪代码是for i=1 to numvariablesisdone(i)=falsewhile variables_moved<numvariablesfor i=1 to numvariablesif not isdone(i) thenb=truefor j=1 to num_dependencies(i)if not isdone(dependencies(i,j)thenb=falseendifnext jif b thencopy_to_output(i)isdone(i)=trueendifend ifnext iwend图4电子数据表范围名称可以针对单个单元,或者若干单元的范围。如果单元包括公式引用a1:b10,它将更早地被转换为SHEETNAME_A1_B10,并且这将是公式中的引用。此时,需要插入为表示这个范围的阵列而分配存储器的代码,并且适当地设置所述阵列的每个元素SHEETNAME_A1_B10=(FP)malloc(10*2*sizeof(FP)+fpheadersize)SHEETNAME_A1_B10.array
=SHEETNAME_A1SHEETNAME_A1_B10.array[1]=SHEETNAME_B1SHEETNAME_A1_B10.array[2]=SHEETNAME_A2SHEETNAME_A1_B10.array[19]=SHEETNAME_B10所述代码生成器将知道所述范围变量的名字,以及它引用的范围的地址。因而能够知道大小以传给malloc,以及在覆盖所述范围中的全部行和列的循环中,能创建如上所示的文本行。
图5A-5C一个内置的电子数据表函数是INDIRECT。它获得单元引用,并且如果那个被引用单元包含对另一个单元的引用,所述函数返回第二被引用单元的值。因此如果A1包括“c2”,C2包含100,以及B1包含=INDIRECT(A1),接着B1将具有值100。操纵这个的一个方法是在已生成的C代码中创建INDIRECT模拟,而不是电子数据表模拟函数的预制库。将存在两个INDIRECT函数,一个返回文本而另一个返回串。哪一个将被调用将取决于包含到INDIRECT的调用的单元的数据类型。
为INDIRECT而生成的代码由接受串的原型组成,并且返回串或者数字,取决于它是两个被生成的函数的哪一个。所述例行程序体由一连串的if语句组成,所述程序中每个变量一个语句。if语句具有形式if stringarg=“variable_i”then return(variable_i)这实际上允许人们以变量名称传递该变量值,并且返回那个变量的值。
图6A-6B一些电子数据表函数取得变化数量的自变量。例如,可以具有=SUM(1,2,3)或者=SUM(1,2,3,4),甚至=SUM(1,2,3,a1:b2)其等同于=SUM(1,2,3,a ,a2,b1,b2)。C对其不支持,因此,必须进行调节。如此做的一种方式是使被模拟的SUM函数只采用单个自变量,其是保存要求和的值的阵列其还保存该阵列中元素的数量。接着,当单元A1中的公式包括=SUM(x,y,z)这代码将扩展为temparrayl=malloc(0)add_to_array(&temparrayl,x)add_to_array(&temparrayl,y)add_to_array(&temparrayl,z)A1=SUM(temparrayl)在这种情形下,add_to_array基于正被增加的变量的大小,来扩展temparrayl的大小,因此,如果y是范围,为整个范围分配空间。
实现这个步骤可以通过扫描所生成代码的每一行以及检查是否存在对接受变化数量的自变量(即,使得所生成代码行包含文字“SUM”)的函数预定义列表的函数调用而完成。
图7A和7B公式将经常包含对其它函数的多重调用。这些有时将包括嵌套的函数调用。为了方便分析和代码生成过程,所述过程使用临时变量,或者空单元,以将公式分解为多个公式,其每一个由更简单的部分组成。
包含A1=1+2+EXP(B47)*SUM(B47,EXP(B49))的公式将被变为(假设B50,B51和B52当前为空)B50=EXP(B47)B51=EXP(B49)B52=SUM(B47,B51)A1=1+2+EXP(B47)*B52在此实施例中使用的方法允许单元包含至多一个函数调用(0调用是不可能的)。这是通过以下步骤完成的扫描formula_text,并且函数名无论在何处遇到其本身(即,在被称作SUMMARY的函数之中没有找到SUM),此处不是文本串的一部分(即,公式不是“The sumis”&B51),对已经被初始化为0的计数器增加1。如果所述计数器变得大于1,那么空单元被找到;用于新找到的函数的文本(从它的名字开始到它的闭括号)被替换为空单元的扩展名;所述空单元名和地址被增加到变量、地址和范围名称列表中;用于新找到函数的公式被置于所述空单元中;并且所述原始公式扫描继续,以寻找formula_text中的更多函数名。
图8公式将包含数字、文本、函数调用、范围名称、单元引用.单元引用表示了一个问题,因为它们经常是不合格的,其意味着它们不会在行和列标识符之前加上工作表名称。所述电子数据表隐含地假定所述工作表名称与引用那个单元的单元工作表名称相同。因此在编译环境中明确地增加限定符到单元引用是必需的。在此实施例中使用的约定将对所有单元创建范围名称,并且使所述名字为限定符+“_”+单元引用。限定符可以是工作表名称,或者工作薄名以及工作表名称及单元引用。这样消除了任何多义性。在这个阶段为这些单元的每个创建范围名称,并且这些名字被用于它们的变量名。
因此,如果Sheet1!A1包含公式=B1+2,其将变为创建称作SHEET1_A1的范围名称;创建称作SHEET1_B1的范围名称;并且代码行被创建为SHEET1_A1=2+SHEET1+B1由于电子数据表名不区分大小写,优选地将所有的名字和地址转化为大写。
图9A和9B电子数据表允许形式=IF(A52>47,12,14)的函数。这不是有效的C代码行。特别地,第一自变量中的>迫使该第一自变量为串被传送,并且C代码将需要包含能够处理任何通用数学表达式的显式分析程序,包括对已经被用户插入的外部函数的调用。如果有可能执行,这将是困难的。
一个解决办法是获得IF函数的每一个自变量,并且将其文本放置到三个空单元中,并且接着以所述空单元的名称替换IF公式中的文本。因此,A1=IF(A52>47,12*2,A2+14)被替换为B1=A52>47B2=12*2B3=A2+14A1=IF(B1,B2,B3)这对C编译器将不是问题。
图10A-10C公式被认为由“原子”组成,所述原子是被运算符分隔的最小单元。运算符包括与双引号内的任何文本一起的作为单个原子对待的+、-、*、/、^、)、&、逗号、<、>、=、%。当搜索公式中的所有单元引用时,这可以通过对于每个源自扫描经过公式来完成,扫描在一个位置开始,并且前进直到已经到达所描述的间隔符之一为止。
正如对那些该技术领域的技术人员来说是很明显的,在上述方法中和用于执行如此方法的计算机代码中可以做出许多改变。当本发明已经在将电子数据表转换成为C程序代码的环境中进行描述的时候,利用前述描述,将会被本发明所属技术领域以及相似领域的技术人员所理解的是,本发明也可以被实施为将所述电子数据表转换为其它高级语言,例如Java、Visual Basic、Fortran、Pascal、以及C++。另外,这些步骤将同样良好地在由电子数据表(在电子数据表打开的同时以电子数据表的宏语言编写)所提供的环境中或者基于所述电子数据表文档本身的环境中操作得。
权利要求
1.一种将电子数据表模型转换为经编译的例行程序的方法,包括将所述电子数据表模型转换为计算机语言的程序代码;并且将所述程序代码编译为计算机目标代码。
2.如权利要求1的方法,其中所述计算机语言是C。
3.如权利要求2的方法,其中使用C编译器编译所述程序代码。
4.如权利要求1的方法,其中所述计算机目标代码是以能够从电子数据表调用的形式。
5.如权利要求1的方法,其中所述计算机目标代码是以能够从另一语言调用的形式。
6.一种存储在存储介质上的计算机程序,包括用于把电子数据表模型转换为第一计算机语言的程序代码的指令。
7.如权利要求6的计算机程序,进一步包括用于编译所述程序代码的指令。
8.如权利要求6的计算机程序,进一步包括构成函数库的指令,该函数库模拟嵌入到电子数据表中的函数。
9.如权利要求6的计算机程序,进一步包括实现类型转换器函数的指令。
全文摘要
一种用于运行它以把电子数据表模型转换成为可调用、经编译的例行程序的计算机程序和方法。所述模型首先被转换成为例如C语言的程序代码。然后程序代码被编译成为计算机目标代码。
文档编号G06F9/44GK101019100SQ200580003175
公开日2007年8月15日 申请日期2005年1月26日 优先权日2004年1月26日
发明者R·塔嫩鲍姆 申请人:萨维索弗特/选项无限搜索公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1