Excel对象用法的介绍

Excel是微软公司办公自动化套件中的一个软件,他主要是用来处理电子表格。Excel以其功能强大,界面友好等受到了许多用户的欢迎。在设计应用系统时,对于不同的用户,他们对于打印的需求是不一样的,如果要使得程序中的打印功能适用于每一个用户,可以想象程序设计是十分复杂的。由于Excel表格的功能强大,又由于几乎每一台机器都安装了它,如果把程序处理的结果放到Excel表格中,这样每一个用户就可以根据自己的需要在Excel中定制自己的打印。这样不仅使得程序设计简单,而且又满足了诸多用户的要求,更加实用了。那么用Visual C#如何调用Excel,如何又把数据存放到Excel表格中?本文就来探讨上述问题的解决办法。


Excel对象

       微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我们简单介绍一下其中最重要,也是用得最多的四个对象。

(1) Application对象。Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。

(2) Workbook对象。Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。

(3) Worksheet对象。Worksheet对象包含于Workbook对象,表示一个Excel工作表。

(4) Range对象。Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。

C#中的受管代码和非受管代码

在.NET公用语言框架内运行的程序为受管代码。受管代码在程序中所有类型都受到严格检查,没有指针,对内存的管理完全由运行系统控制。受控状态下,编写程序更为容易,且更少出错,我们可以花更多的时间在解决实际问题上而不是在计算机语言问题上。相对而言,那些在.NET框架外运行的程序为非受管代码。比如:COM组件、ActiveX组件、Win32 API函数、指针运算等。C#编程中在某些特定情况下,需要运用非受管代码,例如,要利用一个成熟的COM组件,或者调用一个API函数,或者用指针去编写实时/高效程序等。

Visual C#中调用Excel的COM组件

      一个.NET组件事实上是一个.NET下的DLL,它包含的不仅是运行程序本身,更重要的是包含这个DLL的描述信息(Meta Data,即元数据),而一个COM组件是用其类库(TLB)储存其描述信息。这些COM组件都是非受管代码,要在Visual C#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的.NET组件。所以在用Visual C#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。

1、将Excel的COM组件转换为.NET组件

在项目中打开Add Reference对话框,选择COM栏,之后在COM列表中找到"Microsoft Excel 9.0 Object Library"(Office 2000),然后将其加入到项目的References中即可。Visual C#.NET会自动产生相应的.NET组件文件,以后即可正常使用。

这个转换形成.NET组件不能单独使用,它不过是以前的COM组件的一个外层包装,在.NET中可以通过这个外层包装去发现原来的COM组件并调用其相应的界面函数。所以它必须与原来的COM组件一起起作用。

2、Visual C#打开Excel表格

事实上,在C#中使用一个经转换的COM组件和使用任何一个其它.NET组件完全一样。可以用new关键字创建一个经转换的COM组件,然后再像使用任何一个其它C#对象一样使用这个组件对象。

在转换后的.NET组件中定义了一个命名空间Excel,在此命名空间中封装了一个类Application,这个类和启动Excel表格有非常重要的关系,在Visual C#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:

1 Excel.Application excel = new Excel.Application ();//引用Excel对象
2  
3 excel.Application.Workbooks.Add ( true );//引用Excel工作簿
4  
5 excel.Visible = true//使Excel可视

但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。

3、往Excel表格中输入数据

在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个单元格。通过给"Cell"赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。

1 Excel.Application excel = new Excel.Application () ;
2
3 excel.Application.Workbooks.Add ( true ) ;
4
5 excel.Cells[ 1 , 1 ] = "First Row First Column"
6
7 excel.Cells[ 1 , 2 ] = "First Row Second Column"
8
9 excel.Cells[ 2 , 1 ] = "Second Row First Column"
10
11 excel.Cells[ 2 , 2 ] = "Second Row Second Column"
12
13 excel.Visible = true ;

4、实例

下面实例在C#中连接Oracle数据库(Name),从表(TableName)中读取数据,并写入Excel。

