CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

求 C# 导出多sheet的Excel程序,每个sheet对应一个DataGrid

楼主fccvip(www.anagenesis.cn)2006-03-07 11:02:24 在 .NET技术 / ASP.NET 提问

谢谢。 问题点数:60、回复次数:21Top

1 楼fccvip(www.anagenesis.cn)回复于 2006-03-07 11:23:11 得分 0

顶Top

2 楼fccvip(www.anagenesis.cn)回复于 2006-03-07 13:22:57 得分 0

同志们,参与有奖分啊!~Top

3 楼lovebaby999(小公司的程序员)回复于 2006-03-07 13:45:30 得分 2

兄弟啊,你这个问题我怎么看不明白啊,说明白点啊Top

4 楼seabluecn()回复于 2006-03-07 13:54:00 得分 0

求程序还是求方法啊,要是要方法就告诉一下你的具体情况及要求Top

5 楼fccvip(www.anagenesis.cn)回复于 2006-03-07 13:58:59 得分 0

首先,谢谢回复。  
   
  我们新建   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]。Top

6 楼fccvip(www.anagenesis.cn)回复于 2006-03-07 14:00:32 得分 0

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

7 楼seabluecn()回复于 2006-03-07 14:49:50 得分 0

刚才有事来着,你可以加我QQ,在上面详细说一下:345686491Top

8 楼fccvip(www.anagenesis.cn)回复于 2006-03-07 14:58:53 得分 0

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

9 楼seabluecn()回复于 2006-03-07 14:59:50 得分 0

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

10 楼seabluecn()回复于 2006-03-07 15:07:43 得分 0

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

11 楼fccvip(www.anagenesis.cn)回复于 2006-03-07 15:27:02 得分 0

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

12 楼seabluecn()回复于 2006-03-07 15:52:47 得分 52

呵呵,我给你我做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运行,但不会有多个 Top

13 楼fccvip(www.anagenesis.cn)回复于 2006-03-07 17:28:20 得分 0

感觉这种方法不是很爽,还要对服务器进行一些配置Top

14 楼fccvip(www.anagenesis.cn)回复于 2006-03-07 17:28:42 得分 0

感觉这种方法不是很爽,还要对服务器进行一些配置Top

15 楼fccvip(www.anagenesis.cn)回复于 2006-03-08 09:02:18 得分 0

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

16 楼gsk99(ZJUT)回复于 2006-03-08 15:30:00 得分 2

关注Top

17 楼nameone(过客)回复于 2006-03-08 15:32:44 得分 2

UPTop

18 楼lwjvince(Insert into you(memory)values(my all life))回复于 2006-03-08 15:49:00 得分 2

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

19 楼seabluecn()回复于 2006-03-08 17:04:22 得分 0

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

20 楼fccvip(www.anagenesis.cn)回复于 2006-03-08 17:11:45 得分 0

谢谢各位的参与,我提到的清空数据可以如下写(最后一行)。  
   
  最后说一下:这种方法能不用还是不要用~。  
   
  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();  
  Top

21 楼seabluecn()回复于 2006-03-08 17:16:52 得分 0

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

相关问题

  • c#里从SQLSERVER导出数据到EXCEL
  • 导出到excel
  • 导出EXCEL
  • 导出到EXCEL
  • 在ASP.NET中,如何从数据库中导出EXCEL?(用C#)
  • 100分求c#.net下将DataGrid导出excel和word的例子
  • 急急急 c++builder关于导出表到excel表 谢谢
  • 求 ASP.NET (C#) 导入导出 Excel 的代码。
  • asp.net(c#)如何把数据库导出一个模板excel中?
  • 求救!!C#导出EXCEL的时候报错:拒绝访问

关键词

  • excel
  • 文件
  • 服务器
  • 文件夹
  • 数据
  • mo
  • exbook
  • sheet
  • 操作
  • exsheet

得分解答快速导航

  • 帖主:fccvip
  • lovebaby999
  • seabluecn
  • gsk99
  • nameone
  • lwjvince

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo