エクセルで作られた各種台帳類を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文で、テーブル名に相当するのがこのレンジになる。ここをシートとかにできないのかどうかは、試していない(少なくとも、単純にシート名をつけただけではダメだった)。