投稿数 - 24, コメント - 191, トラックバック - 26

WebシステムでOLEを利用してExcelファイルを出力する方法

凪瀬さんのWebからExcel出力のためのソリューションは?が元ネタです。
Mr.TさんのWebからExcel吐き出しも元ネタです。
※だいぶ以前のエントリに今さらトラックバックして申し訳御座いません。

 業務系Webシステムを構築していると確かに「Excelで出力して欲しい」と言う要望は多々あります。
 その様な場合、多くの場合はMr.Tさんと同じくHTMLを使用する方法でExcelファイルを作成して参りました。
 HTMLを使用する方法には以下の特徴があります。

  • サーバーにExcelをインストールする必要が無い。
  • Excel 2000以降でのみ開く事が出来る。
  • 1ファイル(ブック)当たり、1シートのみ。
  • マクロや画像を含められない。

 しかしながら、現場の要望では1つのファイル(ブック)に複数のシートを含めたいと言う要望は多々あります。
 その場合に私が代替として使用しているのはHTML形式ではなくXMLスプレッドシート形式です。
 ※XMLを用いる方法は凪瀬さんがご紹介されている方法の一つですね。
 XMLスプレッドシートを使用する方法には以下の特徴があります。

  • サーバーにExcelをインストールする必要が無い。
  • Excel 2003以降でのみ開く事が出来る。
  • 1ファイル(ブック)当たり、複数シートに対応。
  • マクロや画像を含められない。

 以上の方法はWebサーバー内にExcelのライセンスや他社ミドルウェアを要せず、比較的簡単にExcelファイルを作成出来るのですが、マクロや画像を含めたい時やExcel 2000以前で複数シートを作成したいと言う要望には対応出来ません。
 その様な場合に私が使用しているのはOLEです。
 OLEを使用してExcelファイルを作成する事は、「ExcelのファイルをOLEデータベースとして扱う」と言うイメージで、以下の特徴があります。

  • サーバーにExcelをインストールする必要が無い。
  • テンプレートとなるファイルをサーバー内に配置しておく必要がある。
    ※テンプレートはExcel 97-2003形式(*.xls)とする事。
  • Excel 97でも開く事が出来る。
  • 1ファイル(ブック)当たり、複数シートに対応。
  • マクロや画像を含められる。

 OLEを使用する方法をご存知の方も多いかもしれませんが、一応以下にサンプルコードを載せておきます。

Imports System.Data.Common

Imports System.IO

   

Partial Public Class WebForm

    Inherits System.Web.UI.Page

   

    Protected Sub Page_Load(ByVal sender As Object, _

                            ByVal e As System.EventArgs) Handles Me.Load

   

        'テンプレートファイルを取得する

        'ASP.NETにのアクセス権に注意する事

        Dim image As Byte()

        Using readStream As New FileStream("C:\TemplateBook.xls", FileMode.Open), _

              reader As New BinaryReader(readStream)

            readStream.Position = 0

            image = reader.ReadBytes(CInt(readStream.Length))

            reader.Close()

        End Using

   

        'ファイルをTempディレクトリに書き出す

        Dim tempFileName As String = Path.GetTempFileName

        Using writeStream As New FileStream(tempFileName, FileMode.OpenOrCreate), _

              writer As New BinaryWriter(writeStream)

            writer.Write(image)

            writer.Close()

        End Using

   

        'ファイルのDataシートにデータを埋め込む

        'Dataシート行目のA列、B列にそれぞれCodeNameと入力しておく事

        Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _

                                         "Data Source=" & tempFileName & ";" & _

                                         "Extended Properties=""Excel 8.0;HDR=YES;"""

        Dim factory As DbProviderFactory = DbProviderFactories.GetFactory("System.Data.OleDb")

        Using connection As DbConnection = factory.CreateConnection()

            connection.ConnectionString = connectionString

            connection.Open()

            Using command As DbCommand = connection.CreateCommand()

                command.CommandText = "INSERT INTO [Data$] ([Code],[Name]) VALUES('A','123')"

                command.ExecuteNonQuery()

            End Using

            connection.Close()

        End Using

   

        '作成したファイルを返却する

        Using readStream As New System.IO.FileStream(tempFileName, 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=Test.xls")

            Response.BinaryWrite(reader.ReadBytes(CInt(readStream.Length)))

            reader.Close()

        End Using

   

        '一時ファイルを削除する

        File.Delete(tempFileName)

   

        'レスポンス終了

        Response.End()

   

    End Sub

   

End Class


 サンプルはC:\にTemplateBook.xlsと言うテンプレートファイルを配置している事を前提としています。
 テンプレートファイルにはDataシートを用意し、先頭行(ヘッダ行)にCodeおよびNameと言う文字を入力しておくことで、それらをCode列、Name列と認識させています。(接続文字列内にHDR=YESとありますが、これはシートにヘッダ行が存在する事を宣言しています。)
 この方法はHTMLやXMLと異なり、表形式のシートに値を挿入するだけの事しか出来ません。
 従い帳票の代替えとして使用する為には関数等を用い、「出力帳票イメージのシート」に対して「OLE経由で値をセットしたデータシート」から値を参照させる必要があります。(VBAを用いてWorkbookのOpen時に加工しても良いでしょう。)

投稿日時 : 2007年12月11日 12:33

フィードバック

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

Office 2007 からなら、SpredSheet ML の仕様は公開されていますし、中身は ZIP 圧縮された XML ですから、ある意味ではもっと楽でしょうね。
2007/12/11 13:06 | シャノン

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

> Office 2007 からなら、SpredSheet ML の仕様は公開されていますし

OpenXMLのこと?
ヤツは使ってみるとかなりツライよ…orz
2007/12/11 13:16 | 凪瀬

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

シャノンさん、凪瀬さんこんにちはw
私の周りでは未だOffice 2007はそんなに普及していないんですよね...
いまだにExcel 2000がザラだったりするので、OLEなんて技術が便利だったりするんです。
2007/12/11 13:18 | むら

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

Mr.Tです、こんにちは。
Excel97はさすがになくなってきた感がありますが、Excel2000はまだ現役でしょう。
OLEなら複数シートでもいけるんですね。
一度ファイルとして保存しないといけないのが、ネックかもしれませんね。
2007/12/11 14:06 | Mr.T

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

> OpenXMLのこと?

そ。

> ヤツは使ってみるとかなりツライよ…orz

だから「ある意味で」。
2007/12/11 16:22 | シャノン

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

> Mr.Tさん
> 一度ファイルとして保存しないといけないのが、ネックかもしれませんね。

こんにちは、コメント有難う御座います。
仰るとおり一度保存する事がネックになる事もあるかもしれませんね。
また、明細の件数まで含めて定型の書式であればそんなに問題では有りませんが、明細件数が変動
するような帳票の場合はVBA等で加工する必要があるのもネックですね。

> シャノンさん、凪瀬さん

OpeんXMLではありませんが、私はXMLスプレッドシート形式をよく利用します。
次の様な手順で作成していますが、ある意味で楽ですよ。
(以下手順は半ば邪道です。)

1. Excelを起動して作成したいExcelファイルの枠線や書式を完成させる。
2. 書式内でデータを埋め込みたい所に「$項目名$」を埋めておく。
3. 完成したExcelファイルを「XMLスプレッドシート(*.xml)」形式で保存する。
4. 保存したファイルをメモ帳等で開き、文字列をコピーする。
5. コピーした文字列内の「$項目名$」を文字列置換してXMLを完成させるプログラムをコーディング。
6. 完成したファイルをResponseで返却する。
 (Content-TypeはExcelにし、拡張子はxlsとします。)

OpenXMLは良く存じ上げませんので、何とも...
2007/12/11 16:43 | むら

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

Jet(OLE)は、やっぱり、個人的には好きになれないんですが、
Excel2000 とかが稼動条件だと、こうせざるを得ないんでしょうね。

ちなみにVSTOも検討したいところですよね。
2007/12/11 17:07 | けろ

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

> けろさん
> ちなみにVSTOも検討したいところですよね。
サーバーにExcelをインストールしなければならない点がネックになりそうな...
2007/12/11 17:26 | むら

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

Excel2003の場合は、セルのスタイルのIDが固定なのでいいのですが、
OpenXMLだとIDではなくてインデックスで扱われるため、すぐにセルのスタイルがずれ込んでしまう…。
誰だISOにすでにOpenDocument規格があるってのに、こんなのわざわざ作ってECMAに規格を通した奴は!
2007/12/11 23:34 | 凪瀬

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

>VSTO
Java系だとサーバをWindowsにしないケースが多いので選択肢外となることが多いですね。
2007/12/11 23:35 | 凪瀬

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

> 誰だISOにすでにOpenDocument規格があるってのに、こんなのわざわざ作ってECMAに規格を通した奴は!

ちょうど「Office Open XML File Formatsと相互運用性」と言うサイトがリニューアルされたと言うメールが来ました。
ttp://www.microsoft.com/japan/interop/openxml/default.mspx

とりあえず「OpenXMLとは」から読んでみますか...
2007/12/12 9:23 | むら

# re: WebシステムでOLEを利用してExcelファイルを出力する方法

VSTOは、いろんな面でリスクがあるんですね。仕方ないです orz
OpenXMLですか。まずは読んでみます。
2007/12/12 20:56 | けろ

コメントの投稿

タイトル  
名前  
URL
コメント