1. 首先,把ContentType改成:application/vnd.ms-excel
   其次,尽量避免使用HTTP Attachment的方式,很多应用不支持。你可以选择:1)把那个HttpHeader去掉,然后直接把.xls的文件内容用BinaryWrite写出去(这时候的文件名不对,但格式是对的);2)用Http Redirect,先把数据写在硬盘文件上,然后直接Redirect到那个.xls文件(这时候文件名对了,只是效率比较低);两者应该都能正常工作。2. 仅仅以文本形式无法控制Excel选择的格式,你必须调用Excel来生成相应的.xls文件才能控制。3. ContentType的值在Windows上是有应用程序自己注册的,在注册表里面,有一些常用的,但是Application/下面的可以任意——只要有应用程序认识;
Header也一样,是Http的扩展属性,只要客户端和Server都认识就行,没有固定的数量。

解决方案 »

  1.   

    对于第二点是否是先生成一个.xls文件,然后往里写数据,不用导出的方式?
      

  2.   

    不太可能,除非你真的熟悉.xls的文件格式。
    可以考虑通过COM调用excel生成文件,有很多例子,包括C#的。
      

  3.   

    Dim oExcel, oBook, oSheet, mm
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.add        oSheet = oBook.Worksheets(1)
            oSheet.Rows("1:1").RowHeight = 36.6
            oSheet.Range("A1").FormulaR1C1 = "test"
            oSheet.Range("A1").Font.Bold = True
            oSheet.Range("A1").Font.ColorIndex = 3
            oSheet.Range("A1").Font.Size = 16        oBook.Saved = True
            oExcel.UserControl = False
            mm = Server.MapPath(".") + "\aa.xls" '服务器保存地址 
            oExcel.ActiveWorkbook.SaveCopyAs(mm)
            oExcel.Quit()
            Response.Redirect("aa.xls")
      

  4.   

    我用了这种方法,但还是有个问题如下CS代码可以正常工作:

    Excel.Application  oExcel;  
    Excel.Workbook  oBook;  
    Object  oMissing  =  System.Reflection.Missing.Value;  
    oExcel  =  new  Excel.Application();  
    oBook  =  oExcel.Workbooks.Add(oMissing);  
    oExcel.Cells[1,1]="'000000524654854";  
    oBook.Saved  =  true;  
    oExcel.UserControl  =  false;  
    string  mm=Server.MapPath(".")+"\\cs.xls";
    oExcel.ActiveWorkbook.SaveCopyAs(mm);  
    oExcel.Quit();  
    Response.Redirect("cs.xls");但转换成VB代码却出现了问题:Dim oExcel As Excel.Application
    Dim oBook As Excel.Workbook
    Dim oMissing As Object = System.Reflection.Missing.Value
    oExcel = New Excel.Application()
    oBook = oExcel.Workbooks.Add(oMissing)
    oExcel.Cells(1, 1) = "'000000524654854"
    oBook.Saved = True
    oExcel.UserControl = False
    Dim mm As String
    mm = Server.MapPath(".") + "vb.xls"
    oExcel.ActiveWorkbook.SaveCopyAs(mm)
    oExcel.Quit()
    Response.Redirect("vb.xls")提示信息:
    拒绝访问。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。
    请检查堆栈跟踪信息,
    以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.UnauthorizedAccessException: 拒绝访问。 未授权此 ASP.NET 进程访问所请求的资源。
    出于安全原因,默认的 ASP.NET 进程标识为“{machinename}\ASPNET”,
    它只具有有限的特权。请考虑授予该 ASP.NET 进程标识访问此资源的权限。 若要授予 ASP.NET 对文件的写访问权,
    请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。
    单击“添加”以添加“{machinename}\ASPNET”用户。
    突出显示此 ASP.NET 帐户,在“允许”列中选中“写”框。源错误: 
    行 44:         Dim oBook As Excel.Workbook
    行 45:         Dim oMissing As Object = System.Reflection.Missing.Value
    行 46:         oExcel = New Excel.Application()
    行 47:         oBook = oExcel.Workbooks.Add(oMissing)
    行 48:         oExcel.Cells(1, 1) = "'000000524654854"难道我要为使用我的软件的所有用户机都填加一个用户?
    这个工作量太大了吧。
    为什么CS的代码就可以执行New Excel.Application()这个语句而VB不可以呢?另外,这种方法和我的要求不符,
    我要强行弹出下载/打开的对话框,
    用Response.Redirect的方法弹出对话框只能在客户机的文件夹选项->文件类型中进行设置,
    对于大量的客户机这似乎不可行;
    那么就只能用BinaryWrite,
    但文件名又不对,郁闷死了。谁能帮我彻底解决,再加100分
      

  5.   

    胖胖,我用了你的代码,并填加了对excel的引用,却出现如下错误:
    无法创建 ActiveX 组件。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Exception: 无法创建 ActiveX 组件。源错误: 
    行 57:         'Response.Redirect("vb.xls")
    行 58:         Dim oExcel, oBook, oSheet, mm
    行 59:         oExcel = CreateObject("Excel.Application")
    行 60:         oBook = oExcel.Workbooks.add
    行 61: 
     源文件: c:\inetpub\wwwroot\jiaoyanVB\WebForm3.aspx.vb    行: 59 堆栈跟踪: 
    [Exception: 无法创建 ActiveX 组件。]
       Microsoft.VisualBasic.Interaction.CreateObject(String ProgId, String ServerName)
       jiaoyanVB.WebForm3.Button2_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\jiaoyanVB\WebForm3.aspx.vb:59
       System.Web.UI.WebControls.Button.OnClick(EventArgs e)
       System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
       System.Web.UI.Page.ProcessRequestMain() 
      

  6.   

    用Crystal Report的导出功能也很不错,ExcelWriter也可以选择。
      

  7.   

    我用的C#也会出现
    异常详细信息: System.UnauthorizedAccessException: 拒绝访问。 
    的错误信息的。不知何故?另外,使用这种方法,WEB服务器是否必须要安装相应版本的OFFICE?比如说,你使用的Excel.dll是拿Office2000的EXCEL9.OLB转换的,是否在WEB服务器端就必须装Office2000?还有,使用此种方式导出的文件是否Office97、Office2000、OfficeXP都可以打开?
      

  8.   

    用水晶报表内置的导出excel功能,会把表格线导出为空格,看起来好恶心
      

  9.   

    直接用ADO在服务器端生成xls文件,然后让用户下载就可以。
    ADO2.5以上版本就可以。我就是用这种方法完成,用户非常满意。
      

  10.   

    我才用过我的代码,没有问题啊,能从服务器下载xls啊,你添加excel引用试一下
      

  11.   

    to jjstar, 不会呀,你用ExcelRecord试试看,还有我的是Crystal 9 中文版
      

  12.   

    我用的是装VSNET时自带的水晶报表,也不知道是什么版本的to胖胖,我已经添加了对excel的引用,要是没添加的话代码是不会编译通过的,现在是在运行时抛出异常