Excel on OneDrive is not a file
- 49. Open XML sample code
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
public async Task<IActionResult>
UploadSingle(IFormFile file){
//file save
// lastFile = getFile()
}
- 50. Open XML sample code
using (SpreadsheetDocument document = SpreadsheetDocument.Open(lastFile.FullName, false))
{
var wbPart = document.WorkbookPart;
var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
foreach (var sheet in wbPart.Workbook.Descendants<Sheet>())
{
…
- 51. Open XML sample code
var wsheetPart = wbPart.GetPartById(sheet.Id) as WorksheetPart;
if (wsheetPart != null)
{
if (sheet.Name == "○○一覧")
{
var ws = wsheetPart.Worksheet;
foreach (var row in ws.Descendants<Row>())
{
…
- 52. Open XML sample code
if (row.RowIndex == 1)//表タイトル
{
foreach (Cell cell in row)
{
//タイトル取得など
}
}
else
{
//表本体の処理
- 53. Open XML sample code
foreach (Cell cell in row)
{
var value = cell.InnerText;
//表本体の処理
}
Editor's Notes
- このセッションではMicrosoft Graph APIやPower Automate、Open XMLアーキテクチャを使ったExcelの操作を説明します。
ただし、ソースコードの解説だけならインターネット上にサンプルコードはたくさんありますから、ここでは現実の運用に即した運用手順の組み立て方のコツなどもお話しします。
- はじめに自己紹介させてください。【読む】本日のお話はIgnite the tour Osakaで話した内容の更新版となります。
- OneDriveにファイルを置く目的は「情報の共有」であり、「情報の共同編集」であり、「情報の保管」かもしれません。しかしながら、それを行うためにファイルという入れ物は、私は必要ではないと考えています。ファイルという入れ物に入れて情報システム部門でアクセス権を管理し、破棄ポリシーが無いままファイルサーバーが電子のゴミ箱みたいになっている状態を何度も見たことがあります。皆さんも同じではないでしょうか?MicrosoftはTeamsでExcelファイルを共同編集できるようにしました。OneDriveでは同じようにブラウザで共同編集できます。
これによって、ファイルをファイルサーバーからダウンロードして電子メールに添付して共有するといった作業は必要なくなりました。
- それでは実装の準備から進めましょう。
- まず、Office.comから経費報告書をダウンロードしてきて、これをテンプレートにするので、そのままOneDriveにアップロードします。
- 次に、日本語がおかしいところがあるので少々修正します。アップロードの時に気を付けていただきたいのがアカウントです。このファイルを操作するのは経費の申請者、承認者、経理部です。これまでのActive Directoryのアクセス権設定では、これまでのシステムと変わりません。例えば、複数の部署でのプロジェクトでプロジェクトマネージャーが主幹の部署の部長だったとします。その部長はプロジェクトの経費を承認できなければいけません。しかし、多くのケースではプロジェクトマネージャーの部署ではないメンバーの経費は、そのメンバーの組織上の上長が形式的に判を押し、それをもってプロジェクトマネージャーが承認するといったことが行われます。つまり、プロジェクトメンバーでない組織上の上長がプロジェクトの経費内容を知ることになります。多くの組織では権限上問題ないかもしれませんが、セキュリティ上は問題があります。
それぞれの運用を考慮したアカウントの設計が必要になります。
- これを、Graph Explorerでみるとこんな感じです。これが初期の内容になりますから、このExcelファイルを初期化する際(誰かが入力して、情報の共有が終わったら)このJSONで上書きしてしまえばよいということですね。
- そのため最初にこれをUTF-8で保存して、プロジェクトのルートに入れておきます。プロジェクトは何でも良いのですが私はASP.NET Core のMVC Webアプリケーションを使っています。
- または、OneDriveはバージョンを保持していますので、手動で行う「復元」についてもMicrosoft Graph APIを通してリクエストすることができます。
- Power Automateを定義する前に、このブックの構成を確認しておきます。
- 中身を見ると、明細エリアの日付フィールドが空白だったら空白を表示して、期間を表示しています。【クリック】
- また、各行の小計、各列の小計を出して最後に合計を出してますので、これらのセルはデータとしては必要ありません。
- Microsoft Graph APIを使うとExcelをファイルでなくユーザーインターフェイスとして使えるので、クライアントにはOfficeアプリケーションが必要ないという運用ができます。MacやAndroidを端末として使えるという利点もあります。
- 中身の確認が終わったらPower Automateで業務フローを作りましょう。ここでは、簡単に同じアカウントで業務の流れだけを先に作ってしまいます。
- 作成の流れはこんな感じです。【スライドを読む】ステップごとに解説します。ステップは3つだけです。各ステップの詳細を見ていきましょう。
- 経費明細書の置き場は便宜的にルートに置いてありますが「ファイルが変更されたとき」の対象はフォルダーになります。ですから、フォルダ内のファイルが変更されるごとにイベントが流れます。
ここでまず最初の設計の分岐を迎えます。イベントを全部拾って、必要なものだけを後続処理に流すのか?フォルダーを経理部と申請部署と分けるのかといった設計です。
王道はありません。入力の都度入力の検証を行うのがいいのか、入力完了の最後に検証を行うのかといった視点もありますし、入力の中断、レジューム機能を持たせたいとか、できる限り流れるイベント数を抑えたいといった視点もあります。
ここでは一例として、あるセルが変更されたらイベントを流すようにします。つまり、「申請者が申請送信したら」とか、「マネージャーが承認したら」というイベントドリブンを例にします。自動化されたフローを選択、名前を入力してonedriveを検索します。
- リストの最下部に「ファイルが変更されたとき」のOneDrive for Businessは2つあります。上はフォルダルートの変更をトリガーします。下はサブフォルダまで監視します。上を選んで作成をクリックすると次の画面で監視対象のフォルダーを選択することができます。
- ファイルが変更された時に対象のExcelファイルを読みます。「新しいステップ」をクリックし、Excel Online Businessを選んで「表内に存在する行を一覧表示」を選択します。
- 場所、OneDrive for Business、ドキュメントライブラリ、OneDrive、ファイル、経費明細書.xlsxを選択していきます。
- Office.comの経費明細書には、計算の為の��前定義がしてあるのでそれを使います。テーブルに、ExpenceDataを選択し、最後に保存します。
- エクセルファイルで名前を選択するとデータを取得できる範囲が分かります。ここに入力されたデータが配列で後続処理に流れてくるというわけです。
- 次に流れてきたデータを処理します。流れてくるデータというのは、先ほどの配列データです。配列を処理する場合は、制御処理アイコンを選択してApply to eachを選択します
- 入力ボックスをクリックして下に出てくる表示からvalueを選択します。続いてこの中から合計(各列の)が入っていればその行に入力があることがわかるので、まず合計だけ抜き出します。うまく動いたら各行の項目を追加していけばいいと思います。そのためまず「データ」と入力するとデータ操作アイコンが一番左に表示されるようになり、クリックすると下のリストにデータ操作関係のアクションが一覧されます。
- データ操作のリストから作成を選択し、入力ボックスをクリックすると項目を選ぶことができます。合計を選んで、合計が0円でなかったらTeamsに投稿するアクションを作ります。
- アクションの追加をクリックし、制御アイコンが表示されているので、アイコンを選択すると下に選択リストが表示されます。一番上の条件を選択し左の値の選択をクリックすると入力補助の画面が表示されます。注意が必要なのですが、データはすべて文字で受送信されます。ですから、ここでは数値に変換してから0円でないところだけ抜き出します。
- まず、式を選択して変換関数の中からint(value)を選択します。次にintの()の間にカーソルを当ててから動的コンテンツを選択してください。そこで出力を選択します。
- これで、作成のアウトプット、つまりエクセルの表の中の合計列の配列が数値型に変換されて後続処理に流れるようになりました。この後0円でないものだけTeamsに書き込まれるようにします。
- はいといいえでそれぞれ何をやるのかが定義できますから、はいの方にだけTeamsへの書き込みを定義します。はいの方でアクションの追加をクリックするとTeamsアイコンが選べるようになっています。
- Teamsアイコンをクリックし、メッセージを投稿する(V3)(プレビュー)をクリックするとチームやチャンネルを選べるようになります。右肩の3点リーダーをクリックするとチームやチャンネルを選ぶ際にそのアカウントが登録されているチームやチャンネルを選べるようになりますので複数のアカウントとの接続を持っている方は、対象のアカウントを選んでおいてください。チームにはそのアカウントが登録されているチームがリストに出ますので選択してください。
- 同様にチャンネルでGeneralを選んで本文に出力を選択します。
- 最後にApply to eachの下の新しいステップで制御から終了を設定します。
- 処理としては成功を返すように設定しておき、テストからトリガーアクションを実行するを選んでから保存&テストをクリックします。
- 燃料費に700円を入力すると、合計には式が入っていますので合計は0円ではなくなります。Teamsの画面に出力されたことでもフローが流れたことを確認できますし、Power Automateの画面でもフローが成功したことを確認できます。
- ここまで作ってしまえば、Teamsで結果を確認しながらフローを拡張していくことができます。
たとえば、結果画面のApply to eachをクリックし、条件をクリックするとどのような処理結果だったかがわかります。この場合、Excelからは11行分のデータが流れてきて1件目が0円以上だったことがわかります。次へをクリックすると【クリック】
- 結果はfalseになっており2行目が0円だったことがわかります。
- Power Automateで業務フローの動作確認が取れたら簡単なWebアプリを作りましょう。
- この例はKaizaraにも同じ通知を飛ばしています。Teamsの方もKaizalaの方も日付がおかしくなっていること、金額がフォーマットされていない事がわかると思います。
Excelファイルは日付データをOADateという型で値を保存してますから、これを.NETなどで扱いやすい型に変えてやる必要があります。このような処理は、Power Automateでやるのではなく、小さなプログラムを作ってPower Automateから利用する方が効率が良いかと思います。
- プログラムは非常にシンプルです。このような関数をHomeControllerに作成して、値段の場合は「ToString(“C”, new CultureInfo(“ja-jp”))」、日付の場合はDateTime型のFromOADateで変換して返してあげます。
- まず、Web App側で動作チェックを行うために簡単なページを作ります。ローカルでも確認できますし、Azureに発行してもかまいません。
- Power Automate側でポートを指定するのが面倒だったのでFreeプランのF1でAzure側に機能を発行しました。
- まず、Web App側で動作チェックをします。
- Web側で動作チェックができたらPower Automate側を作成します。
HomeコントローラーにConvertValueを追加したので条件の下にアクションを追加、HTTPを追加します。
- 日付と金額を変換します
- 次に条件を開けて、はいの箱にHTTPをドラッグアンドドロップします。このようにアクションはどこに入れても修正できるので試行錯誤しながら正しく動くフローを作ってください。
- はいの箱にHTTPを並べたらTeamsのメッセージを修正してKaizaraのアクションも追加します。
- 動作を確認します。
- 情報はセキュアにアクセスすべきで、セキュアとは組織のコンプライアンスに強く紐づくものです。つまり、Excelファイルの情報にはそのファイルにアクセスできる人間がアクセスできるように制御されている必要があり、認証は必須です。認証と認可が統制的に紐づいているMicrosoft 365という情報基盤はGoogle driveやBoxなどファイル制御中心に利用されているストレージサービスとは異なります。
OneDriveをファイルサーバーとして使っている以上、Google driveやBoxに対する優位性を享受することはできません。
- おそらく、OpenXML自体がわからないと、ハンセルマンのExcelDataReaderの使いどころがわからないと思いますので、簡単にOpenXMLを説明します。