misc.log

日常茶飯事とお仕事と

ASP.NETでエクセルファイルの内容を一覧表示

エクセルで作られた各種台帳類をWeb経由で見られないものかと、ちょいと試してみる。ソースはMSDNのサンプル。

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ページを初期化するユーザー コードをここに挿入します。

    Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" + _
         "Data Source=" + "C:\Test.xls" + ";" + _
         "Extended Properties=Excel 8.0;"
        
    'Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" + _
    ' "Data Source=" + Server.MapPath("../Test.xls") + ";" + _
    ' "Extended Properties=Excel 8.0;"
   
    Try
        dbConnection = New OleDbConnection(connectionString)
        dbConnection.Open()

        'Excelシートから読み取りするコマンドを作成
        Dim dbCommand As OleDbCommand = New OleDbCommand _
            ("SELECT * FROM Range1", dbConnection)
        'データアダプタ作成
        Dim dbAdapter As New OleDbDataAdapter

        'コマンドをアダプタに渡す
        dbAdapter.SelectCommand = dbCommand

        'データセット用意
        Dim dbDataSet As New DataSet

        'データをFill
        dbAdapter.Fill(dbDataSet, "XLData")

        'グリッドに連結
        ExcelList.DataSource = dbDataSet.Tables(0).DefaultView
        ExcelList.DataBind()

    Catch ex As Exception
        ErrorLabel.ForeColor = System.Drawing.Color.Red
        ErrorLabel.Text = ex.Message
    Finally
        'DB切断
        dbConnection.Close()
    End Try

End Sub

冒頭の接続文字列を組み立てるところにあるファイル名、Web用の仮想ディレクトリから読み出すなら、Server.MapPathを使う必要がある。直接ローカルのファイルを読む場合、フルパスでOK。結局、エクセルファイルをDBとして使ってしまえ、というもの。ただし、これだとおそらく複数のユーザーによる閲覧に耐えられないと思う。やっぱりダメだ(道理で用例がWebでなかなか見つからないと思った)。
今回、オフィス内にあるファイルサーバー上のファイルを表示させたかったのだが、残念ながら「\\」で始まるパスでも、ネットワークフォルダ設定したパスでも読み出しができなかった。なんかうまい方法ないものだろうか。どうせ競合回避できないからダメだけど。
そうそう、もう1つ書き忘れ。上記コードを使う場合、エクセル上でレンジ選択して、それに「名前」をつけておく必要がある。中盤にあるコマンドオブジェクトに渡すSQL文で、テーブル名に相当するのがこのレンジになる。ここをシートとかにできないのかどうかは、試していない(少なくとも、単純にシート名をつけただけではダメだった)。