.Net对EXCEL COM的使用总结(C#)
在前段时间的工作中由于要实现.NET中WEB数据导出为EXCEL成报表,大量使用了EXCELCOM组件。现将使用过程中的一些问题和技巧进行总结。
微软提供对excel COM的说明C:\Program Files\Microsoft Office\Office\2052\VBAXL9.CHM
还有对其他OFFICE COM的说明基本上都是以VB开头的,其也是以VB为例子讲解的。

由于各种语言对COM接口的解释不一样,所以同一个COM使用的过程中,语法不太一样。在C#中对OFFICE COM接口的要求比较严格,各种方法函数的参数必须给出。但是很多参数又不清楚是什么意思,这个时候可以使用.NET提供的默认参数功能。
object miss=System.Reflection.Missing.Value;    //可代替有默认参数方法中中的默认参数
定义这个参数后,miss可代替接口中有默认参数的参数。

应用COM中的EXCEL,添加引用。安装office后都会用excel库的dll。这里用的是9.0
using Excel;

首先要进行垃圾收集
GC.Collect();

Application excel=new ApplicationClass(); //定义一个application对象

_Workbook xBk; //定义工作薄
_Worksheet xSt; //定义工作表
xBk=excel.Workbook.Add(true); //生成一个新的工作薄,会自动生成一个新的工作表,并默认激活
xSt=(_Worksheet)xBk.ActiveSheet; //获取当前激活的工作表

 xSt=(_Worksheet)(xBk.Worksheets.Add(miss,miss,n,miss));  //为工作薄新加n个工作表,默认是在所有工作表之前
xSt.Name="新工作表"; //工作表的名称

excel中的行号和列号都是从1开始计数的
xSt.get_Range(xSt.Cells[1,1],xSt.Cells[1,1]).ColumnWidth=10; //设定选定的单元格的宽度,.Width是只读的属性
xSt.get_Range(xSt.Cells[1,1],xSt.Cells[1,1]).RowHeight=10;  //设定选定的单元格的高度,.Height是只读属性

xSt.get_Range(xSt.Cells[1,1],xSt.Cells[1,1]).Value="编号"; //设定选定单元格中的文本
xSt.Cell[1,1]="编号"; //一样的效果
xSt.get_Range(xSt.Cells[1,1],xSt.Cells[1,2]).Value="编号"; //两个单元格中的文本都是“编号”

xSt.get_Range(xSt.Cells[1,1],xSt.Cells[1,1]).HorizontalAlignment = XlVAlign.xlVAlignCenter; //设定选定单元格中文本居中对齐
xSt.get_Range(xSt.Cells[rowindex,2],xSt.Cells[rowindex,2]).HorizontalAlignment = XlVAlign.xlVAlignJustify; //左对齐

xSt.get_Range(xSt.Cells[2,1],xSt.Cells[2,7]).Merge(true); //某行1列到7列的单元格进行合并,合并后原来cell[2,8]仍然还是cell[2,8],其他单元格的位置不变

 xSt.get_Range(xSt.Cells[1,7],xSt.Cells[1,7]).NoteText("aaaaa",miss,miss); //某单元格的注释内容

excel.Visible=true; //设置excel为可视

xBk.SaveCopyAs(HttpContext.Current.Server.MapPath(".")+"\\"+filename+".xls"); //将工作薄保存

操作完excel后代善后工作,关闭excel进程
xBk.Close(false, null,null);
                
excel.Quit();

 System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
 System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

xSt = null;
xBk = null;
excel = null;

最后还必须再次进行垃圾回收
GC.Collect(); 注意这条语句应该和以上的代码不在一个方法中。也就是说将以上的代码封装成一个方法,使用该方法后再进行垃圾回收


最后将生成的excel输出到客户端供用户下载,一并给出
        private void output(string filename)
        {
            string path = HttpContext.Current.Server.MapPath(filename+".xls");

            System.IO.FileInfo file = new System.IO.FileInfo(path);
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Charset="GB2312";
            HttpContext.Current.Response.ContentEncoding=System.Text.Encoding.UTF8;
            // 添加头信息,为"文件下载/另存为"对话框指定默认文件名
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpContext.Current.Server.UrlEncode(file.Name));
            // 添加头信息,指定文件大小,让浏览器能够显示下载进度
            HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
                
            // 指定返回的是一个不能被客户端读取的流,必须被下载
            HttpContext.Current.Response.ContentType = "application/ms-excel";
                
            // 把文件流发送到客户端
            HttpContext.Current.Response.WriteFile(file.FullName);
            // 停止页面的执行
          
            HttpContext.Current.Response.End();
        }

posted on 2006-12-01 12:43  十分之七  阅读(742)  评论(0)    收藏  举报