请教一个涉及到读 Excel 公式动态计算的问题。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
left7410
V2EX    程序员

请教一个涉及到读 Excel 公式动态计算的问题。

 
  •   left7410 2025 年 7 月 3 日 1582 次点击
    这是一个创建于 203 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教一个涉及到读 Excel 公式动态计算的问题。

    需求描述: 需求是要做一个财务预算的复杂 Excel 表格功能,第一行和 C 列的数据可以手工填写,填写后触发相对应的计算逻辑(每个格子都有不同的公式),最终将页面上所有的数据入库,下次进入页面将数据重新展示出来。

    难点: 奇葩就奇葩在,在 A 页面修改一些的值,B 页面的所有数据要根据新修改的数后台重新计算一遍并覆盖之前的数据。这样 A 页面的数据相当于字典,B 页面的第一行数据读的是 A 页面提前录入好的值。

    • 前后端页面数据交互,前台页面填报后,后台将计算好的值,返给前端。
    • 后台如何进行复杂 Excel 公式中的数据计算。

    实现方式: 领导要求用 Java 来实现,所有计算逻辑在后台做,前端只做展示( React ),本来可以用帆软报表实现就很简单,但卡点在于,A 页面填报后,B 页面无法后台进行动态的重新计算,必须要重新进入 B 页面后手工提交才行。

    目前在网上找到解决方案有: Java 使用 POI 获取 Excel 公式并计算公式得到计算结果值,但这种读出来的数据难以维护。

    Excel 内容大概是这样的: https://www.douban.com/photos/photo/2923046300/large

    第 1 条附言    2025 年 7 月 3 日
    由于表达能力有限,再简单描述一下。

    用户会给一个 Excel ,里面有 A 、B 两个 sheet 页(实际上是 9 个),A 页面录入数据后,在 B 页面读取 A 页面录入好的值,然后再调整 C 列的数,最终将结果算出来的结果存在来。
    补充:B 页面里面的公式都是用户定义好的。C 列和 第 1 行的值为用户手工录入,现在就是要将这个 Excel 里面的逻辑放到 Java 代码里去实现,但是通过代码实现就涉及到前后端交互,以及公式计算的问题。而且用户要求只要修改 A 页面的数,B 页面要自动计算一遍。

    以上是大概的内容,至于 B 页面里面还有一些细节要求,比如要记录哪个用户修改了什么值,修改前的值和修改后的值,页面也要展示出来。
    9 条回复    2025-07-03 21:15:25 +08:00
    SanjinGG
        1
    SanjinGG  
       2025 年 7 月 3 日
    目前看下来和 Excel 没太大关系啊? a 输入数据给后端计算好存表里,前端每次进入 b 页面获取下数据,再给个导出 Excel 功能就行了吧?
    visper
        2
    visper  
       2025 年 7 月 3 日
    听起来像是后端会有一个 excel 模板,模板里面的一些单元格的公式是别人设置好的。然后前端填写了值,把值填写到对应的单元格,然后获取出自动计算后的单元格的值。 问 ai 的话说 poi 里面有这些触发 excel 自动计算的 FormulaEvaluator ,但是支持公式到什么程度不知道.
    execute
        3
    execute  
       2025 年 7 月 3 日
    尝试为每个 sheet 页建立一个数据库表和视图呢,表存未经计算原始数据,视图里面就是计算和取数的逻辑,查询的时候直接查视图
    eric3797
        4
    eric3797  
       2025 年 7 月 3 日
    何必杀鸡用牛刀,这个直接用 excel 自带的锁定隐藏单元格就行,不显示公式计算过程只显示结果,允许编辑的内容取消锁定即可,如示例 example: https://ttttt.link/f/6865f83c9d139
    left7410
        5
    left7410  
    OP
       2025 年 7 月 3 日
    @SanjinGG b 页面的 C 列可以手工填写
    left7410
        6
    left7410  
    OP
       2025 年 7 月 3 日
    @visper 是这样的。用户会给一个 Excel ,里面有 A 、B 两个 sheet 页,A 页面录入数据后,在 B 页面读取 A 页面录入好的值,然后再微调 C 列的值,最终将结果算出来的结果存在来。
    补充:B 页面里面的公式都是用户定义好的。C 列和 第 1 行的值为用户手工录入,现在就是要将这个 Excel 的逻辑放到 Java 代码里去实现。但是通过代码实现就涉及到前后端交互,以及公式计算的问题。
    left7410
        7
    left7410  
    OP
       2025 年 7 月 3 日
    @execute 好像打开了新思路。您的意思是计算逻辑使用 SQL 实现,表只做存储吗?目前也是一个 sheet 页一个表的设计的
    SanjinGG
        8
    SanjinGG  
       2025 年 7 月 3 日
    @left7410 #5 直接 a 页面再加一个可选输入就行吧,反正 a 页面的那个数据也是要存库里的
    execute
        9
    execute  
       2025 年 7 月 3 日
    @left7410 #7 是的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3168 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 12:53 PVG 20:53 LAX 04:53 JFK 07:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86