1 string cnString="Provider=msdaora.1;Data source=Name; ";
2
3 cnString=cnString+"user id=UserName;password=Password";
4
5  try
6
7 {
8
9  OleDbConnection cn=new OleDbConnection (cnString);
10
11  cn.Open ();
12
13  try
14
15  {
16
17   string s="select * from Name.TableName";
18
19   OleDbCommand cmd=new OleDbCommand (s,cn);
20
21   OleDbDataReader dr=cmd.ExecuteReader ();
22
23   Excel.Application xlApp = new Excel.Application();
24
25   if(xlApp==null){MessageBox.Show ("Can't open Excel!");return;}
26
27   xlApp.Application .Workbooks .Add (true);
28
29   int row=2,fieldcount;
30
31   fieldcount=dr.FieldCount ;
32
33   for(int col=0;col<fieldcount;col++) xlApp.Cells [1,col+1]=dr.GetName(col);
34
35   while (dr.Read ())
36
37   {
38
39    for(int col=0;col<fieldcount;col++)
40
41     xlApp.Cells [row,col+1]=dr.GetValue(col).ToString();
42
43     row++;
44
45   }
46
47   xlApp.Visible =true;
48
49   xlApp=null;
50
51  }
52
53  catch(Exception ex ){MessageBox.Show (ex.Message );}
54
55  finally
56
57 }
58
59  catch(Exception ex){MessageBox.Show (ex.Message );}
60
61 }
62
63 }

5、安装一个使用COM组件的.NET程序

如果要将这样的程序安装运行在另一台机器上,那么除了安装运行程序外,还做三件事。

首先,是安装.NET运行系统。因为任何一个.NET程序都不能离开.NET运行系统去独立运行。

其次,所调用的COM组件必须要安装在目标机器上。本例中大多数目标机器上都装有Microsoft Office的Excel,一般不会有这个问题。但如果是另一个用户自定义的COM组件,那么这个COM组件在运行.NET程序之前必须先安装好。

最后,转换后的.NET组件DLL文件要安装在目标机器上。因为.NET组件不需要在Windows Registry中注册,所以最简单的方法是将.NET组件DLL文件拷贝到运行程序目录下。如果此.NET组件被多个.NET程序共享,可以将其安装在.NET公用组件区中,从而可被任何一个.NET组件使用。只有当一个.NET组件参与了事务处理时,才需要将它注册为一个COM+组件。因为.NET仍然用传统的COM+机制来处理事务的提交、回滚等。

小结

通过以上讨论,我们知道了在C#中,如何使用Excel的COM组件。需要注意的是,Excel对象包含的许多内容我们没有介绍,在使用过程中需要我们不断学习。也使我们了解了在C#中如何使用COM组件


案例2

C#动态生成Word文档并填充数据

要使用C#操作word,首先要添加引用:

       1、添加引用->COM->Microsoft Word 11.0 Object Library

       2、在.cs文件中添加

using Word;
下面的例子中包括C#对Word文档的创建、插入表格、设置样式等操作:

