2016-10-31 6 views
0

でファイルを私に与えます。それは電子メールのために別のエンドポイントにそれをPOSTするためのいくつかの他のコードを必要とする場合や、ブラウザで手動でエンドポイントを打つことによってExcelファイルをダウンロードしたい場合、GETとして機能すると考えられています。 Excelファイルをダウンロードしていますが、開こうとすると、ファイル形式やファイル拡張子が有効でないため、Excelファイルを開くことができません。ファイルが破損していないこと、ファイル拡張子ファイルの形式と一致します。C#HTTPGET応答が空のExcelが、私はExcelファイルを生成し、エンドポイントを作成しましたEPPlus

エラーが発生した後、私は応答内容フィールドまたはファイル拡張子でMIMEタイプを変更しようとしましたが、エラーが消えて次の警告が表示されます: "ファイルのフォーマットと拡張子"ファイルが破損しているか、安全でない可能性があります。ソースを信頼しない限り、ファイルを開かないでください。とにかくそれを開くと、ファイルはまだ空です。ここで

は私が作成したExcelPackageを取り、応答に追加したコードです。

var response = HttpContext.Current.Response; 
response.ContentType = "application/vnd.openxmlformats- officedocument.spreadsheetml.sheet"; 
var fileName = string.Format("blahblah-{0}.xls",  InstantPattern.CreateWithInvariantCulture("yyyy-dd-M-HH-mm-ss").Format(_clock.Now)); 
response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName)); 
response.BinaryWrite(excelPackage.GetAsByteArray()); 

私はapplication/excelのような別のMIMEタイプで追加しようとしました。私はxlsの代わりに.xlsxファイル拡張子を使ってみました。何も本当に働いていません。私はExcelPackageワークブックのワークシートに実際に必要なデータがあることを知っています。なぜなら、オブジェクトをデバッグしてマウスポインタを移動すると、そのデータをファイルに挿入することを期待しているセルの値が表示されるからです。だから私は何が間違っているの?

私はしばらくの間使用してブロック内の両方の2つの方法でexcelPackageを生成しようとしました。このような

using (var excelPackage = new ExcelPackage()) 
{ 
    // generate and download excel file 
} 

も::このよう

using (var excelPackage = new ExcelPackage(new FileInfo(fileName))) 
{ 
    // generate and download excel file 
} 
+0

MIMEタイプはブラウザにどのアプリケーションを使用するかを伝えるだけなので、Getを実行するときにブラウザがExcelを開いている場合、Mimeタイプは正しいです。 Excelエラーが発生した場合は、渡されたバイトが期待どおりのフォーマットでないためです。どのようにexcelPackageを生成していますか?それはおそらく問題です。 – Theo

+0

@Theoデフォルトのコンストラクタ(引数なし)でExcelPackageを生成しようとしましたが、FileInfoコンストラクタでも同じfileNameで渡しました。私は現在、このコードのすべてを、使用しているブロックの中で元の質問に編集します。 – HandleThatError

+0

コントローラのアクション内の何かが、バイトを書き込んだ後に応答内容を変更している可能性があります。バイトを書き込んだ後に 'response.End'を追加してみてください。 – Theo

答えて

1

私はブラウザにExcelファイルを送信するためにこれを使用します。

HttpResponse Response = HttpContext.Current.Response; 

//first convert to byte array 
byte[] bin = excelPackage.GetAsByteArray(); 

//clear the buffer stream 
Response.ClearHeaders(); 
Response.Clear(); 
Response.Buffer = true; 

//add the content type 
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 

//set the content length, without it, length is set to -1 and could give errors 
Response.AddHeader("content-length", bin.Length.ToString()); 

//add a filename 
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".xlsx\""); 

//send the file to the browser 
Response.OutputStream.Write(bin, 0, bin.Length); 

//cleanup 
Response.Flush(); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
+0

ありがとう!これは実際に動作します!次の例で見た他の例では、コンテンツの長さと出力ストリームのセクションが欠けていたと思います。 – HandleThatError

関連する問題