教案访问Excel文件.docx
- 文档编号:18241903
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:12
- 大小:21.13KB
教案访问Excel文件.docx
《教案访问Excel文件.docx》由会员分享,可在线阅读,更多相关《教案访问Excel文件.docx(12页珍藏版)》请在冰点文库上搜索。
教案访问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工作表中的一个或多个单元格。
VisualC#中调用Excel的COM组件
一个.NET组件事实上是一个.NET下的DLL,它包含的不仅是运行程序本身,更重要的是包含这个DLL的描述信息(MetaData,即元数据),而一个COM组件是用其类库(TLB)储存其描述信息。
这些COM组件都是非受管代码,要在VisualC#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的.NET组件。
所以在用VisualC#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。
1、将Excel的COM组件转换为.NET组件
在项目中打开AddReference对话框,选择COM栏,之后在COM列表中找到"MicrosoftExcel9.0ObjectLibrary"(Office2000),然后将其加入到项目的References中即可。
VisualC#.NET会自动产生相应的.NET组件文件,以后即可正常使用。
这个转换形成.NET组件不能单独使用,它不过是以前的COM组件的一个外层包装,在.NET中可以通过这个外层包装去发现原来的COM组件并调用其相应的界面函数。
所以它必须与原来的COM组件一起起作用。
2、VisualC#打开Excel表格
事实上,在C#中使用一个经转换的COM组件和使用任何一个其它.NET组件完全一样。
可以用new关键字创建一个经转换的COM组件,然后再像使用任何一个其它C#对象一样使用这个组件对象。
在转换后的.NET组件中定义了一个命名空间Excel,在此命名空间中封装了一个类Application,这个类和启动Excel表格有非常重要的关系,在VisualC#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:
Excel.Applicationexcel=newExcel.Application();//引用Excel对象
excel.Application.Workbooks.Add(true);//引用Excel工作簿
excel.Visible=true;//使Excel可视
但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。
3、往Excel表格中输入数据
在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个单元格。
通过给"Cell"赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。
Excel.Applicationexcel=newExcel.Application();
excel.Application.Workbooks.Add(true);
excel.Cells[1,1]="FirstRowFirstColumn";
excel.Cells[1,2]="FirstRowSecondColumn";
excel.Cells[2,1]="SecondRowFirstColumn";
excel.Cells[2,2]="SecondRowSecondColumn";
excel.Visible=true;
4、实例
下面实例在C#中连接Oracle数据库(Name),从表(TableName)中读取数据,并写入Excel。
stringcnString="Provider=msdaora.1;Datasource=Name;";
cnString=cnString+"userid=UserName;password=Password";
try
{
OleDbConnectioncn=newOleDbConnection(cnString);
cn.Open();
try
{
strings="select*fromName.TableName";
OleDbCommandcmd=newOleDbCommand(s,cn);
OleDbDataReaderdr=cmd.ExecuteReader();
Excel.ApplicationxlApp=newExcel.Application();
if(xlApp==null){MessageBox.Show("Can'topenExcel!
");return;}
xlApp.Application.Workbooks.Add(true);
introw=2,fieldcount;
fieldcount=dr.FieldCount;
for(intcol=0;col while(dr.Read()) { for(intcol=0;col xlApp.Cells[row,col+1]=dr.GetValue(col).ToString(); row++; } xlApp.Visible=true; xlApp=null; } catch(Exceptionex){MessageBox.Show(ex.Message);} finally{cn.Close();} } catch(Exceptionex){MessageBox.Show(ex.Message);} } } 5、安装一个使用COM组件的.NET程序 如果要将这样的程序安装运行在另一台机器上,那么除了安装运行程序外,还做三件事。 首先,是安装.NET运行系统。 因为任何一个.NET程序都不能离开.NET运行系统去独立运行。 其次,所调用的COM组件必须要安装在目标机器上。 本例中大多数目标机器上都装有MicrosoftOffice的Excel,一般不会有这个问题。 但如果是另一个用户自定义的COM组件,那么这个COM组件在运行.NET程序之前必须先安装好。 最后,转换后的.NET组件DLL文件要安装在目标机器上。 因为.NET组件不需要在WindowsRegistry中注册,所以最简单的方法是将.NET组件DLL文件拷贝到运行程序目录下。 如果此.NET组件被多个.NET程序共享,可以将其安装在.NET公用组件区中,从而可被任何一个.NET组件使用。 只有当一个.NET组件参与了事务处理时,才需要将它注册为一个COM+组件。 因为.NET仍然用传统的COM+机制来处理事务的提交、回滚等。 具体实例: Excel表格文档由于其简单易用,普遍应用于不少单位或部门,因而在编写应用程序过程中,有时会需要对Excel文档进行操作,最简单的情况通常有两种: (1)需要获取文档中一些单元格的值; (2)将文档导入至数据库。 对Excel文件的操作方式有两种: 一种是使用像数据库一样操作,另一种是使用DCOM方式: 第一种方法比较简单,效率也较高,但使用起来功能少,不灵活。 使用方式如下: 1、以访问数据库的方式操作Excel文件 首先引入命名空间: usingSystem.Data.OleDb; 在窗体的Load事件中添加下列代码: //设置打开文件对话框的相关属性 this.openFileDialog1.Filter="Excel文件|*.Xls"; this.openFileDialog1.DefaultExt="*.Xls"; this.openFileDialog1.FileName=""; this.openFileDialog1.InitialDirectory=Application.StartupPath; 以访问数据库的方式访问Excel文件 stringconnString=string.Format("Provider=Microsoft.Jet.OLEDB.4.0;DataSource={0};ExtendedProperties=Excel8.0;",FileName);//定义连接字符串 OleDbConnectionobjConn=newOleDbConnection(connString);//定义连接 objConn.Open(); //定义访问Excel表格的SQL语句 stringsql=string.Format("SELECT*FROMSheetNamee");//从指定的表中访问数据 //设置objCmd的相关属性 OleDbCommandobjCmd=newOleDbCommand(sql,objConn);//定义操作命令 //objCmd.CommandText=sql; //objCmd.Connection=objConn; 下面可以执行objCmd,象对数据库一样进行相关的操作,下面的例子访问一个Excel表,并将访问到的表作为一个dataGridView的数据源。 完全和对数据库的操作一样。 这种操作不能对Excel文件的格式进行设置。 以下代码实现读取Excel文件内容的操作,访问Excel文件的步骤和访问数据库的步骤类似。 privatevoidbtnReadExcel_Click(objectsender,EventArgse) { DialogResultresult; result=this.openFileDialog1.ShowDialog();//选择Excel源文件 if(result==DialogResult.OK) { excelFileName=this.openFileDialog1.FileName; //读取EXCEL文件内容 try {//定义连接字符串,以访问Excel文件 stringstrConnection=string.Format("Provider=Microsoft.Jet.OLEDB.4.0;DataSource={0};ExtendedProperties=Excel8.0;",excelFileName); //定义连接对象 OleDbConnectionoleDbConn=newOleDbConnection(); oleDbConn.ConnectionString=strConnection; //定义访问Excel表格的SQL语句 stringsql=string.Format("SELECT*FROMSheetNamee"); //利用SQL语句和连接字符串定义适配器 //OleDbDataAdapteroleDbDa=newOleDbDataAdapter(sql,oleDbConn); //或采用下面的方式定义连接字符串 OleDbDataAdapteroleDbDa=newOleDbDataAdapter(); OleDbCommandoleDbSelectCommand=newOleDbCommand(); oleDbDa.SelectCommand=oleDbSelectCommand; oleDbDa.SelectCommand.CommandText=sql; oleDbDa.SelectCommand.Connection=oleDbConn; //定义数据集 DataSetds=newDataSet(); //填充数据集,只要能填充到数据集或表中,就非常容易处理了 oleDbDa.Fill(ds,"MyTable"); //设置DataGridView的数据源 this.dataGridView1.DataSource=ds.Tables["MyTable"]; } catch(ExceptionErr) { MessageBox.Show("读取EXCEL文件出现错误: "+Err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } } 2、以引入对Excel的引用的方式访问 注意: 在操作Excel文档之前,需要添加对Excel对象库的引用: 添加引用—COM选项卡—MicrosoftExcel11.0ObjectLibrary(版本号可能不同) 以下代码示意打开一个已有的Excel文档的第一个sheet页,获取单元格“B1”的内容,并判断其值是否为“my”或将读到的内容显示到窗体的控件上,具体例子参考项目“操作Excel文件示例”: private void Operate(string pFileName) { Excel.Application app = new Excel.Application();//打开一个Excel应用 if (app == null) { return; }//如果为空则返回 Workbooks wbs = app.Workbooks; Workbook wb = wbs.Add(pFileName);//打开一个现有的工作薄 Sheets shs = wb.Sheets;//工作表集合 Worksheet sh = (Worksheet)shs.get_Item (1);//选择第一个Sheet页 if (sh == null) { return; }//如果工作表为空则返回 Range r = sh.get_Range("B1", Missing.Value);//访问B1单元格 Strings=Convert.ToString(r.value2).Trim(); if (s.Equals("my")) { MessageBox.Show(s); } } 打开Excel的应用,相关操作完成后应及时释放相关资源: private void ReleaseCOM(object pObj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(pObj); } catch { throw new Exception("释放资源时发生错误! "); } finally { pObj = null; } } 有了该方法,则只要在上面的步骤中的代码之后添加以下代码,就可以完成对资源的释放: private void Operate(string pFileName) { ReleaseCOM(sh); ReleaseCOM(shs); ReleaseCOM(wb); ReleaseCOM(wbs); app.Quit(); ReleaseCOM(app); } 以下代码示例说明对一个Excel文档的操作: stringstaFile="";//设置要保存的Excel文件的名称 SaveFileDialogsfd=newSystem.Windows.Forms.SaveFileDialog();//打开文件对话框 sfd.FileName=""; sfd.CheckFileExists=true; sfd.CheckPathExists=true; sfd.DefaultExt="xls"; sfd.Filter="Excelfiles(*.xls)|*.xls|Allfiles(*.*)|*.*"; sfd.InitialDirectory="D: \\"; sfd.RestoreDirectory=true; if(sfd.ShowDialog()==DialogResult.OK) staFile=sfd.FileName; else returnfalse; if(staFile.IndexOf(".xls")<0)//如果没有扩展名则添加扩展名 staFile+=".xls"; //////////////////////////////////////////////开始操作Excel对象/////////////////////////////////////////////////////// System.Reflection.MissingoMiss=System.Reflection.Missing.Value;//默认值 Excel.ApplicationClassm_objExcel=newExcel.ApplicationClass();//生成Excel对象 m_objExcel.Visible=false;//Excel文档设置为不可见 Excel.Workbooksm_objBooks=(Excel.Workbooks)m_objExcel.Workbooks;//工作薄集合 Excel.Workbookm_objBook=(Excel.Workbook)(m_objBooks.Add(oMiss));//工作薄对象 Excel.Worksheetm_objSheet=(Excel.Worksheet)m_objBook.ActiveSheet;//工作表对象 //***向Excel文件中写入数据************************************** //表头 m_objSheet.get_Range((object)"A1",(object)"I1").MergeCells=true;//合并A1到L1的单元格 Excel.Rangeer=m_objSheet.get_Range((object)"A1",oMiss); er.Value2=sName+"在\""+sExamName+"\"中的考试结果细目"; er.HorizontalAlignment=Excel.Constants.xlCenter;//设置单元格的水平对齐方式 er.VerticalAlignment=Excel.Constants.xlBottom; er.Font.Bold=true;//设置字体、字号和字形 er.Font.Size=16; er.Font.Name="宋体"; //考生信息 er=m_objSheet.get_Range((object)"A2",oMiss); er.Value2="考生信息: "; er.Font.Bold=true; er.ColumnWidth=11; m_objSheet.get_Range((object)"E2",(object)"F2").MergeCells=true; m_objSheet.get_Range((object)"G2",(object)"H2").MergeCells=true; m_objSheet.get_Range((object)"E3",(object)"F3").MergeCells=true; m_objSheet.get_Range((object)"G3",(object)"H3").MergeCells=true; m_objSheet.get_Range((object)"B2",oMiss).Value2="登录帐号";//为单元格输入文字 m_objSheet.get_Range((object)"C2",oMiss).Value2="真实姓名"; m_objSheet.get_Range((object)"D2",oMiss).Value2="所在部门"; m_objSheet.get_Range((object)"E2",oMiss).Value2="开始时间"; m_objSheet.get_Range((object)"G2",oMiss).Value2="结束时间"; m_objSheet.get_Range((object)"I2",oMiss).Value2="总成绩"; m_objSheet.get_Range((object)"J2",oMiss).Value2="考试状态"; m_objSheet.get_Range((object)"B3",oMiss).Value2=sUsername; m_objSheet.get_Range((object)"C3",oMiss).Value2=sName; m_objSheet.get_Range((object)"D3",oMiss).Value2=sDepartment; m_objSheet.get_Range((object)"E3",oMiss).Value2=sBTime; m_objSheet.get_Range((object)"G3",oMiss).Value2=sETime; m_objSheet.get_Range((object)"I3",oMiss).Value2=sScore;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教案 访问 Excel 文件