Como cruzar o Excel com um aplicativo da web interativo

Não é nenhum segredo que o Excel é uma ferramenta muito poderosa para trabalhar com dados tabulares numéricos. No entanto, as ferramentas que a Microsoft fornece para se integrar a ele estão longe de ser ideais. Em particular, é difícil integrar interfaces de usuário modernas ao Excel. Precisávamos dar aos usuários do Excel a capacidade de trabalhar com uma interface bastante rica e funcional. Seguimos um caminho ligeiramente diferente, que no final deu um bom resultado. Neste artigo, direi como você pode organizar a interação interativa do Excel com um aplicativo da web em Angular e estender o Excel com quase todas as funcionalidades que podemos implementar em um aplicativo da web moderno.







Então, meu nome é Mikhail e sou CTO da Exerica. Um dos problemas que estamos resolvendo é facilitar o trabalho dos analistas financeiros com dados numéricos. Geralmente trabalham tanto com os documentos originais de relatórios financeiros e estatísticos quanto com algum tipo de ferramenta para criar e manter modelos analíticos. Acontece que 99% dos analistas trabalham no Microsoft Excel e nele fazem coisas bastante complexas. Portanto, transferi-los do Excel para outras soluções não é eficiente e praticamente impossível. Objetivamente, os serviços "em nuvem" das planilhas ainda não alcançaram a funcionalidade do Excel. Mas, no mundo moderno, as ferramentas devem ser convenientes e atender às expectativas dos usuários: abrir com um clique do mouse, fazer uma pesquisa conveniente. E a implementação na forma de vários aplicativos não relacionados estará muito longe das expectativas do usuário.



O que o analista trabalha é mais ou menos assim: Os principais dados aqui são "indicadores financeiros" numéricos, por exemplo, receita do 1º trimestre de 2020. Para simplificar, irei me referir a eles simplesmente como “números”. Como você pode ver, quase não há conexão entre os números do documento e do modelo analítico, tudo está apenas na cabeça do analista. E o trabalho de preencher e manter o modelo leva horas, pesquisando e interrompendo números do documento em tabelas e, em seguida, procurando erros de entrada. Ao mesmo tempo, gostaríamos de oferecer ao usuário ferramentas familiares: arrastar e soltar, inserir através da área de transferência e assim por diante, bem como uma visualização rápida dos dados de origem.











O que já tínhamos



No momento em que começamos a implementar a interação interativa com o Excel na forma descrita neste artigo, já tínhamos um banco de dados no MongoDB, um back-end na forma de uma API REST no .NET Core, um SPA front- end no Angular e alguns outros serviços. Neste ponto, já tentamos várias opções de integração em aplicativos de planilha, incluindo Excel, e todas elas não foram além do MVP, mas este é um tópico para um artigo separado.







Dados de ligação



No Excel, existem duas ferramentas comuns com as quais você pode resolver o problema de vinculação de dados em uma tabela com os dados do sistema: RTD (RealTimeData) e UDF (Funções Definidas pelo Usuário). Pure RTD é menos amigável em termos de sintaxe e limita a flexibilidade da solução. Usando UDF, você pode criar uma função personalizada que funcionará de uma maneira familiar para um usuário do Excel. Pode ser usado em outras funções, entende referências como A1 ou R1C1 e geralmente se comporta como deveria. Ao mesmo tempo, ninguém se preocupa em usar o mecanismo RTD para atualizar o valor da função (o que fizemos). Desenvolvemos UDF na forma de suplemento do Excel usando C # e .NET Framework que estamos acostumados. Usamos a biblioteca Excel DNA para acelerar o desenvolvimento



Além de UDF, nosso addin implementa uma faixa de opções (barra de ferramentas) com configurações e algumas funções úteis para trabalhar com dados.



Adicionar interatividade



Para transferir dados para o Excel e estabelecer interatividade, desenvolvemos um serviço separado que fornece uma conexão Websocket usando a biblioteca SignalR e é, na verdade, um corretor para mensagens sobre eventos que devem ser trocados pelas partes front-end do sistema em tempo real. Chamamos isso de Serviço de Notificação.







Insira dados no Excel



