谢谢。

解决方案 »

  1.   

    首先,谢谢回复。我们新建 Microsoft Excel 工作表.xls,打开后左下角会有Sheet1,Sheet2,Sheet3 分别是一页,我们可以将一类的内容放在一页;我现在的情况是:我已经统计出了3类信息,分别放在3个DataGrid中,我想将3个DataGrid中的信息导入一个Excel中,每个Sheet存储一个DataGrid中的内容,不知道我说得您清除否。数据开始时从数据库Select出来放到一个DataSet 中的,分别是ds.Tables[0],ds.Tables[1],ds.Tables[2]。
      

  2.   

    to:seabluecn如果可以,不妨都说一下,谢谢
      

  3.   

    to:seabluecn这对不起,我们这儿不允许上QQ,能否在这里指教,谢谢。
    或说明以下程序我现在写的只能到处到一个Sheet中:public static void OutputExcelToFile(DataGrid dg1)
    {
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.Buffer=true;
    dg1.PagerStyle.Visible=false;
    HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename="+""+System.DateTime.Now.ToString("yyyyMMddhhmmss")+".xls");
    HttpContext.Current.Response.Charset ="gb2312";
    HttpContext.Current.Response.ContentEncoding =System.Text.Encoding.GetEncoding("gb2312");
    HttpContext.Current.Response.ContentType ="application/ms-excel/ms-word"; dg1.Page.EnableViewState =true;
    System.IO.StringWriter tw = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
    dg1.RenderControl(hw); HttpContext.Current.Response.Write(tw.ToString());
    HttpContext.Current.Response.End();
    }
      

  4.   

    这其实就是个EXCEL操作的问题了
    你既然已经做了一部分,说明你EXCEL的基本操作是没有问题,就是操作多个SHEET有问题吧;
    Excel._Worksheet exSheet = (Excel._Worksheet)exBook.Worksheets["Sheet1"];
    其中的参数"Sheet1"为你的sheet的名称,也可以是数字,那就是你sheet的序号了。这样可以得到各个工作表,
    exSheet.Cells[a,b]=...这样就可以在工作表中加入数据,我觉得这两个功能就应该能满足你的要求吧
      

  5.   

    看了你写的,你是直接写一个EXCEL文件,那样的话没法操作,我说的是你在服务器端直接调用EXCEL.DLL进行EXCEL操作,那样比较灵活,但有几个问题,就是你必须在服务器端安装EXCEL,并且操作起来很复杂,但有一点好处就是EXCEL的操作非常灵活,在EXCEL中能做的事,用程序全能做
      

  6.   

    to:seabluecn我看过这种方法,确实感觉“操作起来很复杂”,我是比较希望用我现在的方法加以完善,其实我也不知道能不能实现。我先用你说的方法做,但是这种做法会不会占用太多的服务器资源?实现了再给你分~~
      

  7.   

    呵呵,我给你我做EXCEL的一点总结,你试试看
    一、环境设置
    1.服务器端必须安装EXCEL
    2.所有Excel的程序操作都来源于Excel的对象库Excel9.olb.使用Tlbimp这个工具将Excel9.0的对象库文件Excel9.olb转换成为dll,这样才能做为.Net平台Assembly来使用:
    TlbImp Excel9.olb
    这样会得到3个文件"Excel.dll"、"Office.dll"、"VBIDE.dll" 
    只要有了这个Excel.dll,现在我们就能使用Excel的各种操作函数了
    3.服务器端的权限设置
    服务器端必须要设置的一点是COM组件的操作权限。在命令行键入“DCOMCNFG”,则进入COM组件配置界面,选择Microsoft  Excel后点击属性,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限。在“标识”中设置为交互式用户,保存完毕后重新启动服务器。
    ***如果不设置交互式用户,EXCEL进程如果停留在内存中,你是无法结束进程的 
    二、操作EXCEL文件
    1.在项目中添加引用,用TlbImp会得到3个文件,在项目中全部引用
    2.操作EXCEL的时要用到几个对象,Application,Workbook,WorkSheet,Range
    操作EXCEL首先要建立一个Application对象,然后再得到Application对象的WorkBooks对象,使用WorkBooks对象打开一个EXCEL文件就得到一个WorkBook对象,由WorkBook对象得到WorkSheet对象,基本上有了WorkSheet对象就可以操作EXCEL了,在下面的例子中就没有用到RANGE:
    例程:
    Excel.ApplicationClass excelApp=null;
    Excel.Workbooks exBooks=null;
    Excel._Workbook exBook=null;
    Excel._Worksheet exSheet=null;
    object mo=System.Reflection.Missing.Value;
    try{
    try
    {
    excelApp=new Excel.ApplicationClass(); 
    exBooks=excelApp.Workbooks;
    exBook=exBooks.Open("d:\\sample.xls",mo,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo);
    exSheet = (Excel._Worksheet)exBook.Worksheets["Sheet1"];//Sheet1为你工作表的名称,也可以是数字,那就是你工作表的序号
    exSheet.Cells[i,j]="***";//通过这种方式向EXCEL表格中写入数据,写入第i行的第j列
    }
    catch(Exception ex)
    {
    Response.Write(ex.Message);
    Response.End();
    }
    finally
    {
    exBook.Save(); exBook.Close(true,mo,mo);
    exBooks.Close();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(exSheet);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(exBook);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(exBooks);
    exBooks=null;
    exBook = null;
    exSheet = null;
    excelApp.Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
    excelApp = null;
    GC.Collect();
    }
    然后保存,后面的代码全是为了释放资源的,因为此方法操作EXCEL有个问题,就是EXCEL经常会不能正常关闭,我使用上面的方法,有时能够关闭,有时内存中会有一个EXCEL运行,但不会有多个
      

  8.   

    这种方法可以导出数据但是代码量要多一些,主要是生成数据表;如果多个Sheet的话,类似的工作也要重复几遍,感觉这个方法还是比较笨拙的~。有个问题:假如每次导出的数据表的列不同,那么必须清空Excel文件中原来数据。
      

  9.   

    但是在office2003中 使用TlbImp 将excel.exe 转换成 excel.dll  还是不行啊
    2000以上的都没有excel9.olb 这个文件的
      

  10.   

    2000中没有那个文件,但他会是别的名字啊,肯定不会是excel.exe,我们用的是库文件,不是可执行文件
    另外fccvip()说的清空原来文件的问题
    我们做报表一般都是有格式的,报表有一定的格式,当然这种方法也可以操作表的格式,但太麻烦,所以就使用样表,但操作是不能在样表上操作的,清数据不说,如果两个进程同时访问这个表的话就会出错,另外如果在你生成文件后还没下载下来,别人有可能又更改了。
    我的解决方法就是建一个临时文件夹,先将文件复制到这个文件夹里面,然后对这个临时文件操作,当然要考虑到重名及删除问题,删除你可以在复制文件时检查这个文件夹里面的文件,如果超过一定的时间了,那就删除他。
      

  11.   

    谢谢各位的参与,我提到的清空数据可以如下写(最后一行)。最后说一下:这种方法能不用还是不要用~。excel.ApplicationClass excelApp=null;
    excel.Workbooks exBooks=null;
    excel._Workbook exBook=null;
    excel._Worksheet exSheet=null;
    object mo=System.Reflection.Missing.Value;

    excelApp=new excel.ApplicationClass(); 
    exBooks=excelApp.Workbooks;
    exBook=exBooks.Open(tempfile,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo);
    exSheet = (excel._Worksheet)exBook.Worksheets[sheet];//Sheet1为你工作表的名称,也可以是数字,那就是你工作表的序号

    //清空原来保存的数据
    exSheet.UsedRange.ClearContents();
      

  12.   

    这不是笨拙不笨拙的问题,需要更多的功能,你的操作就要麻烦一些,这是相对的两个方面;又要功能,又要简单,不大好兼得的,呵呵如果你的表不需要样式,那你不需要样表,直接建立一个新表就可以
    exBook=excelApp.Workbooks.Add();
    这样建立一个空表,保存的时候使用exBook.SaveAs(tempFilePath,Excel.XlFileFormat.xlWorkbookNormal,mo,mo,mo,mo,Excel.XlSaveAsAccessMode.xlNoChange,mo,mo,mo,mo);