web-dev-qa-db-ja.com

asp.netとc#を使用してExcel2007またはWord2007ファイルをストリーミングするにはどうすればよいですか

私はWebアプリに取り組んでおり、さまざまなファイルをストリーミングする必要があります。 PDF、画像、古いOfficeドキュメントを作成できます。しかし、2007年のドキュメントを処理しようとすると、壊れます。これが私のコードです:

    Response.Buffer = true;
    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    switch (FileExtension.ToLower())
    {
        case "pdf":
            Response.ContentType = "application/pdf";
            break;
        case "doc":
            Response.ContentType = "application/msword";
            break;
        case "docx":
            Response.ContentType = "application/vnd.ms-Word.document.12";
            break;
        case "xls":
            Response.ContentType = "application/vnd.ms-Excel";
            break;
        case "xlsx":
            Response.ContentType = "application/vnd.ms-Excel.12";
            break;
        default:
            Response.ContentType = "image/jpeg";
            break;
    }
    Response.BinaryWrite(buffer);

私が得るエラーは次のとおりです。

テキストコンテンツに無効な文字が見つかりました。リソースの処理中にエラーが発生しました 'http://DomainName/GetFile.aspx ... 
 
 PK 

助言がありますか?

13
Kevin

簡単なウェブ検索によると、WordとExcelの正しいmimeタイプは次のとおりです。

application/vnd.openxmlformats-officedocument.wordprocessingml.document
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

http://www.bram.us/2007/05/25/office-2007-mime-types-for-iis/

編集:

次の簡略化されたサンプルは私のために働きます。 Webフォームの代わりにジェネリックハンドラーを使用するという点であなたのものとは異なります(とにかくこのようなものに適しています)。

テストするには、アプリケーションの最上位フォルダーにBook1.xlsxという名前のExcel2007ファイルがあることを確認します。

DownloadSpreadsheet.ashx:

<%@ WebHandler Language="C#" Class="DownloadSpreadsheetHandler" %>

using System;
using System.Web;
using System.IO;

public class DownloadSpreadsheetHandler: IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        string path = context.Server.MapPath("~/Book1.xlsx");
        using (FileStream spreadsheet = File.OpenRead(path))
        {
            CopyStream(spreadsheet, context.Response.OutputStream);
        }
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

    private static void CopyStream(Stream input, Stream output)
    {
        byte[] buffer = new byte[32768];
        while (true)
        {
            int read = input.Read(buffer, 0, buffer.Length);
            if (read <= 0)
                return;
            output.Write(buffer, 0, read);
        }
    }

}
16
Erv Walter
.doc


application/msword

.dot


application/msword

.docx


application/vnd.openxmlformats-officedocument.wordprocessingml.document

.dotx


application/vnd.openxmlformats-officedocument.wordprocessingml.template

.docm


application/vnd.ms-Word.document.macroEnabled.12

.dotm


application/vnd.ms-Word.template.macroEnabled.12

.xls


application/vnd.ms-Excel

.xlt


application/vnd.ms-Excel

.xla


application/vnd.ms-Excel

.xlsx


application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

.xltx


application/vnd.openxmlformats-officedocument.spreadsheetml.template

.xlsm


application/vnd.ms-Excel.sheet.macroEnabled.12

.xltm


application/vnd.ms-Excel.template.macroEnabled.12

.xlam


application/vnd.ms-Excel.addin.macroEnabled.12

.xlsb


application/vnd.ms-Excel.sheet.binary.macroEnabled.12

.ppt


application/vnd.ms-PowerPoint

.pot


application/vnd.ms-PowerPoint

.pps


application/vnd.ms-PowerPoint

.ppa


application/vnd.ms-PowerPoint

.pptx


application/vnd.openxmlformats-officedocument.presentationml.presentation

.potx


application/vnd.openxmlformats-officedocument.presentationml.template

.ppsx


application/vnd.openxmlformats-officedocument.presentationml.slideshow

.ppam


application/vnd.ms-PowerPoint.addin.macroEnabled.12

.pptm


application/vnd.ms-PowerPoint.presentation.macroEnabled.12

.potm


application/vnd.ms-PowerPoint.presentation.macroEnabled.12

.ppsm


application/vnd.ms-PowerPoint.slideshow.macroEnabled.12
5

Excelを使用して開くcsv形式のファイルには、次のものを使用しています。Response.ContentType = "application/msexcel";

ただし、これは真のxlsファイルではないため、おそらくこれを回避できます。

0
Nij