none
Excelが開かない RRS feed

  • 質問

  • 印刷をExcelから行おうと思い下記のような記述をしました.

      Response.AddHeader("content-disposition", "attachment;filename=foo.xml");
      Response.Charset = "";
      Response.ContentType = "application/vnd.ms-excel";

    Excelが開くのを期待していたのですが,ブラウザが表示してしまいました.
    中身がXMLのまま

      Response.AddHeader("content-disposition", "attachment;filename=foo.xls");

    と書き換えるとExcelは起動したのですがXMLファイルとは認識してくれません.
    クライアントのWindowsのフォルダオプションでxmlを開くアプリケーションにExcelを設定すると正常に開けるのですが,
    全てのクライアントで設定するのは面倒です.(プログラムで設定出来ますでしょうか?)

      Response.ContentType = "application/vnd.ms-excel";

    を有効にする方法は無いものでしょうか?
    2009年4月27日 1:37

回答

  • ブラウザの挙動なので制御できません。
    例えばFirefoxで試したところ、Content-Typeに従いExcelが起動しました。
    また、IE8には「X-Content-Type-Options: nosniff」を与えるとContent-Typeに従うはずですが、ダウンロードファイルには効果がありませんでした。
    あと、XML内に「<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>」と書いておくとWindows ExplorerはExcelファイルであると認識しますが、Internet Explorerは認識しませんでした。
    • 回答としてマーク curex24 2009年4月28日 14:26
    2009年4月28日 3:44

すべての返信

  • どのようにして xml ファイルをサーバーからクライアントにダウンロードしているのでしょう?

    アップされたコードはヘッダ情報だけで、中身(xml ファイルの内容)をどのように HTTP ス
    トリームに書き込んでいるのかが分かりません。

    ローカルでフォルダにある xml ファイルを Excel で問題なく開けるのであれば、 Web アプ
    リでも、やり方を間違えなければ、クライアントの PC の Temporary Internet Files フォル
    ダに xml ファイルがダウンロードされ、それを Excel で開くことはできると思いますが。

    2009年4月27日 13:43
  • 中身は問題無いんです.

    Windows上でサフィックスが.xmlのファイルをダブルクリックすると一般的にはExcelではなくブラウザが開くと思うのですが,
    期待としては,そのフォルダオプションよりも
     Response.ContentType = "application/vnd.ms-excel";
    が優先されExcelが開いて欲しかったのですが,そうはならなかったって事なんです.

    一旦保存してExcelから開く事は出来ますが,出来ればダウンロード時のダイアログで「開く」を選んだ時にExcelが起動して欲しいのです.
    フォルダオプションで.xmlを開くアプリケーションを変更すればExcelが起動してくれますが,各端末でそうした手間を掛けたくないので,
    何か良い方法は無いでしょうか?
    2009年4月28日 3:19
  • ブラウザの挙動なので制御できません。
    例えばFirefoxで試したところ、Content-Typeに従いExcelが起動しました。
    また、IE8には「X-Content-Type-Options: nosniff」を与えるとContent-Typeに従うはずですが、ダウンロードファイルには効果がありませんでした。
    あと、XML内に「<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>」と書いておくとWindows ExplorerはExcelファイルであると認識しますが、Internet Explorerは認識しませんでした。
    • 回答としてマーク curex24 2009年4月28日 14:26
    2009年4月28日 3:44
  • XMLを一旦、読み込んでResponse.Writeすると、開くことが出来るかも知れません。

    1.foo.xmlを読み込む
    2.Response.AddHeader("content-disposition", "attachment;filename=foo.xls"); ←拡張子はxlsで!!
      Response.ContentType = "application/vnd.ms-excel";
      Response.Charset = "";
    3.Response.Write(1で読み込んだ内容)
    4.Response.End

    こんな感じでいかがでしょうか。
    2009年4月28日 3:57
  • 色々調べていただきありがとうございます.

    そうですかブラウザの都合だったのですね.

    客先の指定がInternet ExplorerなのでXMLじゃ無理って事で対案を相談してみたいと思います.

    2009年4月28日 14:13
  • 拡張子を.xlsにするのやってみました.

    期待通りExcelは起動したのですがファイルの中身がXMLだとは認識してくれませんでした.
    テキスト表示の様にXMLの書式のまま表示されてしまいました.

    何か付加情報を付ければうまく行く手法なのかもしれませんが,何をどう付けた物か...


    2009年4月28日 14:25
  • > 中身は問題無いんです.

    中身が問題だと言っているのではなく、どのようにして xml ファイルをサーバーからクライアントに
    ダウンロードしているのかを質問しているのですが。

    やり方を間違えなければうまくいくはずなんですけど。

    自分の環境(Vista のローカル IIS 環境。もちろん拡張子 xls は MS Excel に関連付け)では、以下
    のようなコードで IE7, Firefox, Opera, Safari で試しましたがいずれも Excel が立ち上がって xml
    ファイルが表示されます。(注: HyperLink で NavigateUrl="Data/UserInfro.xls" となっています
    が、中身は string path = @"C:\WebSites\MsdnTest\Data\UserInfro.xml"; と同じ xml ファイルで
    拡張子を変更しただけです)

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

        protected void Button1_Click(object sender, EventArgs e)
        {
            string path = @"C:\WebSites\MsdnTest\Data\UserInfro.xml";
            if (System.IO.File.Exists(path))
            {
                using (System.IO.FileStream stream = System.IO.File.Open(path, System.IO.FileMode.Open))
                {
                    int length = Convert.ToInt32(stream.Length);
                    byte[] data = new byte[length];
                    stream.Read(data, 0, length);
                    Response.ContentType = "application/vnd.ms-excel";
                    Response.AppendHeader("content-disposition", "attachment;filename=file.xls");
                    Response.BinaryWrite(data);
                    Response.End();
                }
            }

        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:HyperLink ID="HyperLink1" runat="server" Text="UserInfo"
                NavigateUrl="Data/UserInfro.xls" Target="_blank"></asp:HyperLink>
            <asp:Button ID="Button1" runat="server" Text="Download" OnClick="Button1_Click" />
        </div>
        </form>
    </body>
    </html>

    2009年4月28日 15:54