ですから、私の名前はミハイルで、エクセリカのCTOです。私たちが解決している問題の1つは、財務アナリストが数値データを簡単に操作できるようにすることです。それらは通常、財務報告と統計報告の元の文書と、分析モデルを作成および維持するためのある種のツールの両方で機能します。たまたま、アナリストの99%がMicrosoft Excelで作業し、そこで非常に複雑なことを行っています。したがって、それらをExcelから他のソリューションに転送することは効率的ではなく、事実上不可能です。客観的には、スプレッドシートの「クラウド」サービスはまだExcelの機能に到達していません。しかし、現代の世界では、ツールは便利であり、ユーザーの期待に応える必要があります。マウスをクリックして開く、便利な検索を行う。また、関係のないさまざまなアプリケーションの形での実装は、ユーザーの期待からはほど遠いものになります。
アナリストが扱うものは次のようになり ます。ここでの主なデータは、数値の「財務指標」です。たとえば、2020年の第1四半期の収益です。簡単にするために、私はそれらを単に「数字」と呼びます。ご覧のとおり、ドキュメントと分析モデルの数値の間にはほとんど関係がなく、すべてが分析者の頭の中にあるだけです。また、モデルの入力と保守を行うには、ドキュメントからテーブルへの番号の検索と中断、および入力エラーの検索に何時間もかかります。同時に、「ドラッグアンドドロップ」、クリップボードからの挿入など、ユーザーが使い慣れたツールと、ソースデータのクイックビューを提供したいと思います。
私たちがすでに持っていたもの
この記事で説明する形式でExcelとの対話型対話の実装を開始するまでに、MongoDBにデータベース、.NETCoreにRESTAPIの形式のバックエンド、AngularにフロントエンドSPA、およびその他のサービスがすでにありました。この時点で、Excelを含むスプレッドシートアプリケーションに統合するためのさまざまなオプションをすでに試しましたが、それらはすべてMVPを超えるものではありませんでしたが、これは別の記事のトピックです。
データのリンク
Excelには、テーブル内のデータをシステム内のデータにリンクする問題を解決できる2つの一般的なツールがあります。RTD(RealTimeData)とUDF(ユーザー定義関数)です。純粋なRTDは、構文の点で使い勝手が悪く、ソリューションの柔軟性を制限します。 UDFを使用すると、Excelユーザーに馴染みのある方法で機能するカスタム関数を作成できます。他の機能で使用でき、A1やR1C1などの参照を理解し、通常は正常に動作します。同時に、RTDメカニズムを使用して関数値を更新する必要はありません(これは私たちが行いました)。私たちは、慣れ親しんだC#と.NET Frameworkを使用して、Excelアドインの形式でUDFを開発しました。開発をスピードアップするためにExcelDNAライブラリを使用しました。
UDFに加えて、私たちのアドインは、設定とデータを操作するためのいくつかの便利な機能を備えたリボン(ツールバー)を実装します。
インタラクティブ性を追加する
データをExcelに転送し、対話性を確立するために、SignalRライブラリを使用してWebsocket接続を提供し、実際にはシステムのフロントエンド部分によってリアルタイムで交換される必要があるイベントに関するメッセージのブローカーである別のサービスを開発しました。これを通知サービスと呼びます。
Excelにデータを挿入する
SPAでは、システムが検出したすべての数値を強調表示します。ユーザーはそれらを選択したり、ナビゲートしたりすることができます。データ挿入については、さまざまなユースケースを閉じるために3つのメカニズムを実装しました。
- ドラッグアンドドロップ
- SPAでのクリックによる自動挿入
- クリップボードを介してコピーして貼り付ける
ユーザーがSPAから特定の番号のドラッグアンドドロップを開始すると、ドラッグ用にシステム(
.../unifiedId/005F5549CDD04F8000010405FF06009EB57C0D985CD001
)からのこの番号の識別子とのリンクが形成されます。 Excelに貼り付けると、アドインは挿入イベントをインターセプトし、挿入されたテキストをregexpで解析します。有効なリンクがその場で見つかると、対応する式に置き換えられ=ExrcP(...)
ます。
通知サービスを介してSPAの番号をクリックすると、数式を挿入するために必要なすべてのデータを含むメッセージがアドインに送信されます。次に、式は現在選択されているセルに挿入されます。
これらの方法は、ユーザーがモデルに1つの番号を挿入する必要がある場合に適していますが、テーブル全体またはその一部を転送する必要がある場合は、別のメカニズムが必要です。クリップボードを介したコピーは、ユーザーにとって最もなじみのあるもののようです。ただし、この方法は最初の2つよりも複雑であることが判明しました。事実、便宜上、挿入されたデータはネイティブのExcel形式(OpenXML Spreadsheet)で表示する必要があります。これは、Excelオブジェクトモデルを使用して、つまりアドインから最も簡単に実装できます。したがって、クリップボードを形成するプロセスは次のようになります。
- ユーザーはSPAで番号のあるエリアを選択します
- 割り当てられた番号の配列が通知サービスに渡されます
- 通知サービスはそれをアドインに渡します
- アドインはOpenXMLを生成し、それをクリップボードに挿入します
- ユーザーは、クリップボードのデータを任意のExcelスプレッドシートのどこにでも貼り付けることができます。
SignalRとRTDのおかげで、データは長い道のりを進んでいますが、これは非常に迅速に、ユーザーから抽象化された方法で行われます。
データを広める
ユーザーがモデルの初期データを選択した後、関心のあるすべての期間(年、学期、四半期)を「伝播」する必要があります。これらの目的のために、UDFのパラメーターの1つは、この日付の日付(期間)です(「2020年の第1四半期の収益」を思い出してください)。Excelには、パラメータで指定された参照を考慮に入れて、同じ式でセルを埋めることができるネイティブ式の「拡散」メカニズムがあります。つまり、特定の日付の代わりに、その日付へのリンクが式に挿入され、ユーザーはそれを他の期間に「拡張」し、他の期間の「同じ」番号が自動的にテーブルに読み込まれます。
そして、その数は何ですか?
これで、ユーザーは数百行と数十列のモデルを作成できます。そして彼は質問があるかもしれません、セルL123の数には何がありますか?答えを得るには、彼はこのセルをクリックするだけで、SPAで同じレポートが開き、クリックした番号が書かれているのと同じページで、レポートの番号が強調表示されます。このように:
そして、これがレポートからの1つの数値だけでなく、レポートから取得した数値の計算結果である場合、Excelで計算された式に含まれるすべての数値を強調表示します。これは、リンクをたどる場合のように、アプリケーション全体をロードしたり、必要なすべてのデータをロードしたりするわけではありません。
結論として
私の意見では、これはExcelとWebアプリケーション間の相互作用の非標準的な実装であり、非常にユーザーフレンドリーであることが判明しました。 Excelを使用しているため、ターゲットオーディエンスからのユーザーのエントリしきい値は非常に低くなっています。同時に、数値データを操作するためのExcelのすべての機能も利用できます。データ自体は常にソースに関連付けられたままであり、時間的に関連付けられたままです。ターゲット顧客の場合、データを操作するビジネスプロセスにまったく新しい外部システムを組み込む必要はありません。当社のソリューションは、金融データプロバイダーの事実上の標準であるExcel内の追加の「ツール」として組み込まれています。
WebアプリケーションをMicrosoftExcelと統合するための同様のアーキテクチャアプローチは、数値データや表形式データを操作するときに対話性と複雑なユーザーインターフェイスを必要とする他のタスクに適用できます。