Cómo cruzar Excel con una aplicación web interactiva

No es ningún secreto que Excel es una herramienta bastante poderosa para trabajar con datos tabulares numéricos. Sin embargo, las herramientas que Microsoft proporciona para integrarse con él están lejos de ser ideales. En particular, es difícil integrar interfaces de usuario modernas en Excel. Necesitábamos brindar a los usuarios de Excel la capacidad de trabajar con una interfaz bastante rica y funcional. Tomamos un camino ligeramente diferente, que finalmente mostró un buen resultado. En este artículo te contaré cómo puedes organizar la interacción interactiva de Excel con una aplicación web en Angular y extender Excel con casi cualquier funcionalidad que podamos implementar en una aplicación web moderna.







Entonces mi nombre es Mikhail y soy CTO en Exerica. Uno de los problemas que estamos resolviendo es facilitar que los analistas financieros trabajen con datos numéricos. Suelen trabajar tanto con los documentos originales de informes financieros y estadísticos, como con algún tipo de herramienta para crear y mantener modelos analíticos. Dio la casualidad de que el 99% de los analistas trabajan en Microsoft Excel y hacen cosas bastante complejas allí. Por tanto, transferirlos de Excel a otras soluciones no es eficiente y prácticamente imposible. Objetivamente, los servicios "en la nube" de hojas de cálculo aún no alcanzan la funcionalidad de Excel. Pero en el mundo moderno, las herramientas deben ser convenientes y cumplir con las expectativas de los usuarios: abrir con un clic del mouse, tener una búsqueda conveniente. Y la implementación en forma de varias aplicaciones no relacionadas estará bastante lejos de las expectativas del usuario.



Lo que trabaja el analista se parece a esto: los datos principales aquí son "indicadores financieros" numéricos, por ejemplo, los ingresos para el primer trimestre de 2020. En aras de la simplicidad, me referiré a ellos simplemente como "números". Como puede ver, casi no hay conexión entre los números en el documento y en el modelo analítico, todo está solo en la cabeza del analista. Y el trabajo de completar y mantener el modelo lleva horas buscando e interrumpiendo números del documento en tablas y luego buscando errores de entrada. Al mismo tiempo, nos gustaría ofrecer al usuario herramientas familiares: "arrastrar y soltar", insertar a través del portapapeles, etc., así como una vista rápida de los datos de origen.











Lo que ya teníamos



Cuando comenzamos a implementar la interacción interactiva con Excel en la forma descrita en este artículo, ya teníamos una base de datos en MongoDB, un backend en forma de API REST en .NET Core, un front- end SPA en Angular y algunos otros servicios. En este punto, ya hemos probado diferentes opciones para la integración en aplicaciones de hoja de cálculo, incluido Excel, y no todas fueron más allá de MVP, pero este es un tema para un artículo aparte.







Vincular datos



Existen dos herramientas comunes en Excel que se pueden utilizar para resolver el problema de vincular datos en una tabla con datos en el sistema: RTD (RealTimeData) y UDF (Funciones definidas por el usuario). Pure RTD es menos fácil de usar en términos de sintaxis y limita la flexibilidad de la solución. Con UDF, puede crear una función personalizada que funcionará de una manera familiar para un usuario de Excel. Se puede utilizar en otras funciones, comprende referencias como A1 o R1C1 y generalmente se comporta como debería. Al mismo tiempo, nadie se molesta en usar el mecanismo RTD para actualizar el valor de la función (lo cual hicimos). Desarrollamos UDF en forma de complemento de Excel usando C # y .NET Framework al que estamos acostumbrados. Usamos la biblioteca de ADN de Excel para acelerar el desarrollo



Además de UDF, nuestro complemento implementa una cinta (barra de herramientas) con configuraciones y algunas funciones útiles para trabajar con datos.



Agregar interactividad



Para transferir datos a Excel y establecer interactividad, hemos desarrollado un servicio separado que proporciona una conexión Websocket utilizando la biblioteca SignalR y en realidad es un intermediario para mensajes sobre eventos que deben intercambiarse por las partes del front-end del sistema en tiempo real. Lo llamamos Servicio de Notificación.







Insertar datos en Excel



En nuestro SPA destacamos todos los números que ha detectado el sistema. El usuario puede seleccionarlos, navegar por ellos, etc. Para la inserción de datos, hemos implementado 3 mecanismos para cerrar varios casos de uso:



  • Arrastrar y soltar
  • Inserción automática al hacer clic en SPA
  • Copiar y pegar a través del portapapeles


