我想把数据导到Excel里,并保存在服务器一指定位置,用以下的方法,可是服务器上的office如
果是office2000和officeXp两种版本saveas的参数差一个,所以会出错,这样让客户极为恼火,不能随便装在哪台机器上,老板的脸色也...哪位老大能帮解决一下这个问题,小弟不胜感激!分不够再加,在线等待...
Excel.WorkbookClass oWB;
oWB.SaveAs(...)

解决方案 »

  1.   

    你可以dataset 导入 excel参考
    http://community.csdn.net/Expert/topic/3077/3077526.xml?temp=.8746912
    http://www.dev-club.com/club/bbs/showEssence.asp?id=26350http://dev.csdn.net/Develop/article/18/18623.shtm
    http://community.csdn.net/Expert/topic/3112/3112296.xml?temp=.926861
    http://dotnet.aspx.cc/ShowDetail.aspx?id=BF0A54F9-C7C7-4200-BD9A-802AC1F5DE50
    http://expert.csdn.net/Expert/TopicView1.asp?id=2928057www.foxhis.com/powermjtest/
    原文代码:
    private void Button1_Click(object sender, System.EventArgs e)
    {
      //写入Excel的方法:
      //定义需要参数。
      string SourceFile="Data.XLS";                                //源文件名称。
      string TemplatePath=Server.MapPath("ExcelTemplate");    //存放源文件的文件夹路径。
      string DownloadPath=Server.MapPath("ExcelDownload");    //副本的文件夹路径。
      //副本的文件名。
      string TempFileName = DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + ".XLS";  
      object missing = System.Reflection.Missing.Value;
      Excel.Application myExcel=new Excel.Application();
      //打开新文件
      myExcel.Application.Workbooks.Open(TemplatePath+"\\"+SourceFile,missing,missing,missing,missing,
    missing,missing,missing,missing,missing,missing, missing,missing); 
      Excel.Workbook myBook=myExcel.Workbooks[1];
      Excel.Worksheet curSheet = (Excel.Worksheet)myBook.Sheets[2];

      string DownloadFilePath=DownloadPath+"\\"+TempFileName;

      int i=0;
      while (i<=10)
      {
        myExcel.Cells[4+i,2]=i.ToString();
        myExcel.Cells[4+i,3]=i.ToString();
        myExcel.Cells[4+i,4]=i.ToString();
        myExcel.Cells[4+i,5]=i.ToString();
        myExcel.Cells[4+i,6]=i.ToString();
        i++;
      }   

      myBook.Saved=true;
      //myBook.SaveAs(DownloadFilePath,missing,"","",false,false,Excel.XlSaveAsAccessMode.xlNoChange,1,false,missing,missing);

      myBook.PrintPreview(0);
      //myBook.PrintOut(missing,missing,missing,missing,missing,missing,missing,missing);
      myBook.Close(false, null,null);
      myExcel.Quit();
      System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
      System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
      myBook = null;
      myExcel = null;
      GC.Collect();
      //Response.Redirect("ExcelDownload//"+TempFileName); //下载文件
    }
      

  2.   

    你判断一下是什么Office可以办到吗?
      

  3.   

    不是吧,dataset导到excel这么复杂?
      

  4.   

    用try...catch行么?
    存储时出错就调用另一种存储方式,不出错就通过
      

  5.   

    可是引用时只能引用一个版本的office组件,怎么才能做到能编译得过去,又能适应不管是xp还是2000版本的情况,而不会使程序出错,谢了,各位老大。
      

  6.   

    嘿,如果不要修饰的效果,其实生成一个扩展名字为xls的文本文件即可,以tab 分开各列,
      

  7.   

    如果导到Excel的内容不复杂建议用owc.dll进行操作Excel,这样就不会遇到office版本不一致的情况。
      

  8.   

    不要引用com组件 进行操作Excel用流格式生成Excel文件 动态向文件中写东西
      

  9.   

    保存一个excel模版,当作数据库来读取,用读取数据库的方式向xls里面写数据,然后把文件下载就行了,最好不用Excel对象。
    另外同意wu621的看法,如果对导出的excel格式没有要求(就是说文本形式的excel也可以的话,不用此文件作为数据库),可以用owc导出html内容的内容,保存成.xls文件即可。
      

  10.   

    最好的办法是用反射的方式操作Excel,而不要直接引用Excel的库,那样有版本兼容性的问题。
    System.Reflection,楼主会用吧。
      

  11.   

    我是不用COM的,直接生成XML给EXCEL打开。
    我现在的报表都是这样做,不过只OFFICE XP或以上版本才行。
    生成XML文件比XLS文件要大很多:(
    ------------------------------------------------------------------
     回复人: goody9807() ( ) 信誉:100  2005-01-13 09:37:00  得分: 0  用流格式生成Excel文件 动态向文件中写东西
    能发个关于Excel结构描述的文件吗?
      
     
      

  12.   

    楼上的,不要不自量力啊,怎么可能自己操作Excel文件??一半如果要写Excel文件,我都用HTML写好了,然后用Excel打开,这样Office2000以上都可以完全支持。如果这样还不够,建议使用Reflection来打开和读写Excel文件,可以自己封装一个Excel操作类,简化高层的编程.
      

  13.   

    一、dataset写excel是比较烦,可以用一假的,写DataGrid
    Response.Clear(); 
    Response.Buffer= true; 
    Response.Charset="GB2312";    
    Response.AppendHeader("Content-Disposition","attachment;filename=FileName.xls"); 
    Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
    Response.ContentType = "application/ms-excel";                      //设置输出文件类型为excel文件。 
    this.EnableViewState = false;    
    System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN",true);
    System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad); 
    System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
    this.DataGrid1.RenderControl(oHtmlTextWriter);    
    Response.Write(oStringWriter.ToString());
    Response.End();
    二、DataGrid 的数据放不下,建议生成 .CSV 文件,纯文本的,用指定的字符分隔列就行,还省去了office版权的麻烦,但用excel打开和打开 .xls 一样方便。
      

  14.   

    楼上的,不要不自量力啊,怎么可能自己操作Excel文件??
    真的吗??
    OfficeXP以上的版是支持XML。
    只要你了解XML的格式,你就根本不用EXCEL。
    如果你了解Excel File Format根本不用EXCEL也可以操作EXCEL文件。
      

  15.   

    最简单的办法是用HTML了,我们给电信做帐务报表都用这,连Excel公式都可以写进去。
      

  16.   

    HTML最简单吗?用过CodeSmith的代码引擎来生成XML报表吗?
    不要忘了最终是以文件方式来保存的.
    其实帮电信做帐务报表,不只是你们:),电信不同业务的帐务系统多得是。
    不要动不动就搬出来。
      

  17.   

    如果楼主一定要判断用户的版本,那也是可以实现的。我们可以在程序运行时。动态的生成我们所要的全部代码。同时进行编译,最后再反射调用动态生成的DLL。那样就不行了吗
      

  18.   

    帖一段我的代码,说明是怎么样解决Word的SaveAs不同版本的问题:/// <summary>
    /// 另存。
    /// </summary>
    /// <param name="fileName">要另存的文件名</param>
    public void SaveAs(string fileName)
    {
    // 获得方法信息
    Type documentType = mApp.ActiveDocument.GetType();
    MethodInfo method = documentType.GetMethod("SaveAs"); // 获得参数信息
    int paramCount = method.GetParameters().Length;
    object[] paramArray = new object[paramCount];

    // 填充参数
    paramArray[0] = fileName;
    for (int i=1; i<paramCount; i++)
    {
    paramArray[i] = mMissing;
    } // 调用方法
    method.Invoke(mApp.ActiveDocument, paramArray); // 下列代码有兼容性问题,暂屏蔽
    // mApp.ActiveDocument.SaveAs(ref fName, ref mMissing, ref mMissing, ref mMissing,  ref mMissing,
    // ref mMissing, ref mMissing, ref mMissing, ref mMissing, ref mMissing, ref mMissing); mFileName = fileName;
    mSaved = true;
    }
      

  19.   

    感谢各位的回答!
    to FJGoodGood(_FJ_强中强):老兄,你是不是解决了此个难题,能否将你的代码让小弟参考一下,先谢了..
      

  20.   

    楼主,我上面帖的代码已经是一个思路了,可能不是最好的方法,但毕竟是可行的。我这里稍微解释一些吧:
    1)mApp 是一个 Word.Application对象(我封装的类的一个私有字段,你可以把它改造成Excel.Application对象)。
    2)mMissing 是一个公共缺省参数,用C#搞过Office开发的朋友都知道,它的值是Type.Missing。
    3)mFileName 和 mSave 是两个私有状态变量,mFileName代表最后一次保存所使用的文件名,mSave表示是否已经保存。
    4)基本上这个类你可以只要修改Excel.Application即可
      

  21.   

    你可以用spy++分析一下Excel2000与ExcelXP的窗中类:
    你可以看一下这儿:
    http://community.csdn.net/Expert/topic/3730/3730737.xml?temp=.4821894
      

  22.   

    用JScript操作Excel来输出,不过在服务器端生成JSCRIPT还是一件很烦的事情。
      

  23.   

    VB.NET就没有这个问题...只要Open(filePath)就搞定了。