No nosso SPA destacamos todos os números que o sistema detectou. O usuário pode selecioná-los, navegar por eles, etc. Para inserção de dados, implementamos 3 mecanismos para fechar vários casos de uso:



  • Arrastar e soltar
  • Inserção automática no clique no SPA
  • Copiar e colar via área de transferência


Quando o usuário inicia o arrastar e soltar de um determinado número do SPA, um link com o identificador desse número do nosso sistema ( .../unifiedId/005F5549CDD04F8000010405FF06009EB57C0D985CD001) é formado para arrastar . Ao colar no Excel, nosso addin intercepta o evento insert e analisa o texto inserido com regexp. Quando um link válido é encontrado imediatamente, ele o substitui pela fórmula apropriada =ExrcP(...).



Ao clicar em um número do SPA através do Serviço de Notificação, uma mensagem é enviada ao addin, contendo todos os dados necessários para inserir a fórmula. A seguir, a fórmula é simplesmente inserida na célula atualmente selecionada.



Esses métodos são bons quando o usuário precisa inserir um número em seu modelo, mas se ele precisa transferir a tabela inteira ou parte dela, outro mecanismo é necessário. Copiar por meio de uma área de transferência parece ser o mais familiar para os usuários. No entanto, esse método acabou sendo mais complicado do que os dois primeiros. O fato é que por conveniência, os dados inseridos devem ser apresentados no formato nativo do Excel - Planilha OpenXML. Isso é mais facilmente implementado usando o modelo de objeto do Excel, ou seja, a partir do addin. Portanto, o processo de formação de uma área de transferência é assim:



  • O usuário seleciona a área com números no SPA
  • Uma matriz de números alocados é passada para o serviço de notificação
  • Serviço de notificação passa para addin
  • Addin gera OpenXML e o insere na área de transferência
  • O usuário pode colar dados da área de transferência em qualquer lugar de qualquer planilha do Excel.






Apesar do fato de que os dados percorrem um longo caminho, graças ao SignalR e ao RTD, isso acontece de forma bastante rápida e abstraída do usuário. 



Divulgamos dados



Depois que o usuário seleciona os dados iniciais para seu modelo, ele precisa "propagar" todos os períodos (anos, semestres e trimestres) que sejam de seu interesse. Para estes efeitos, um dos parâmetros da nossa UDF é a data (período) desta data (lembre-se: “proveitos do 1º trimestre de 2020”). O Excel possui um mecanismo de "espalhamento" de fórmula nativa que permite preencher células com a mesma fórmula, levando em consideração as referências especificadas nos parâmetros. Ou seja, ao invés de uma data específica, um link para ela é inserido na fórmula, e então o usuário “estende” para outros períodos, enquanto os “mesmos” números de outros períodos são carregados automaticamente na tabela. 



E qual é esse número aí?



O usuário agora tem um modelo com várias centenas de linhas e várias dezenas de colunas. E ele pode ter uma pergunta, o que há para o número na célula L123? Para obter uma resposta, basta clicar nesta célula e no nosso SPA será aberto o mesmo relatório, na mesma página onde está escrito o número clicado, e o número do relatório será destacado. Assim:







E se este não for apenas um número do relatório, mas o resultado de alguns cálculos sobre os números retirados do relatório, então iremos destacar todos os números incluídos na expressão calculada no Excel. Isso não baixa todo o aplicativo e nem todos os dados necessários, como no caso de seguir um link.



Como uma conclusão



Esta é, na minha opinião, uma implementação fora do padrão de interação entre o Excel e um aplicativo da web, que acabou sendo bastante amigável. Graças ao uso do Excel, o limite de entrada para usuários do público-alvo é bastante baixo. Ao mesmo tempo, também obtemos todo o poder do Excel para trabalhar com dados numéricos. Os próprios dados sempre permanecem associados à fonte, bem como associados no tempo. Para clientes-alvo, não há necessidade de construir sistemas externos completamente novos no processo de negócios de trabalho com dados. Nossa solução é incorporada como uma “ferramenta” adicional dentro do Excel, que é o padrão de fato para provedores de dados financeiros.



Uma abordagem arquitetônica semelhante à integração de aplicativos da web com o Microsoft Excel pode ser aplicada a outras tarefas que requerem interatividade e interfaces de usuário complexas ao trabalhar com dados numéricos e tabulares.



All Articles