Cuando el usuario inicia un arrastrar y soltar de un determinado número desde SPA, se forma un enlace con el identificador de este número de nuestro sistema ( .../unifiedId/005F5549CDD04F8000010405FF06009EB57C0D985CD001) para arrastrar . Al pegar en Excel, nuestro complemento intercepta el evento de inserción y analiza el texto insertado con expresiones regulares. Cuando se encuentra un enlace válido sobre la marcha, lo reemplaza con la fórmula adecuada =ExrcP(...).



Al hacer clic en un número en el SPA a través del Servicio de Notificación, se envía un mensaje al complemento, que contiene todos los datos necesarios para insertar la fórmula. A continuación, la fórmula simplemente se inserta en la celda seleccionada actualmente.



Estos métodos son buenos cuando el usuario necesita insertar un número en su modelo, pero si necesita transferir toda la tabla o parte de ella, se necesita otro mecanismo. Copiar a través de un portapapeles parece ser lo más familiar para los usuarios. Sin embargo, este método resultó ser más complicado que los dos primeros. El hecho es que, por conveniencia, los datos insertados deben presentarse en el formato nativo de Excel: hoja de cálculo OpenXML. Esto se implementa más fácilmente utilizando el modelo de objetos de Excel, es decir, desde el complemento. Por lo tanto, el proceso de creación de un portapapeles se ve así:



  • El usuario selecciona el área con números en SPA
  • Se pasa una matriz de números asignados al servicio de notificación
  • El servicio de notificaciones lo pasa al complemento
  • Addin genera OpenXML y lo inserta en el portapapeles
  • El usuario puede pegar datos del portapapeles en cualquier lugar de cualquier hoja de cálculo de Excel.






A pesar de que los datos recorren un largo camino, gracias a SignalR y RTD, esto sucede con bastante rapidez y de forma abstraída del usuario. 



Difundimos datos



Una vez que el usuario ha seleccionado los datos iniciales para su modelo, necesita "propagar" todos los períodos (años, semestres y trimestres) que le interesan. A estos efectos, uno de los parámetros de nuestra UDF es la fecha (período) de esta fecha (recuerde: "ingresos del 1er trimestre de 2020"). Excel tiene un mecanismo de "propagación" de fórmulas nativas que le permite llenar celdas con la misma fórmula, teniendo en cuenta las referencias especificadas en los parámetros. Es decir, en lugar de una fecha específica, se inserta un enlace en la fórmula, y luego el usuario lo “extiende” a otros períodos, mientras que “los mismos” números de otros períodos se cargan automáticamente en la tabla. 



¿Y cuál es ese número ahí?



El usuario ahora tiene un modelo con varios cientos de filas y varias docenas de columnas. Y puede que tenga una pregunta, ¿cuál es el número en la celda L123? Para obtener una respuesta, solo necesita hacer clic en esta celda y en nuestro SPA se abrirá el mismo informe, en la misma página donde está escrito el número en el que se hizo clic, y se resaltará el número en el informe. Así:







Y si este no es solo un número del informe, sino el resultado de algunos cálculos sobre los números extraídos del informe, entonces resaltaremos todos los números incluidos en la expresión calculada en Excel. Esto no carga toda la aplicación y carga todos los datos necesarios, como en el caso de seguir un enlace.



Como conclusión



Esta es, en mi opinión, una implementación no estándar de interacción entre Excel y una aplicación web, que resultó ser bastante fácil de usar. Gracias al uso de Excel, el umbral de entrada para los usuarios del público objetivo es bastante bajo. Al mismo tiempo, también obtenemos todo el poder de Excel para trabajar con datos numéricos. Los datos en sí permanecen siempre asociados con la fuente, así como asociados en el tiempo. Para los clientes objetivo, no es necesario crear sistemas externos completamente nuevos en el proceso empresarial de trabajar con datos. Nuestra solución está integrada como una "herramienta" adicional dentro de Excel, que es el estándar de facto para los proveedores de datos financieros.



Un enfoque arquitectónico similar para integrar aplicaciones web con Microsoft Excel se puede aplicar a otras tareas que requieren interactividad e interfaces de usuario complejas cuando se trabaja con datos numéricos y tabulares.



All Articles