C# 如何使用asp.net和c流式处理Excel 2007或Word 2007文件#
我正在开发一个web应用程序,需要流式传输各种文件。我可以制作PDF、图像和较旧的Office文档。然而,当我尝试处理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":
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