編集内容を保存する
SPREADのコマンドバーにある「コマンドアイコン」は、SPREAD自体への操作を行うためのものです。例えば、コマンドバーの左端にある「更新アイコン」についても画面で入力した値をSPREADに保存するためのものなので、サーバー側でExcelファイルを保存するときのイベントに利用する事はお勧めできません。
そこで、SPREADとは別に、[更新]ボタンを画面内に配置し、それがクリックされたらUpdate_Button.Clickイベントを発生させて、そのイベントプロシージャでExcelファイルの保存を行うようにします。
Protected Sub Update_Button_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles Update_Button.Click Try Dim filePath As String = System.IO.Path.Combine(My.Request.PhysicalApplicationPath, "App_Data") Call SetExcel(filePath, Me.FileName_Label.Text) Catch ex As Exception Me.Message_Label.Text = ex.Message End Try End Sub Private Function SetExcel(ByVal filePath As String, ByVal fileName As String) As Boolean Dim isOK As Boolean = False Try Me.Excel_FpSpread.SaveChanges() Me.Excel_FpSpread.SaveExcel(System.IO.Path.Combine(filePath, fileName), FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat) Catch ex As Exception Me.Message_Label.Text = ex.Message End Try isOK = True Return isOK End Function
クリックイベントの中ではSetExcelを呼び出していますが、前述のとおり「更新アイコン」をクリックするまで、画面で編集した内容はSPREAD内に保存されません。「更新アイコン」をクリックする代わりにSaveChangesメソッドで編集内容を確定してから、SaveExcelメソッドでWebサーバー上のExcelファイルに保存します。SaveExcelメソッドの第2パラメタはファイル形式であり、省略するとxlsファイル形式になります。xlsxファイル形式にしたいときは、UseOOXMLFormatを指定します。
ダウンロード機能を実装する
Private Function DownloadExcelFile(ByVal filePath As String, ByVal fileName As String) As Boolean Dim isOK As Boolean = False If GetExcel(filePath, fileName) Then Using ms As New System.IO.MemoryStream() 'http://support.microsoft.com/kb/436616/ja を参考に文字化け対策 fileName = HttpUtility.UrlEncode(fileName) ' Me.Excel_FpSpread.SaveExcel(ms, FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat) 'クライアント側に応答 Response.Clear() Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" Response.AddHeader("Content-Disposition", "attachment;filename=" & fileName) Response.BinaryWrite(ms.ToArray()) ms.Flush() ms.Close() Response.End() End Using isOK = True End If Return isOK End Function
Excelファイルをダウンロードする方法は何通りかありますが、今回のサンプルではSPREADにExcelファイルを読み込んで、それをMemroyStream経由でWebアプリからのレスポンスとして返却する方法を採用しています。
このような方法をとった場合、Excelファイルのファイル名が英数字であれば問題ないのですが、日本語ファイル名の場合は「ファイルのダウンロード」ダイアログで表示されるファイル名が文字化けしてしまいます。そのため、UrlEncodingを使ってファイル名を変換しています。文字化けする理由や対策の詳しい内容などはマイクロソフトサポートオンラインの「ファイルをダウンロードする ASP.NET Web ページで日本語ファイル名が文字化けする」の項目を参考にしてください。
まとめ
SPREADに対してあまり手間をかけずに、Excelデータを中心にしたWebアプリを作ってみましたがいかがだったでしょうか。実用的なアプリにするには、まだ手を加える必要はありますが、手を加えなければならない大部分はSPREAD以外の部分になると思います。
高機能な製品でも、初期状態や意図に合致したプロパティやメソッドがあれば利用難易度は機能の高低と比例はしません。もちろん、コンポーネントの初期状態が業務に一致し、業務提案がコンポーネント製品の初期状態に近い形であれば、相乗効果により効率的に高機能なシステムを作ることも可能です。
ぜひ、評価版をダウンロードして実際に手を動かし、コンポーネントの初期状態、そして製品に添付されているサンプルで、さまざまな使い方を身につけていってほしいと思います。