求 C# 导出多sheet的Excel程序,每个sheet对应一个DataGrid
谢谢。 问题点数: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




