2011年07月の記事一覧

|

≪2011 年06月の全記事一覧へ 2011 年08月の全記事一覧へ≫

--------(--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2011-07-28(Thu)

ASP.net WebサイトでクライアントにExcelを返す

ASP.netで作成したWebサイトから、クライアントにExcelを返す処理が必要になりました。
サーバーにExcelをインストールし、CreateObjectで操作する方法もありますが、MSが推奨していないのとExcelのライセンスの問題もあるので、サーバーにExcelをインストールせずにというのが条件です。
どのような方法があるのかを調べながら簡単に確認してみましたので、念のため結果をメモっておきます。

----------------------------------------------------------------------
Crystal Reportでプレビューし、Excelにエクスポートする
----------------------------------------------------------------------
書き出されたExcelのレイアウトがかなり汚いので実用的ではありません。

ちなみに以下のようにすれば、プレビュー表示せずに直接Excel表示も可能です。
Dim rd As New ReportDocument()
With rd
.Load("xxxxxx.rpt")
.SetDataSource(xxxxxx)
.ExportToHttpResponse(ExportFormatType.Excel, Response, True, "xxxxxx")
End With


----------------------------------------------------------------------
普通にaspxでテーブル等を用いてレイアウトを作成し、Page_Loadイベントに以下を追加しクライアントに返す
----------------------------------------------------------------------
Response.Buffer = True
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader("Content-Disposition", "attachment;filename=xxxxxx.xls")


簡単に出来ますが、ひな形の利用ができないのと、細かな設定も出来ません(こちらのテストでは用紙余白の設定はできましたが、用紙サイズの設定が出来ませんでした)。


----------------------------------------------------------------------
ひな形となるExcelファイルを作成しておき、OLEで編集してクライアントに返す
----------------------------------------------------------------------
ひな形が利用できるのできれいに仕上がるが、ひな形のExcelに行やシートの追加などが出来ません。

'テンプレート取得
Using readStream As New FileStream("xxxxxx.xls", FileMode.Open), reader As New BinaryReader(readStream)
readStream.Position = 0
img = reader.ReadBytes(CInt(readStream.Length))
reader.Close()
End Using
'一時ファイル作成
strTempPath = Path.GetTempFileName
Using writeStream As New FileStream(strTempPath, FileMode.OpenOrCreate), writer As New BinaryWriter(writeStream)
writer.Write(img)
writer.Close()
End Using
'一時ファイルを更新
If Path.GetExtension(strBookPath) = ".xls" Then
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strTempPath & ";" & "Extended Properties=""Excel 8.0;HDR=NO;"""
Else
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strTempPath & ";" & "Extended Properties=""Excel 12.0;HDR=NO;"""
End If
Dim factory As DbProviderFactory = DbProviderFactories.GetFactory("System.Data.OleDb")
Using connection As DbConnection = factory.CreateConnection()
connection.ConnectionString = strConnection
connection.Open()
Using command As DbCommand = connection.CreateCommand()
       ・
       ・
       ・セルの値を更新する
       ・command.CommandText = "UPDATE [Sheet1$I2:I2] SET F1='セルの値'"
       ・
       ・
End Using
connection.Close()
End Using

'一時ファイルを返す
Using readStream As New System.IO.FileStream(strTempPath, IO.FileMode.Open), reader As New System.IO.BinaryReader(readStream)
readStream.Position = 0
Response.AddHeader("Content-Type", "application/vnd.ms-excel")
Response.AddHeader("Content-Disposition", "attachment;filename=xxxxxx.xls")
Response.BinaryWrite(reader.ReadBytes(CInt(readStream.Length)))
reader.Close()
End Using

'一時ファイルを削除
File.Delete(strTempPath)

'レスポンス終了
Response.End()



----------------------------------------------------------------------
ひな形となるExcelスプレッド形式ファイルを作成しておき、XMLとして編集してクライアントに返す(ひな形なしで新規作成も可能)
----------------------------------------------------------------------
ほぼ思い通りの動作ですが、Excelスプレッド形式の拡張子がxmlのため、クライアントがxmlを他のアプリケーションに関連付けているとExcelで開きません。
拡張子をxlsで返すことも可能ですが、Excel2007以降ではファイルの形式が拡張子が示す形式と異なるという警告がでます。
また、xmlの編集部分のコードがかなり複雑になってしまいます。

xml.Load("xxxxxx.xlm")

・xmlの編集を行う

Response.AddHeader("Content-Type", "application/vnd.ms-excel")
Response.AddHeader("Content-Disposition", "attachment;filename=xxxxxx.xls")
xml.Save(Response.OutputStream)
Response.End()



----------------------------------------------------------------------
ひな形となるExcelファイルを作成しておき、Excel Creatorで編集してクライアントに返す(ひな形なしで新規作成も可能)
----------------------------------------------------------------------
ほぼ何でもできますが、開発用にExcel Creatorの購入と、Webサーバーでの実行用ライセンスが必要となります。
ほぼ同じコードでPDFをクライアントに返すこともできます。


----------------------------------------------------------------------
全般的な注意
----------------------------------------------------------------------
※Excel2010ではクライアントで発行元の警告が出ますが、以下の設定を変更すれば回避出来ます。
Excel2010のセキュリティセンターの[保護されたビュー]で、以下のチェックをオフにする。
・インターネットから取得したファイルに対して、保護されたビューを有効にする
・安全でない可能性のある場所のファイルに対して、保護されたビューを有効にする
スポンサーサイト
2011-07-16(Sat)

MSCONFIGで設定変更後[OK]しても、再起動するかどうかの確認画面が表示されない。

再起動するかどうかの確認画面で、[今後、このメッセージを表示しない]をチェックしてしまうとこのようになります。
MsConfig確認画面


元に戻すには、以下手順でレジストリを変更する必要があります。
1. 以下のいずれかの方法でレジストリエディターを起動します
  ・スタートメニューの検索欄に regedit と入力しEnter
  ・Windowsキー + Rキーなどで、ファイル名を指定して実行を起動し、regedit と入力し[OK]する
2. HKEY_CURRENT_USER\Software\Microsoft\Shared Tools\MsConfig キーを開きます
3. NoRebootUIエントリの値が1になっていると思いますので、ダブルクリックして値を0にするかNoRebootUIエントリを削除します
4. レジストリエディターを終了します


他にも、同様に一度チェックしてしまうとレジストリ操作が必要なものがあります。
・IEの[情報バーにお気づきですか?]
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\InformationBar キーの、FirstTime エントリを1にします
・VistaのWindowsメールで「迷惑メールまたはフィッシングメールの可能性があるメッセージをダウンロードしました。迷惑メールは自動的に[迷惑メール]フォルダに振り分けられました。」
HKEY_CURRENT_USER\Software\Microsoft\Windows Mail\Mail キーの、Dont Show Junk Dialog エントリの値を0にします
・などなど。


 
プロフィール
Author:OMEGAT
FC2ブログへようこそ!
カレンダー
06 | 2011/07 | 08
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -
FC2カウンター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
忍者AdMax
検索フォーム
カテゴリ
ブロとも申請フォーム

この人とブロともになる

amazonお奨め商品



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。