【问题标题】:Use Excel to do core analysis in a PHP application?使用 Excel 在 PHP 应用程序中进行核心分析?
【发布时间】:2012-09-28 09:09:19
【问题描述】:

我认为这确实是一个关于方法的问题。

我们有一个来自第三方的核心 Excel 电子表格,它提供了对原始数据的一些复杂分析。原始数据直接来自客户的第二个电子表格。

我们正在寻求创建一个基于网络服务器的自动化系统,在该系统中可以上传原始数据 Excel 文件并执行分析,并生成报告。

报告生成没有问题,但是在应用程序中实际使用核心 Excel 电子表格本身进行数学运算(例如使用 PHPExcel)有什么好处吗?还是最好的方法总是在代码中复制分析?

我们的想法是分析(来自第三方)是相当复杂的,因此在 PHP 中复制需要大量的拆解,其次,分析的部分内容经常被第三方含义调整我们会定期向我们提供新版本的 Excel。

我可以想象使用 PHPExcel 来做这样的事情,在内存中创建工作表并将原始数据合并为第二个工作表,然后读出计算结果,但这是否现实 - 会不会太慢 - 或者只是根本无法像我想象的那样工作?

任何想法将不胜感激。

【问题讨论】:

  • 我对 PHPExcel 不太熟悉,所以我不知道它如何忠实地再现 Excel 的计算引擎。然而,我想说的是,一般来说,重用一个可行的解决方案比重新实现它要好。有两个不同版本的东西来做同样的工作会导致以后的维护问题。
  • 确实,这也是我的直觉。尤其是在核心分析似乎被拉扯并发生了很大变化的情况下。
  • 查看与复杂 Excel 文件完全相同的问题。这是怎么回事?我非常好奇。

标签: php phpexcel


【解决方案1】:

根据 Excel 公式的复杂性,使用 PHPExcel 的计算引擎完全可行,但您需要注意一些潜在的“陷阱”。

  • 并非完全支持所有 Excel 函数(提供了一个列表 在 PHPExcel 文档中,但我认为 356 个函数中有 316 个函数 现在支持)
  • 分析工具包中的 Excel 函数不是 支持 BIFF (.xls) 工作簿;尽管他们将与 OfficeOpenXML (xlsx) 工作簿
  • 用户定义的函数不是 支持
  • 不支持宏和其他 VB 代码
  • 数组公式 尚不支持(这是计划的重要组成部分 计算引擎将于年底开始重写)
  • 不支持单元格引用的 R1C1 格式

它相对较慢(部分原因需要重写)。您当然可以编写 PHP 代码来更有效地执行您需要的公式,因为您可以根据您的特定要求编写代码。 PHPExcel会不会太慢?只有您才能确定“太慢”的实际含义。

请注意,通常最好提交对大量内存或耗时任务的请求以在 Web 服务器之外运行

另一方面,如果您的客户曾经更改过他们的电子表格(并且您指出这是相当频繁的),那么使用 PHPExcel 的内置计算引擎意味着它仍然可以正常工作,而自定义编写的代码则需要修改。 正如您已经指出的那样,复杂的公式可能需要大量工作才能转换为 PHP 代码。并且取消对电子表格中的公式所做的更改将特别困难。

【讨论】:

  • 感谢您的想法和问题列表。我将把 Excel 支持的函数列表交给编写分析表的人,看看他们对它的看法。如果它更像是一个静态的东西,那么用 PHP 编码它是有意义的,但这不是我们迄今为止的经验 - 这是一个不断变化和发展的分析。关于“慢”的真正含义也很好,并且很大程度上取决于未来的数据量。目前我不认为慢是一个太大的问题。我认为现在值得我进行一些实验。
  • 更新:对此进行的更多研究使我得出结论,正如您强调的那样,PHPExcel 中缺乏对数组公式的支持 Mark,在这种情况下将是一个很大的问题。我们得到的 Excel 表格充分利用了数组。我会继续寻找...
【解决方案2】:

并不是真正解决您的问题,但首选方法是您在 PHP 端构建计算,然后让客户端/第三方以指定格式(最好是 CSV 文件)提交数据,并且然后你解析数据并执行任何必要的计算。

【讨论】:

  • 感谢 Martin,确实我可以看到 PHP 处理分析直接将“excel”层从处理中取出。我们遇到的一个问题是,进行分析的人都是 Excel 人员,整个过程围绕着他们的电子表格进行,并且一直如此。正是频繁的变化让我们在这里摸不着头脑。我们担心不断更改以复制 PHP 中的核心分析。我想知道是否有任何更基本的方法可以将数学从 Excel 表中提取出来,或者以其他方式定义数学。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2019-04-17
  • 2019-10-06
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
相关资源
最近更新 更多