教案访问Excel文件.docx

上传人:b****8 文档编号:30400803 上传时间:2023-08-14 格式:DOCX 页数:12 大小:21.13KB
下载 相关 举报
教案访问Excel文件.docx_第1页
第1页 / 共12页
教案访问Excel文件.docx_第2页
第2页 / 共12页
教案访问Excel文件.docx_第3页
第3页 / 共12页
教案访问Excel文件.docx_第4页
第4页 / 共12页
教案访问Excel文件.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

教案访问Excel文件.docx

《教案访问Excel文件.docx》由会员分享,可在线阅读,更多相关《教案访问Excel文件.docx(12页珍藏版)》请在冰豆网上搜索。

教案访问Excel文件.docx

教案访问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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1