如何将Excel与交互式Web应用程序交叉

Excel是用于处理数字表格数据的强大工具,这已不是什么秘密。但是,Microsoft提供的与其集成的工具远非理想。特别是,很难将现代用户界面集成到Excel中。我们需要使Excel用户能够使用功能相当丰富的界面。我们采取了略有不同的方法,最终显示出良好的结果。在本文中,我将告诉您如何在Angular中组织Excel与Web应用程序的交互交互,以及扩展Excel以及我们可以在现代Web应用程序中实现的几乎所有功能。







我叫Mikhail,是Exerica的CTO。我们正在解决的问题之一是使金融分析师更轻松地使用数值数据。它们通常既可以使用财务和统计报告的原始文档,也可以使用某种工具来创建和维护分析模型。碰巧的是,有99%的分析师都在Microsoft Excel中工作,并在那里做相当复杂的事情。因此,将它们从Excel转移到其他解决方案并不是有效的,实际上是不可能的。客观地,电子表格的“云”服务尚未达到Excel的功能。但是在现代世界中,工具应方便使用并满足用户的期望:单击鼠标即可打开,搜索也很方便。各种不相关的应用程序形式的实现将远远超出用户的期望。



分析师的工作方式看起来像这样: 这里的主要数据是数字“财务指标”,例如2020年第一季度的收入。为了简单起见,我将它们简称为“数字”。如您所见,文档中的数字与分析模型中的数字几乎没有联系,一切都只在分析师的脑海中。填充和维护模型的工作需要花费数小时的时间来搜索并将文档中的数字打断到表格中,然后查找输入错误。同时,我们希望为用户提供熟悉的工具:拖放,通过剪贴板插入等等,以及快速查看源数据。











我们已经拥有的



到我们开始以本文所述的形式实现与Excel的交互式交互时,我们已经在MongoDB中拥有一个数据库,在.NET Core中具有REST API形式的后端,在Angular中具有前端SPA,以及其他一些服务。在这一点上,我们已经尝试了各种选项来集成到电子表格应用程序(包括Excel)中,并且它们都没有超出MVP,但这是另一篇文章的主题。







连结资料



Excel中有两个常用工具可用于解决将表中的数据与系统中的数据链接的问题:RTD(RealTimeData)和UDF(用户定义函数)。纯RTD在语法上不太方便用户使用,并限制了解决方案的灵活性。使用UDF,您可以创建一个自定义函数,该函数将以Excel用户熟悉的方式工作。它可以用于其他功能,它可以理解A1或R1C1之类的引用,并且通常会按其应有的方式运行。同时,没有人愿意使用RTD机制来更新函数值(我们这样做了)。我们使用熟悉的C#和.NET Framework以Excel插件的形式开发了UDF。我们使用Excel DNA库加快开发速度。 



除了UDF,我们的插件还实现了一个功能区(工具栏),该功能区具有设置和一些有用的数据处理功能。



增加互动



为了将数据传输到Excel并建立交互性,我们开发了一项单独的服务,该服务使用SignalR库提供Websocket连接,并且实际上是有关事件消息的代理,有关事件的消息应由系统的前端部分实时交换。我们称之为通知服务。







将数据插入Excel



在SPA中,我们突出显示系统检测到的所有数字。用户可以选择它们,浏览它们,等等。对于数据插入,我们实现了3种机制来关闭各种用例:



  • 拖放式
  • 单击时自动插入SPA
  • 通过剪贴板复制和粘贴


当用户从SPA中启动某个数字的拖放操作时,就会形成一个带有来自我们系统(.../unifiedId/005F5549CDD04F8000010405FF06009EB57C0D985CD001的该数字的标识符的链接以进行拖动。当粘贴到Excel中时,我们的插件会拦截insert事件并使用regexp解析插入的文本。快速找到有效链接后,它将用相应的公式替换=ExrcP(...)



当您通过Notification Service在SPA中单击一个数字时,会向该加载项发送一条消息,其中包含用于插入公式的所有必要数据。接下来,将公式简单地插入到当前选定的单元格中。



当用户需要在模型中插入一个数字时,这些方法很好,但是如果用户需要转移整个表或表的一部分,则需要另一种机制。通过剪贴板复制似乎是用户最熟悉的。但是,这种方法比前两种方法更加复杂。事实是,为了方便起见,插入的数据必须以本机Excel格式-OpenXML Spreadsheet呈现。使用Excel对象模型(即从外接程序)最容易实现这一点。因此,形成剪贴板的过程如下所示:



  • 用户在SPA中选择带有数字的区域
  • 分配的数字数组传递到通知服务
  • 通知服务将其传递给插件
  • 插件会生成OpenXML并将其插入剪贴板
  • 用户可以将剪贴板中的数据粘贴到任何Excel电子表格中的任何位置。






尽管事实上,由于SignalR和RTD,数据可以走很长一段路,但是这种情况发生得非常快,并且可以从用户那里提取出来。 



我们传播数据



用户选择其模型的初始数据后,他们需要“传播”所有感兴趣的时间段(年,学期和季度)。为此,UDF的参数之一是该日期的日期(期间)(请记住:“ 2020年第一季度的收入”)。Excel具有本机公式“扩展”机制,该机制允许您在考虑参数中指定的引用的情况下用相同的公式填充单元格。也就是说,代替特定日期的是,指向公式的链接被插入到公式中,然后用户将其“扩展”到其他期间,而来自其他期间的“相同”数字将自动加载到表格中。 



那那个数字是多少?



用户现在拥有一个具有数百行和几十列的模型。他可能会问,L123单元格中的数字是什么?要获得答案,他只需要单击该单元格,然后在我们的SPA中,将在写入点击编号的同一页上打开相同的报告,并且报告中的数字将突出显示。像这样:







如果这不仅是报告中的一个数字,而且是对报告中数字进行一些计算的结果,那么我们将突出显示Excel中计算出的表达式中包含的所有数字。这不会像跟踪链接那样加载整个应用程序和所有必需的数据。



作为结论



在我看来,这是Excel和Web应用程序之间交互的非标准实现,事实证明它非常用户友好。由于使用了Excel,目标受众的用户进入门槛非常低。同时,我们还获得了Excel处理数字数据的全部功能。数据本身始终与源保持关联,并与时间保持关联。对于目标客户,无需在处理数据的业务流程中构建全新的外部系统。我们的解决方案是作为Excel中的附加“工具”嵌入的,这是金融数据提供商的事实上的标准。



将Web应用程序与Microsoft Excel集成的类似体系结构方法可以应用于在处理数字和表格数据时需要交互性和复杂用户界面的其他任务。



All Articles