none
ASP.NET(VB)でのEXCELファイル(拡張子「.xlsx」)出力につきまして RRS feed

  • 質問

  • お世話になっております。宜しければご教示ください。

    ASP.NET(言語=VB)でのEXCELファイル出力につきまして、

    以下のコードにてEXCELファイル出力自体は行えますが、

    Response.Clear()
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    Response.AddHeader("Content-Disposition", "attachment;filename=TEST.xlsx")
    Response.End()

    生成されたEXCELファイル(拡張子「.xlsx」)を保存して開こうとすると、

    「Excelでファイル'TEST.xlsx'を開くことができません。ファイル形式またはファイル拡張子が正しくありません。
    ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。」

    といったメッセージが表示され、ファイルを開く事ができません。

    拡張子「.xls」(97-2003ブック)で生成して保存すると、問題無く開く事ができます。

    Response.AddHeader("Content-Disposition", "attachment;filename=TEST.xlsx")

    Response.AddHeader("Content-Disposition", "attachment;filename=TEST.xls")

    拡張子「.xlsx」で出力するためには、どのような実装を行えば宜しいでしょうか。

    【開発環境】

    Windows 10 Enterprise 64bit
    Microsoft Visual Studio 2010





    • 編集済み nk_tk 2019年12月3日 1:35
    2019年12月3日 1:34

すべての返信

  • 以下のコードにてEXCELファイル出力自体は行えますが、

    Excel ファイル本体の出力コードが無いので、これだけだと応答ボディが 0 バイトになってしまい、ファイルとして認識されないと思いますが…実際のコードには、ファイル本体の出力コードも含んでいるのでしょうか?

    ファイル自体に問題が無いのに失敗する場合は、ダウンロードされたファイルのバイナリが完全に一致しているかどうかを確認してみてください。また、.xlsx 以外であれば正しくダウンロードされるのであれば、  Message Analyzer なり Fiddler なりで、通信内容を比較してみてはいかがでしょう。

    2019年12月3日 1:58
  • > 「Excelでファイル'TEST.xlsx'を開くことができません。ファイル形式またはファイル拡張子が正しくありません。
    ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。」

    ASP.NET もダウンロードも関係なくて、もともとの Excel ファイルが .xls 形式ということはないのですか?

    例えば、.xls 形式の Excel ファイルの拡張子を .xlsx に代えて開こうとすると、以下のエラーメッセージが出ます。これと同じことでは?

    > 拡張子「.xls」(97-2003ブック)で生成して保存すると、問題無く開く事ができます。

    とのことですから、それが疑わしいです。

    【追記】

    Response.AddHeader("Content-Disposition", "attachment;filename=TEST.xls")



    というのは「拡張子「.xls」(97-2003ブック)で生成」しているわけではなくて、応答ヘッダでファイル名を TEST.xls と指定しているだけです。ファイルの中身には全く影響はありません。

    ブラウザによりますが IE の場合はその拡張子でファイルの種類を判断します。
    • 編集済み SurferOnWww 2019年12月3日 3:32 追記
    2019年12月3日 3:15
  • >Excel ファイル本体の出力コードが無いので、これだけだと応答ボディが 0 バイトになってしまい、

    >ファイルとして認識されないと思いますが…実際のコードには、ファイル本体の出力コードも含んでいるのでしょうか?

    失礼致しました。ファイル出力のコードだけを記述してしまいましたが、実際はResponse.Writeで内容を挿入しております。

    Dim text As String
    Response.Write(text)

    >ダウンロードされたファイルのバイナリが完全に一致しているかどうかを確認してみてください。

    >また、.xlsx 以外であれば正しくダウンロードされるのであれば、  Message Analyzer なり Fiddler なりで、

    >通信内容を比較してみてはいかがでしょう。

    ご回答ありがとうございます。確認させていただきます。

    2019年12月4日 0:34
  • ご回答ありがとうございます。

    本質が.xlsのファイルに対して「.xlsxのファイルとして見て欲しい」と言っているだけ、ということですね…。

    根本的に実装方法を見直させていただきます。

    2019年12月4日 0:45
  • Response.Write は文字列データを出力するためのものです。

    CSV データの出力ならまだしも、今回は XLSX というバイナリ形式なので、Write メソッドを使うべきではないでしょう。

    代わりに BinaryWrite メソッドにバイナリを渡すようにするか、もしくは WriteFile メソッドに xlsx ファイルパスを指定するようにしてみてください。

    2019年12月4日 0:46
  • > Dim text As String
    > Response.Write(text)

    それでは文字列しか送信できませんよ。それで良いのですか?

    > 本質が.xlsのファイルに対して「.xlsxのファイルとして見て欲しい」と言っているだけ、ということですね…。

    いえ、ホントに Response.Write(text) としたのであれば「本質」(クライアントがダウンロードできたもの)は文字列です。

    サーバーに存在する xlsx 形式の Excel ファイルをクライアントにダウンロードさせたいのだと思っていたのですが違うのですか?

    一体何をしたいのでしょう? 失礼ながら、質問者さんにほとんど知識が無くて、話が通じてないように思います。

    あなたのやりたいことを具体的に書いてください。それから完全なコードをアップしてください。

    【追記】

    サーバーに存在する xlsx 形式の Excel ファイルをクライアントにダウンロードさせたいのであれば TransmitFile(String) メソッドを使うのがお勧めです。引数にはファイルの物理ファイルパス(MapPath メソッドで取得)を指定します。

    HttpResponse.TransmitFile メソッド
    https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpresponse.transmitfile#System_Web_HttpResponse_TransmitFile_System_String_

    WriteFile メソッドも使えますが、ファイルサイズが大きくなるとエラーになりますので。

    あなたのやりたいことがそういうことではない場合は、上にも書きましたが、あなたのやりたいことを具体的に書いてください。それから完全なコードをアップしてください。



    • 編集済み SurferOnWww 2019年12月4日 4:06 訂正
    2019年12月4日 1:10
  • nk_tkさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    エラーメッセージに基づいて、次の手順に従って修正してみてください。
    1. MS Excelアプリケーションを開きます
    2. [ファイル]に移動し、[開く]オプションを選択します
    3.破損したファイルを選択し、[開くと修復]オプションを選択します
    4. [修復]をクリックして修復を開始します

    詳細については、次のリンクを参照できます:https://www.stellarinfo.com/support/kb/index.php/article/resolve-error-excel-cannot-open-the-file-filename-xlsx

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年12月12日 8:42
    モデレータ