(例子中代码有些涉及数据信息部分被省略,重要是介绍一些C#操作word文档的方法)

       

1 public string CreateWordFile(string CheckedInfo)
2 {
3 string message = "";
4 try
5 {
6 Object Nothing = System.Reflection.Missing.Value;
7 Directory.CreateDirectory("C:/CNSI"); //创建文件所在目录
8   string name = "CNSI_" + DateTime.Now.ToShortString()+".doc";
9 object filename = "C://CNSI//" + name; //文件保存路径
10 //创建Word文档
11   Word.Application WordApp = new Word.ApplicationClass();
12 Word.Document WordDoc = WordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing);
13
14 //添加页眉
15 WordApp.ActiveWindow.View.Type = WdViewType.wdOutlineView;
16 WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekPrimaryHeader;
17 WordApp.ActiveWindow.ActivePane.Selection.InsertAfter("[页眉内容]");
18 WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;//设置右对齐
19 WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;//跳出页眉设置
20
21 WordApp.Selection.ParagraphFormat.LineSpacing = 15f;//设置文档的行间距
22
23 //移动焦点并换行
24 object count = 14;
25 object WdLine = Word.WdUnits.wdLine;//换一行;
26 WordApp.Selection.MoveDown(ref WdLine, ref count, ref Nothing);//移动焦点
27 WordApp.Selection.TypeParagraph();//插入段落
28
29 //文档中创建表格
30 Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, 12, 3, ref Nothing, ref Nothing);
31 //设置表格样式
32 newTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleThickThinLargeGap;
33 newTable.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
34 newTable.Columns[1].Width = 100f;
35 newTable.Columns[2].Width = 220f;
36 newTable.Columns[3].Width = 105f;
37
38 //填充表格内容
39 newTable.Cell(1, 1).Range.Text = "产品详细信息表";
40 newTable.Cell(1, 1).Range.Bold = 2;//设置单元格中字体为粗体
41 //合并单元格
42 newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));
43 WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;//垂直居中
44 WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中
45
46 //填充表格内容
47 newTable.Cell(2, 1).Range.Text = "产品基本信息";
48 newTable.Cell(2, 1).Range.Font.Color = Word.WdColor.wdColorDarkBlue;//设置单元格内字体颜色
49 //合并单元格
50 newTable.Cell(2, 1).Merge(newTable.Cell(2, 3));
51 WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
52
53 //填充表格内容
54 newTable.Cell(3, 1).Range.Text = "品牌名称:";
55 newTable.Cell(3, 2).Range.Text = BrandName;
56 //纵向合并单元格
57 newTable.Cell(3, 3).Select();//选中一行
58 object moveUnit = Word.WdUnits.wdLine;
59 object moveCount = 5;
60 object moveExtend = Word.WdMovementType.wdExtend;
61 WordApp.Selection.MoveDown(ref moveUnit, ref moveCount, ref moveExtend);
62 WordApp.Selection.Cells.Merge();
63 //插入图片
64 string FileName = Picture;//图片所在路径
65 object LinkToFile = false;
66 object SaveWithDocument = true;
67 object Anchor = WordDoc.Application.Selection.Range;
68 WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);
69 WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 100f;//图片宽度
70 WordDoc.Application.ActiveDocument.InlineShapes[1].Height = 100f;//图片高度
71 //将图片设置为四周环绕型
72 Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();
73 s.WrapFormat.Type = Word.WdWrapType.wdWrapSquare;
74
75 newTable.Cell(12, 1).Range.Text = "产品特殊属性";
76 newTable.Cell(12, 1).Merge(newTable.Cell(12, 3));
77 //在表格中增加行
78 WordDoc.Content.Tables[1].Rows.Add(ref Nothing);
79
80 WordDoc.Paragraphs.Last.Range.Text = "文档创建时间:" + DateTime.Now.ToString();//“落款”
81 WordDoc.Paragraphs.Last.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
82
83 //文件保存
84 WordDoc.SaveAs(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);
85 WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
86 WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
87 message=name+"文档生成成功,以保存到C:CNSI下";
88 }
89 catch
90 ...{
91 message = "文件导出异常!";
92 }
93 return message;
94 }


案例3
C#向Excel报表中插入图片的2种方法

注意:使用之前需要引用COM:Microsoft Office 11.0 Object Library 如果引用列表中没有,需要自行添加 C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE

调用方法:

<!--StartFragment-->MengXianhui.Utility.ExcelReport.InsertPictureToExcel ipt = new MengXianhui.Utility.ExcelReport.InsertPictureToExcel();
ipt.Open();
ipt.InsertPicture("B2", @"C:\Excellogo.gif");
ipt.InsertPicture("B8", @"C:\Excellogo.gif",120,80);
ipt.SaveFile(@"C:\ExcelTest.xls");
ipt.Dispose();


简单包装的类:

<!--StartFragment-->

