求 C# 导出多sheet的Excel程序,每个sheet对应一个DataGrid 谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先,谢谢回复。我们新建 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]。 to:seabluecn如果可以,不妨都说一下,谢谢 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(); } 这其实就是个EXCEL操作的问题了你既然已经做了一部分,说明你EXCEL的基本操作是没有问题,就是操作多个SHEET有问题吧;Excel._Worksheet exSheet = (Excel._Worksheet)exBook.Worksheets["Sheet1"];其中的参数"Sheet1"为你的sheet的名称,也可以是数字,那就是你sheet的序号了。这样可以得到各个工作表,exSheet.Cells[a,b]=...这样就可以在工作表中加入数据,我觉得这两个功能就应该能满足你的要求吧 看了你写的,你是直接写一个EXCEL文件,那样的话没法操作,我说的是你在服务器端直接调用EXCEL.DLL进行EXCEL操作,那样比较灵活,但有几个问题,就是你必须在服务器端安装EXCEL,并且操作起来很复杂,但有一点好处就是EXCEL的操作非常灵活,在EXCEL中能做的事,用程序全能做 to:seabluecn我看过这种方法,确实感觉“操作起来很复杂”,我是比较希望用我现在的方法加以完善,其实我也不知道能不能实现。我先用你说的方法做,但是这种做法会不会占用太多的服务器资源?实现了再给你分~~ 呵呵,我给你我做EXCEL的一点总结,你试试看一、环境设置1.服务器端必须安装EXCEL2.所有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运行,但不会有多个 这种方法可以导出数据但是代码量要多一些,主要是生成数据表;如果多个Sheet的话,类似的工作也要重复几遍,感觉这个方法还是比较笨拙的~。有个问题:假如每次导出的数据表的列不同,那么必须清空Excel文件中原来数据。 但是在office2003中 使用TlbImp 将excel.exe 转换成 excel.dll 还是不行啊2000以上的都没有excel9.olb 这个文件的 2000中没有那个文件,但他会是别的名字啊,肯定不会是excel.exe,我们用的是库文件,不是可执行文件另外fccvip()说的清空原来文件的问题我们做报表一般都是有格式的,报表有一定的格式,当然这种方法也可以操作表的格式,但太麻烦,所以就使用样表,但操作是不能在样表上操作的,清数据不说,如果两个进程同时访问这个表的话就会出错,另外如果在你生成文件后还没下载下来,别人有可能又更改了。我的解决方法就是建一个临时文件夹,先将文件复制到这个文件夹里面,然后对这个临时文件操作,当然要考虑到重名及删除问题,删除你可以在复制文件时检查这个文件夹里面的文件,如果超过一定的时间了,那就删除他。 谢谢各位的参与,我提到的清空数据可以如下写(最后一行)。最后说一下:这种方法能不用还是不要用~。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(); 这不是笨拙不笨拙的问题,需要更多的功能,你的操作就要麻烦一些,这是相对的两个方面;又要功能,又要简单,不大好兼得的,呵呵如果你的表不需要样式,那你不需要样表,直接建立一个新表就可以exBook=excelApp.Workbooks.Add();这样建立一个空表,保存的时候使用exBook.SaveAs(tempFilePath,Excel.XlFileFormat.xlWorkbookNormal,mo,mo,mo,mo,Excel.XlSaveAsAccessMode.xlNoChange,mo,mo,mo,mo); javascript怎么验证重名问题? 文件上传 有意思的 TreeView 请各位神仙帮我解决1个DetailsView编辑的小问题 谢谢了 文件分割 各位老师,能帮忙看看我的.net伪静态代码哪儿错了吗? 高难度问题,想了一天没想通! 散点分,请进. 求VSS 急用! 安装完.net之后,有一个报错信息: C#生成静态页面新闻系统思路及相关源程序 DataGrid的小问题。新手问题大家快来帮忙啊!
或说明以下程序我现在写的只能到处到一个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();
}
你既然已经做了一部分,说明你EXCEL的基本操作是没有问题,就是操作多个SHEET有问题吧;
Excel._Worksheet exSheet = (Excel._Worksheet)exBook.Worksheets["Sheet1"];
其中的参数"Sheet1"为你的sheet的名称,也可以是数字,那就是你sheet的序号了。这样可以得到各个工作表,
exSheet.Cells[a,b]=...这样就可以在工作表中加入数据,我觉得这两个功能就应该能满足你的要求吧
一、环境设置
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运行,但不会有多个
2000以上的都没有excel9.olb 这个文件的
另外fccvip()说的清空原来文件的问题
我们做报表一般都是有格式的,报表有一定的格式,当然这种方法也可以操作表的格式,但太麻烦,所以就使用样表,但操作是不能在样表上操作的,清数据不说,如果两个进程同时访问这个表的话就会出错,另外如果在你生成文件后还没下载下来,别人有可能又更改了。
我的解决方法就是建一个临时文件夹,先将文件复制到这个文件夹里面,然后对这个临时文件操作,当然要考虑到重名及删除问题,删除你可以在复制文件时检查这个文件夹里面的文件,如果超过一定的时间了,那就删除他。
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();
exBook=excelApp.Workbooks.Add();
这样建立一个空表,保存的时候使用exBook.SaveAs(tempFilePath,Excel.XlFileFormat.xlWorkbookNormal,mo,mo,mo,mo,Excel.XlSaveAsAccessMode.xlNoChange,mo,mo,mo,mo);