基于C#的OLEDB和COM组件对Excel文件操作
2014-02-23陈洪磊施秋萍
陈洪磊 施秋萍
(普洱学院,云南 普洱 665000)
1 引言
C#,称为C sharp,是C和C++语言的一种升级计算编程语言,由是微软公司退出的一种基于.NET框架的高级程序设计语言。C#是面向对象的编程语言,易于学习,使得程序员可以快速地编写各种.NET平台的应用程序。
Excel也是微软公司推出的Office办公套件中的一个处理表格的专业软件,也是当今最流行的办公表格处理软件[1]。
基于 C#对 Excel的专用应用程序可以大大提高工作效率,本文主要介绍两种常用C#操作Excel方法:COM组件操作法和OLEDB操作法。对于Excel最基本的操作包括:创建Excel文件,对Excel文档的保存、读写、删除、添加、查找,本文主要通过这些基本操作对两种操作方式的利弊进行了实验比较。
2 COM组件操作法
COM组件是微软公司开发的一种软件开发技术,我们狭义上可以把它理解为一个功能强大的微软API,当然它的所含的概念远远超过API。由于Excel也是由微软公司开发的,所以COM组件中也提供了对Excel操作的一些对象,其中最重要的四个对象为Application,Workbook,Worksheet和Range对象[2]。
当打开一个Excel文档的时候就创建了一个Application对象,可以理解为只要运行 Excel程序就创建了一个Application对象。如图1所示,一个Application中包含了很多个Workbook(Workbooks),这就相当于Excel文件可以同时打开很多个工作薄(Workbooks),其中的一个就是Workbook,在一个Workbook中又包含了很多工作表(Worksheets),其中一个就成为Worksheet。在图1 的结构图中,最后一个对象Range表示一个工作表(Workbook)中单元格的使用范围[3][4]。
图1 Excel对象层级结构
2.1 创建与保存Excel文档
本文中的编程环境是Visual Studio 2010,在创建Excel文档是首先要添加Excel的COM组件,即在项目中添加引用“Microsoft Excel 15.0 Object Library”,这里要特别注意,由于Office办公套件有很多版本,所以添加引用时也有很多的版本,有些较老的版本是不支持较新的Office文件,通常最好添加新版本的COM组件[5]。
首先使用命名空间:using Excel=Microsoft.Office.Interop.Excel;
Excel.Application NewExcel = new Excel.Application();//新建一个Excel进程
NewExcel.Application.Workbooks.Add (true );//在Excel文件中创建一个工作薄
通过以上就可以简单的创建一个空白的Excel文件,通常情况可以通过Visible属性来设置创建的Excel文件可见性,NewExcel.Visible=false这里设置Excel为不可见。
以上创建空白的Excel后就要对新建文档进行保存,这里使用SaveAs方法:
NewExcel.SaveAs(filename,Missing.Value,Missing.Value,Missi ng.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMo de.xlNoChange,Missing.Value,Missing.Value,Missing.Val ue,Missing.Value, Missing.Value);
SaveAs方法中有很多参数,这里我们主要关心其中的filename参数,其作用是要保存的文件名。可包含完整路径。如果不指定路径,文件保存到当前文件夹中。其他的参数设置一般使用默认方式,详细了解可以通过微软官方MSDN网站[1]。
2.2 写入与读取数据
2.2.1 写入数据
在创建一个新的工作薄后,可以直接使用“Cells”对新建的Excel赋值,具体代码如下:
NewExcel.Cells[1,1]=”第一行第一列”;
NewExcel.Cells[1,2]=”第一行第二列”;
这里的行列号是从1开始排列,不是从0开始。
2.2.2 读取数据
读取数据相对于写入数据较为复杂,通常要读取数据首先要打开有数据的 Excel文档,这里使用 COM组件的 Open方法打开一个Excel文档:
Excel.Workbook NewWorkbook = NewExcel.Workbooks.Open(FilePath, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing);
这里使用Application新建一个Excel进程,然后在此基础上创建一个新的工作薄NewWorkbook,打开的Excel文档就要导入到这里工作薄中。在Open方法中有很多的参数,通常我们主要关注FilePath,这个参数就是要打开的文件路径[6]。
接下来还要创建一个新的工作表(Worksheet),在工作表的基础上在创建Range对象,数据的读取就是通过Range对象完成的,具体过程如下:
Excel.Worksheet
NewSheet=(Excel.Worksheet)NewWorkbook. Sheets[1];//在工作薄中创建一个工作表
Excel.Range range= (Excel.Range)NewSheet.Cells[2,2];//这里是把工作表中的第二行第二列转换为Range对象,并赋值给range。
得到Range对象后可以使用Text或者Value2等属性得到里面的数据。
当数据写入完成后要使用 NewWorkbook.Save()或者NewWorkbook.SaveAs()进行保存,最后在使用NewWorkbook.Close()关闭工作薄。
2.3 删除数据
在Excel中删除数据主要使用Range对象。
Excel.Range range= NewSheet.get_Range(”A1”,”H1”);//”A1”和”H1”是要删除表格的范围
Range.Delete(Type.Missing);// “Type.Missing”表示缺省值
在实际情况中,经常用到整行、整列的删除,在COM组件中也提供这种删除方法。
删除整行:
Excel.Range range = (Excel.Range) NewSheet.Rows[1,Missing.Value];//把工作表中的要删除的行赋值给 range对象,这里是第一行。
range.EntireRow.Delete(Excel.XlDeleteShiftDirect ion.xlShiftUp);//调用range对象的EntireRow表示整行,Delete表示删除里面的参数表示删除后下方单元格向上移动。
删除整列:
Excel.Range range = (Excel.Range) NewSheet.Columns[1, Missing.Value];//把工作表中的要删除的列赋值给range对象,这里是第一列。
range.EntireColumn.Delete(Excel.XlDeleteShiftDir ection.xlShiftToLeft);//调用range对象的EntireColumn表示整列,Delete表示删除里面的参数表示删除后右边单元格向左移动[6]。
2.4 增加数据
Excel表格增加数据主要就是指增加行或者列,其操作方式与删除方式类似。
增加行:
Excel.Range range = (Excel.Range)NewSheet.Rows[2,Missing.Value];//获取要插入的行号,并转换为 Range对象,这里是要插入第二行。
range.Insert(Missing.Value,Excel.XlInsertFormatO rigin.xlFormatFromLeftOrAbove);//在 Excel表格中的第一行后插入一个空的第二行,Insert的第二个参数表示插入后,其他单元格移动方向。
增加列:
Excel.Range range = (Excel.Range)NewSheet. Columns[2, Missing.Value];//获取要插入的列号,并转换为Range对象,这里是要插入第二列。
range.Insert (Missing.Value, Excel.XlInsertShiftDirection.xlShiftToRight); //在 Excel表格中的第一列后插入一个空的第二列,Insert的第二个参数表示插入后,其他单元格移动方向[7]。
2.5 查找
查找也是Excel文档中十分重要的一个功能,下面是在一个工作表中的查找代码:
Excel.Range range = ((Excel.Range)NewSheet. UsedRange).Find("查找关键字", Missing.Value, Missing.Value,Missing.Value, Missing.Value, Excel.XlSearchDirection.xlNext,Missing.Value, Missing.Value, Missing.Value);
NewSheet.UsedRange:表示当前工作表里所有使用的单元格区域组成的Range对象;
Find方法:方法中有很多个参数,主要有两个参数必须要设置,第一个是要查找的关键字,另一个是 Excel.XlSearchDirection表示查询的方向有两个枚举数值:xlNext向下查找和xlPrevious向前查找[7][8]。
3 OLEDB操作法
OLEDB是微软公司退出的针对不同的数据源的应用程序接口,也可以理解为OLEDB是一个数据库的接口,程序可以通过 OLEDB连接到数据库。这就说明 OLEDB操作法就是把Excel文件当作一个数据库进行操作,这也就使得OLEDB操作法不能直接创建空白的Excel文件,这能向操作数据库一样连接一个已存在的一个Excel文档。但是同时Excel本身并不是一个真正的数据库文件,所以在 OLEDB中并不能对Excel文档执行Delete删除命令。
OLEDB操作Excel一般要通过C#自身的DataSet对象。DataSet为方便数据处理开发出来的,是数据的集合,正是因为使用DataSet,才使得数据操作简单、高效。
首先要创建连接:
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=0'";
这是连接字符串,其中 filepath是要连接的 Excel文件路径。
“Microsoft.ACE.OLEDB.12.0”是连接Excel对象的接口引擎,较早的版本是“Microsoft.Jet.OLEDB.4.0”现在很少使用,如果程序出现连接方面的错误可以互相更换。
“Excel 12.0”表示Excel版本号,如果你的Excel是97年以前的版本要使用Excel 8.0。
“HDR” 表示第一行是否是标题行。
“IMEX”有三种模式,分别有0、1、2表示,“0”时Excel文档能够进行写入操作;“1”时Excel文档能够进行读取操作;“2”时Excel文档可以同时只进行读写操作。
3.1 OLEDB读写Excel文档
3.1.1 读取数据
OleDbConnection conn = new OleDbConnection(strConn); //创建连接
conn.Open();
string strExcel = "select * from [sheet1$]";//使用SQL语句读取Excel文档中名为sheet1的工作表
OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);//执行SQL语句
DataSet ds = new DataSet();
DataTable dt = new DataTable ();
ds.Tables.Add(dt);//把新建的 DataTable加入到DataSet中
myCommand.Fill(dt);//Excel文档中的内容导入到了dt表中
conn.Close();
执行上面的程序后 Excel文档的内容已经读入到了 dt中,这里要说明下,DataSet中可以包含很多个DataTable,这种关系类似与Excel中工作薄和工作表的关系[8]。
3.1.2 写入数据
这里对数据的操作有两种方法,一种是直接使用SQL语句操作Excel表格数据;另一种方法就是操作DataSet中读入的数据,操作全部完成后在一次更新到Excel文档中。由于直接使用SQL语句直接操作Excel文档效率较低,所以本文主要介绍操作DataSet,再更新到Excel文档中的方法[8]。
DataRow NewRow = dt.NewRow();//在dt表格中新建一行数据
NewRow ["序号"]= "3";//赋值给“序号”字段
NewRow ["姓名"]= "张三";//赋值给“姓名”字段
NewRow ["学号"]= "201401001";//赋值给“学号”字段
dt.Rows.Add(NewRow);//确认插入新建的一行数据
以上增加 dt表格中的数据,接下来要把数据更新到Excel文档中:
OleDbCommandBuilder odcb=new OleDbCommandBuilder(myCommand);
odcb.QuotePrefix = "[";
odcb.QuoteSuffix = "]";//用于纠正 INSERT INTO 语句的语法错误
myCommand.Update(dt);//更新dt数据到Excel文档中
3.2 查找数据
查找数据只要使用DataTable中的Find方法。
DataRow keyword = dt.Rows.Find("张三");//查找 dt表中有关“张三”数据
4 总结与讨论
本文主要介绍了COM组件和OLEDB两种方法操作Excel文档的基本方法。从上面的内容可以看到OLEDB的操作比COM组件的操作功能少了很多,主要是因为OLEDB把Excel文档作为一个数据库进行处理,对数据库处理有一定限制,比如不能随意改变数据库的结构,这就是为什么OLEDB中不能添加或者删除列;而COM组件的操作就灵活多变,基本上可以实现Excel文档操作中的所有功能,除了以上介绍的基本功能,还可以设置字体、改变颜色、设置单元格大小等;但是COM组件的操作效率较低,执行的速度远远低于OLEDB法,一个简单的查找操作可能要比OLEDB操作的时间长10倍,COM组件法还有个非常麻烦的问题,每次操作完成后必须要手动把运行的Excel进程关闭,如果不关闭会影响后续对Excel文档的处理。
最后总结,在实际编程过程中,我们可以同时使用两种方法,发挥各自的优点,这样才能最大限度的提高程序的效率。
[1]微软公司. Microsoft Visual Studio.Net [Z].微软公司,2003.
[2]Ted Faison. Visual C# 基于组件的开发[M].北京:清华大学出版社, 2003.
[3]李建忠. Microsoft .NET框架程序设计[M].武汉:华中科技大学出版社, 2004.
[4]杜成龙.ASP.NET实现通用查询方式[J].教育信息化,2005,(7): 77-78.
[5]张文博,余文芳.ASP.NET编程中对Excel文档操作的探讨及应用[J].计算机系统应用,2010,(3): 187-189.
[6]陈志坚. ASP.NET中Excel文档的处理[J].宁波职业技术学院学报,2010,(5): 60-62.
[7]王兴,李菊,陈玮. ASP.NET中Excel文档生成技术研究[J].软件导刊. 2010,(4): 130-131.
[8]张立君,王维国.基干ASP.NET与ADO.NET技术访问数据库[J].商丘职业技术学院学报,2008,(5): 29-31.