1 using System;
2 using System..Forms;
3 using Excel = Microsoft.Office.Interop.Excel;
4
5 namespace MengXianhui.Utility.ExcelReport
6 {
7 class InsertPictureToExcel
8 {
9 /// <summary>
10 /// 打开没有模板的操作。
11 /// </summary>
12 public void Open( )
13 {
14 this.Open(String.Empty);
15 }
16
17 /// <summary>
18 /// 功能:实现Excel应用程序的打开
19 /// </summary>
20 /// <param name="TemplateFilePath">模板文件物理路径</param>
21 public void Open( string TemplateFilePath )
22 {
23 //打开对象
24 m_objExcel = new Excel.Application();
25 m_objExcel.Visible = false;
26 m_objExcel.DisplayAlerts = false;
27
28 if (m_objExcel.Version != "11.0")
29 {
30 MessageBox.Show("您的 Excel 版本不是 11.0 (Office 2003),操作可能会出现问题。");
31 m_objExcel.Quit();
32 return;
33 }
34
35 m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
36 if (TemplateFilePath.Equals(String.Empty))
37 {
38 m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
39 }
40 else
41 {
42 m_objBook = m_objBooks.Open(TemplateFilePath, m_objOpt, m_objOpt, m_objOpt, m_objOpt,
43 m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
44 }
45 m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
46 m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
47 m_objExcel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(m_objExcel_WorkbookBeforeClose);
48 }
49
50 private void m_objExcel_WorkbookBeforeClose( Excel.Workbook m_objBooks, ref bool _Cancel )
51 {
52 MessageBox.Show("保存完毕!");
53 }
54
55 /// <summary>
56 /// 将图片插入到指定的单元格位置。
57 /// 注意:图片必须是绝对物理路径
58 /// </summary>
59 /// <param name="RangeName">单元格名称,例如:B4</param>
60 /// <param name="PicturePath">要插入图片的绝对路径。</param>
61 public void InsertPicture( string RangeName, string PicturePath )
62 {
63 m_objRange = m_objSheet.get_Range(RangeName, m_objOpt);
64 m_objRange.Select();
65 Excel.Pictures pics = (Excel.Pictures)m_objSheet.Pictures(m_objOpt);
66 pics.Insert(PicturePath, m_objOpt);
67 }
68
69 /// <summary>
70 /// 将图片插入到指定的单元格位置,并设置图片的宽度和高度。
71 /// 注意:图片必须是绝对物理路径
72 /// </summary>
73 /// <param name="RangeName">单元格名称,例如:B4</param>
74 /// <param name="PicturePath">要插入图片的绝对路径。</param>
75 /// <param name="PictuteWidth">插入后,图片在Excel中显示的宽度。</param>
76 /// <param name="PictureHeight">插入后,图片在Excel中显示的高度。</param>
77 public void InsertPicture( string RangeName, string PicturePath, float PictuteWidth, float PictureHeight )
78 {
79 m_objRange = m_objSheet.get_Range(RangeName, m_objOpt);
80 m_objRange.Select();
81 float PicLeft, PicTop;
82 PicLeft = Convert.ToSingle(m_objRange.Left);
83 PicTop = Convert.ToSingle(m_objRange.Top);
84 //参数含义:
85 //图片路径
86 //是否链接到文件
87 //图片插入时是否随文档一起保存
88 //图片在文档中的坐标位置(单位:points)
89 //图片显示的宽度和高度(单位:points)
90 //参数详细信息参见:http://msdn2.microsoft.com/zh-cn/library/aa221765(office.11).aspx
91 m_objSheet.Shapes.AddPicture(PicturePath, Microsoft.Office.Core.MsoTriState.msoFalse,
92 Microsoft.Office.Core.MsoTriState.msoTrue, PicLeft, PicTop, PictuteWidth, PictureHeight);
93 }
94
95 /// <summary>
96 /// 将Excel文件保存到指定的目录,目录必须事先存在,文件名称不一定要存在。
97 /// </summary>
98 /// <param name="OutputFilePath">要保存成的文件的全路径。</param>
99 public void SaveFile( string OutputFilePath )
100 {
101 m_objBook.SaveAs(OutputFilePath, m_objOpt, m_objOpt,
102 m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
103 m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
104
105 this.Close();
106 }
107 /// <summary>
108 /// 关闭应用程序
109 /// </summary>
110 private void Close( )
111 {
112 m_objBook.Close(false, m_objOpt, m_objOpt);
113 m_objExcel.Quit();
114 }
115
116 /// <summary>
117 /// 释放所引用的COM对象。注意:这个过程一定要执行。
118 /// </summary>
119 public void Dispose( )
120 {
121 ReleaseObj(m_objSheets);
122 ReleaseObj(m_objBook);
123 ReleaseObj(m_objBooks);
124 ReleaseObj(m_objExcel);
125 System.GC.Collect();
126 System.GC.WaitForPendingFinalizers();
127 }
128 /// <summary>
129 /// 释放对象,内部调用
130 /// </summary>
131 /// <param name="o"></param>
132 private void ReleaseObj( object o )
133 {
134 try
135 {
136 System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
137 }
138 catch { }
139 finally { o = null; }
140 }
141
142 private Excel.Application m_objExcel = null;
143 private Excel.Workbooks m_objBooks = null;
144 private Excel._Workbook m_objBook = null;
145 private Excel.Sheets m_objSheets = null;
146 private Excel._Worksheet m_objSheet = null;
147 private Excel.Range m_objRange = null;
148 private object m_objOpt = System.Reflection.Missing.Value;
149 }
150 }
转自……忘记了……

posted on 2011-04-12 15:02  Osiris4Net  阅读(718)  评论(0编辑  收藏  举报

导航