Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用asp.net和c流式处理Excel 2007或Word 2007文件#_C#_Asp.net_Excel_Ms Word - Fatal编程技术网

C# 如何使用asp.net和c流式处理Excel 2007或Word 2007文件#

C# 如何使用asp.net和c流式处理Excel 2007或Word 2007文件#,c#,asp.net,excel,ms-word,C#,Asp.net,Excel,Ms Word,我正在开发一个web应用程序,需要流式传输各种文件。我可以制作PDF、图像和较旧的Office文档。然而,当我尝试处理2007文档时,它会崩溃。这是我的密码: Response.Buffer = true; Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); switch (FileExtension.ToLower()) { case "pdf":

我正在开发一个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);
我得到的错误是:

An invalid character was found in text content. Error processing resource 'http://DomainName/GetFile.aspx... PK 在文本内容中发现无效字符。处理资源“”时出错http://DomainName/GetFile.aspx... 主键
有什么建议吗?

根据简短的web搜索,word和excel的正确mime类型是:

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

编辑:

下面的简化示例适用于我。它与您的不同之处在于它使用了一个通用处理程序而不是web表单(这更适合于这样的东西)

要测试它,请确保在应用程序的顶级文件夹中有一个名为Book1.xlsx的excel 2007文件

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);
        }
    }

}
下载电子表格.ashx:
使用制度;
使用System.Web;
使用System.IO;
公共类下载SpreadsheetHandler:IHttpHandler{
公共void ProcessRequest(HttpContext上下文){
context.Response.ContentType=“application/vnd.openxmlformats of icedocument.spreadsheetml.sheet”;
字符串路径=context.Server.MapPath(“~/Book1.xlsx”);
使用(FileStream电子表格=File.OpenRead(路径))
{
CopyStream(电子表格、上下文、响应、输出流);
}
}
公共布尔可重用{
得到{
返回false;
}
}
私有静态void CopyStream(流输入、流输出)
{
字节[]缓冲区=新字节[32768];
while(true)
{
int read=input.read(buffer,0,buffer.Length);

如果(读取我们希望使用Excel打开的csv格式文件,我们将使用:
Response.ContentType=“application/msexcel”;


也许我们可以侥幸逃脱,因为它不是真正的xls文件。

尝试过这个,它稍微好一点。我至少得到了“打开/保存/取消”对话框。但是,如果我在docx文件上单击“打开”,我只会得到一个空白html页。如果我在对话框上单击“保存”,将其保存到文件,然后打开它,我会通过一些错误提示单击“我”消息,然后得到正确的文件。对于xlsx文件,如果我保存然后打开,我会得到与docx相同的东西,即一些错误消息,然后它会打开。然而,如果我单击xlsx文件上的打开,我必须单击一些错误,然后excel会打开,但不是数据,而是我有我的登录页来完成。为什么它是这样工作的,而不是另一种方式我无法理解,但我现在太忙了,无暇顾及。还有一个名为context.Response的简便方法,可以让您避免手动复制文件流。还有Response.BinaryWrite(),您可以用file.ReadAllByte(filePath)填充它。允许我跳过CopyStream循环。如果您可以添加源代码,那就太好了?例如。
.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