已经发了一个帖子,如何解析excel公式,见 http://topic.csdn.net/u/20081128/23/fdc43c7e-9d20-4447-8d1b-368062317ff9.html
这个帖子解释一下为何有此需求,或许是思路错了。一个项目中,用到owc(微软关于电子表格的插件),使用思路,将电子表格以clob格式存进数据库,每一个文件称为一个模板。
假设现在有4个模板:ta,tb,tc,td
模板间存在单元格值的引用关系,
ta 
  a1
tb
  b2 引用a1
tc 
  c3 引用b2
td
  d4 引用c3
要在数据层做处理,于是自定义公式以便引用值,YS(ta,a1),YS(tb,b2),YS(tc,c3),取值一切正常。
现客户提出需求,更改a1单元格的值,td模板中d4的值要连动更新,根据递归,也能解决。现在问题:tc模板c3处可能不直接引用b2,而是引用了b4,而b4=b2+b3(为excel的内部公式),大家都知道,excel内部公式只有在打开后才生效,在数据层无法实现预期目标,我才想到把excel的内部公式也解析出来。
不是什么好办法,各位帮想想,还有没有什么其他好办法实现数据连动的功能,而不解析公式。

解决方案 »

  1.   

    少说了一点,对于每个模板,都被按单元格拆分了,有对应的:
    配置表(tid:模板id,col:列位置,row:行位置,formula:对应公式),
    数据表(tid:模板id,col:列位置,row:行位置,value:对应值)
      

  2.   

    要实现数据连动的功能,采用联级触发(Trigger中的表通过DML操作关键字实现联动)可以实现。
      

  3.   


    --本文摘自美国David Lockman著的《轻松掌握Oracle8数据库开发》,供LZ作个参考:--表tab1建立了一个行级before update触发器,它可将tab1中的col1列的旧值插入到tab2中;
    --表tab2建立了行级的before update触发器,它可更新tab3,并用col2的新值给col3赋值;
    --最后对于表tab3,建立语句级after update触发器,它可在col3的值等于27时,在表tab3中插入行。SQL> select * from tab1;      COL1
    ----------
             7SQL> select * from tab2;      COL2
    ----------
            10SQL> select * from tab3;      COL3
    ----------
            13SQL> 
    SQL> create or replace trigger tab1_update_before before update on tab1 for each row
      2  declare
      3  begin
      4  insert into tab2(col2) values(:old.col1);
      5  end;
      6  /Trigger createdSQL> 
    SQL> create or replace trigger tab2_insert_before before insert on tab2 for each row
      2  declare
      3  begin
      4  update tab3 set col3=:new.col2;
      5  end;
      6  /Trigger createdSQL> 
    SQL> create or replace trigger tab3_update_after after update on tab3
      2  declare
      3  begin
      4  insert into tab3(col3) values(27);
      5  end;
      6  /Trigger createdSQL> update tab1 set col1=8;1 row updatedSQL> commit;Commit complete--如下看到:
    --在tab1中,col1的值被更新为8;
    --在tab2中,触发器tab1_update_before用col1:7的旧值插入一行新数据;
    --在tab3中,当在tab2中插入新行时,使触发器tab2_insert_before触发,并设置col3的值,使其与在tab2插入的值7相同。
    --当tab3被更新后,触发器tab3_update_before在tab3中用值27插入另一行。SQL> select * from tab1;      COL1
    ----------
             8SQL> select * from tab2;      COL2
    ----------
            10
             7SQL> select * from tab3;      COL3
    ----------
             7
            27SQL> 
      

  4.   

    我觉得更多应该基于excel相关解释技术进行实现,没看见过pl/sql有能解释excel文档的功能.比如,java就有针对处理excel文档的API,
    能不能这样,在数据库里先创建java 存贮过程,然后调用它去处理excel,这要是有一定可行性的,但就理不知道能不能满足你的要求。
      

  5.   

    你的项目是:用户使用excel编辑一些计算公式,你到oracle读取这个excel,然后进行计算?还是: 做一个类似于excel那样的,可以进行公式计算的?前面的那种情况太复杂,如果不使第三方的库或控件,自已写也太难了吧(工作量大,技术难度高)
      

  6.   


    这里有一个障碍,excel本身的公式只有在打开的时候才生效。
      

  7.   


    系统引用的owc,和excel差不多
      

  8.   

    以前没做过,太复杂了。http://www.cnblogs.com/yiriqing/category/60608.html