SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(SPREAD)

「WebでExcelを編集したい」技術系掲示板でよく見かける質問をSPREAD for ASP.NET 5.0Jで解決する

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (68.9 KB)

編集内容を保存する

 SPREADのコマンドバーにある「コマンドアイコン」は、SPREAD自体への操作を行うためのものです。例えば、コマンドバーの左端にある「更新アイコン」についても画面で入力した値をSPREADに保存するためのものなので、サーバー側でExcelファイルを保存するときのイベントに利用する事はお勧めできません。

 そこで、SPREADとは別に、[更新]ボタンを画面内に配置し、それがクリックされたらUpdate_Button.Clickイベントを発生させて、そのイベントプロシージャでExcelファイルの保存を行うようにします。

リスト5 編集内容を保存する
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を指定します。

ダウンロード機能を実装する

リスト6 Excelファイルの内容をダウンロードする
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 ページで日本語ファイル名が文字化けする」の項目を参考にしてください。

図10 Excelファイルのダウンロード
図10 Excelファイルのダウンロード

まとめ

 SPREADに対してあまり手間をかけずに、Excelデータを中心にしたWebアプリを作ってみましたがいかがだったでしょうか。実用的なアプリにするには、まだ手を加える必要はありますが、手を加えなければならない大部分はSPREAD以外の部分になると思います。

 高機能な製品でも、初期状態や意図に合致したプロパティやメソッドがあれば利用難易度は機能の高低と比例はしません。もちろん、コンポーネントの初期状態が業務に一致し、業務提案がコンポーネント製品の初期状態に近い形であれば、相乗効果により効率的に高機能なシステムを作ることも可能です。

 ぜひ、評価版をダウンロードして実際に手を動かし、コンポーネントの初期状態、そして製品に添付されているサンプルで、さまざまな使い方を身につけていってほしいと思います。

製品情報

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(SPREAD)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5535 2010/10/29 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング