凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 240
  • 記事 - 0
  • コメント - 1361
  • トラックバック - 174
ニュース
  • 2008-11-08 わんくま富山勉強会#1 開催。参加者募集中
    2008-08-09 わんくま東京勉強会#23 「C#登場前夜」
    2008-04-01 *で始まるタイトルはエイプリルフールネタです
    2008-01-26 わんくま東京勉強会#16
    ライブプログラミング
    2007-12-08 わんくま名古屋勉強会#1
    「わんくま初めてのJava」
    2007-07-28 開店
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

システム開発の仕事をしているとお客さんからよくExcelで出力できないか?ということを聞かれます。

しかし、これが結構難問なのですね。ExcelはもともとMicrosoftによってクローズな規格で作られてきたものですから 外部との連携という点で非常に弱い。Excelファイルをサーバ側で動的生成してダウンロードさせるということがとても難しい。 また、ローカルのExcelファイルとサーバの間で通信するような仕掛けを作るのが難しい。

そんな開発者の愚痴のような話ですが、どうも最近では事情が変わってきているようです。

バイナリのxlsファイルは入出力が困難

2003年ぐらいにExcel出力をする案件を受けた際にはJavaからExcelを出力する信頼性の高い方法論が見つかりませんでした。 JavaでExcel出力というとApache POIが有名ですが 他のApacheのプロダクトに比べ、品質が低い。ライブラリ自体も洗練されておらず、非常に扱いにくいものです。 最近バージョン3.0が発表されました。私は3.0については未評価ですが、 2.5.1では画像が使えない、グラフが使えないといった制約がありました。

当時は.NETに迂回してExcel出力するというトリッキーな手法で対応したのですが、.NET側からですら Excel出力をするまともなMicrosoft提供のプロダクトがなかったように記憶しています。 結局、ExcelCreatorという サードパーティのツールで出力させていたのですが、よく考えればおかしな話です。

このほかに、たしかサーバ上でExcelを起動してファイルを作成するような方法論があったと記憶しています。 しかし、多重起動などで問題を抱えていたような…。このあたり自分で導入したわけではないので 名称などもよくわからないのですが、当時を知る方がいらっしゃいましたら情報をいただけると助かります。

OpenOffice.orgならフォーマットがオープン

私は特別な事情がない限りはOpenOffice.orgを愛用しているのですが、 その理由はファイルフォーマットがオープンな規格(OpenDocumentFormat)を採用していることもあり、 Excel出力に比べ、格段に安定した表計算ソフトでの出力が可能である点です。

また、マクロが強力で、VBAにくらべ制約が少ないのも魅力的です。

VBAでSOAP通信をする場合、SOAP Toolkitを使うのですが、 日付型などでのnull値の扱いが胡散臭かったり、何かと苦労させられました。 対応型も少なく、サーバ側でSOAP Toolkitで使える型に合わせてインターフェースを決めるなど、 随分と苦労させられました。

こういった点からもExcelは単体の表計算ソフトとして利用するのであればともかく、 システムの土台としてのプラットフォームとしては厳しい評価をせざるを得ないと考えていました。 企業への導入率は非常に高いため、「OpenOffice.orgだったら可能なんですけどねぇ」という話は 冗談としてしか受け取ってもらえなかったりと悲しい思いをしたこと幾星霜。

Excel 2003 以降ならデータだけならXMLで出力できる

Excel 2003以降であれば、 XML形式でのファイルフォーマットがサポートされたため比較的簡単にそして 信頼性の高い方法でExcel出力が可能となりました。

XMLでの出力で済むため、JSPで記述することでExcel出力が可能です。 しかし、セルのスパンなどをした場合、Indexを綺麗にあわせないとフォーマットの エラーとなり開けないなど、デリケートな部分があり、がりがりと生のXMLを書き出すには それなりの慣れが必要です。

また、このXMLフォーマットでは画像を張れない、矢印などの図形オブジェクトが置けない、 グラフが使えない、マクロが使えないといった制約があるため、 出力する内容によっては採用できません。

Excel 2007 であればOpenXML形式で出力できる

2003でのXML出力はデータの出力に限定すれば便利でしたが、図表などが用いれないため 非常に用途の限られるものでした。

Excel 2007 以降ではMicrosoft Office Open XMLというEcma標準規格を採用 (というより規格を作ってEcmaに認証を通した)。 これにより、オープンな規格でのファイルフォーマットとなったため、 信頼性の高いExcel出力処理が可能となったのです。

OpenOffice.orgと比べると、「やっと」という感じですね。 それにしても、すでに存在するISO(国際標準化機構)標準であるOpenDocumentを使わずに独自のフォーマットを制定して Ecma(欧州電子計算機工業会)標準化するあたり、なんともMicrosoftらしいですね。

この形式での拡張子はxlsxとなりますが、 互換パックを導入 することでExcel 2003などでも読み書きできるようになります。

Excelに固辞する企業相手には、2007への完全移行までの間、パッチを入れることを飲んでもらえるようなら、 OpenXML形式でのExcel出力が一番無難なソリューションに思えます。

投稿日時 : 2007年10月12日 14:42
コメント
  • # re: WebからExcel出力のためのソリューションは?
    凪瀬
    Posted @ 2007/10/12 14:46
    なお、エクセルソフトからJavaでExcel出力するミドルを販売しています。
    http://www.xlsoft.com/jp/products/actuate/index.html
    評価した感じでは機能性は非常に良好。
    しかし、ライセンス料が高かったので導入を断念。(サーバライセンスで1Mぐらい)
  • # re: WebからExcel出力のためのソリューションは?
    さかもと
    Posted @ 2007/10/12 15:02
    多いですよねー!
    「Excelで!」っていう要望(笑)

    いや、非常に便利ですし、ちゃちゃ!っと出来るならそれでもいいんですけど・・・。

    そのうち出力したExcelがシステムの基盤になっちゃって、担当者が変わったらマクロがよくわからなくなっちゃって、数字がExcelマクロとあわない、とかいわれちゃって・・・。


  • # re: WebからExcel出力のためのソリューションは?
    えムナウ
    Posted @ 2007/10/12 15:04
    VSTOじゃ駄目なんだろうか?
    http://www.microsoft.com/japan/msdn/vstudio/office/
  • # re: WebからExcel出力のためのソリューションは?
    えムナウ
    Posted @ 2007/10/12 15:07
    サーバーにもExcelのライセンスが必要なのが、
    ネックになるのかな?
  • # re: WebからExcel出力のためのソリューションは?
    裏口
    Posted @ 2007/10/12 15:29
    7月より稼働開始したシステムではもろにExcelCreator使用してます。
    ExcelというかOffice自体がXP(2002)なんでやむなく。

    # でもいいネタ知りました。情報提供感謝します。
  • # re: WebからExcel出力のためのソリューションは?
    凪瀬
    Posted @ 2007/10/12 15:32
    .NET系だと今だとVSTOなんでしょうねぇ。
    そちら側は疎いのですが。
    Javaで出来ているシステムの場合、OSがそもそもUnix系だったりするんでVSTOは選択肢外になりがち。
  • # re: WebからExcel出力のためのソリューションは?
    凪瀬
    Posted @ 2007/10/12 15:33
    Excel出力は要望多いのですが、ソリューションについてまとめたページを見つけれなかったので書いてみました。
    情報的には穴だらけかとは思いますが、補完いただけると助かります。
  • # re: WebからExcel出力のためのソリューションは?
    Mr.T
    Posted @ 2007/10/12 17:43
    Mr.Tです、こんにちは、

    ContentType = application/vnd.ms-excel
    と一緒に、データをはいてあげるとかやったことは
    ありますね。

    単純なテーブルなら、それで事足りたように
    思います。
  • # re: WebからExcel出力のためのソリューションは?
    凪瀬
    Posted @ 2007/10/12 17:51
    それはCSV(カンマ区切り)ですか?
  • # re: WebからExcel出力のためのソリューションは?
    Mr.T
    Posted @ 2007/10/13 10:25
    >それはCSV(カンマ区切り)ですか?

    いえ、ちゃんとxlsファイルになります。
    図、とかグラフとかはやったことないので
    わかりません。

    Tableタグで作成した表なんかは、セルの表に置き
    換わってくれましたし、色もつけられました。
    未確認ですが、セルの参照もできるみたいです。
  • # re: WebからExcel出力のためのソリューションは?
    凪瀬
    Posted @ 2007/10/13 22:25
    どういう状況なのかよく理解できない…
    MIMEタイプを指定したところでHTTPのレスポンスのボディ部にはどういうデータを出力してるんでしょう?
    MIMEタイプでExcelを指定してカンマ区切りでデータを出力でもしたのかと思ったのですが違うようですし。
  • # re: WebからExcel出力のためのソリューションは?
    凪瀬
    Posted @ 2007/10/13 23:17
    本文中のサーバ上でExcelを起動して~というのは
    「サーバーサイド オートメーション」というようですね。
    http://support.microsoft.com/kb/257757/ja
  • # WebからExcel吐き出し
    Mr.Tの場所
    Posted @ 2007/10/16 12:30
    WebからExcel吐き出し
  • # 名古屋勉強会#1の反省点
    凪瀬 Blog
    Posted @ 2007/12/10 21:14
    名古屋勉強会#1の反省点
  • # re: WebからExcel出力のためのソリューションは?
    DAI
    Posted @ 2008/01/04 1:28
    冷静に考えると誰でも疑問に思うはずなのに、WEB上の議論で見かけないです。
  • # re: WebからExcel出力のためのソリューションは?
    choi
    Posted @ 2008/09/29 11:15
    私の会社ではこんな感じで簡単なexcelファイルを出力しています。(excel2007ではデータが損失している可能性ありと警告が出てしまうのですが…)

    this.Response.Charset = "utf-8";
    System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("utf-8");

    this.Response.ContentType = "application/vnd.xls";
    this.Response.AddHeader("Content-Disposition", "attachment;filename=*******.xls");

    StringWriter writer = new StringWriter();
    HtmlTextWriter htmWriter = new HtmlTextWriter(writer);

    htmWriter.WriteBeginTag("html");
    htmWriter.WriteBeginTag("head");
    htmWriter.WriteEndTag("head");
    htmWriter.WriteBeginTag("body");

    StringBuilder tag = new StringBuilder();
    tag.Append("<TABLE border='1' width='100%' cellSpacing='1' cellPadding='3' bgColor='#d3d3d3' STYLE='font-size:9pt'>");
    tag.Append("</TABLE>");

    htmWriter.WriteLine(tag);
    htmWriter.WriteEndTag("body");
    htmWriter.WriteEndTag("html");
    this.Response.Write(tag);
    this.Response.End();
  • # re: WebからExcel出力のためのソリューションは?
    choi
    Posted @ 2008/09/29 11:17
    Mr.Tさんのおっしゃるように簡単な色指定や文字の位置等html形式で指定したとおりに出力できます。
  • # re: WebからExcel出力のためのソリューションは?
    choi
    Posted @ 2008/09/29 11:20
    訂正です。
    下から5行目の
    htmWriter.WriteLine(tag);
    はいりません。
  • # re: WebからExcel出力のためのソリューションは?
    choi
    Posted @ 2008/09/29 12:05
    office2007からは厳格になったようですね。
    上のソースで出力したexcelファイルをoffice2003で開くと問題が無く、2007で開くと警告が出ます。

    this.Response.ContentType = "text/html";
    this.Response.AddHeader("Content-Disposition", "attachment;filename=******html");
    とした上で出力されたhtmlファイルを2007で開くと問題なくexcelの表として開くことができました…
タイトル  
名前  
Url
コメント