C#操作Excel.docx
《C#操作Excel.docx》由会员分享,可在线阅读,更多相关《C#操作Excel.docx(35页珍藏版)》请在冰豆网上搜索。
C#操作Excel
VisualC#的Excel编程
前言
Excel是微软公司办公自动化套件中的一个软件,他主要是用来处理电子表格。
Excel以其功能强大,界面友好等受到了许多用户的欢迎。
在办公的时候,正是由于Excel的这么多的优点,许多重要的数据,往往以Excel电子表格的形式存储起来。
这样就给程序员带来了一个问题,虽然Excel功能比较强大,但毕竟不是数据库,在程序中处理数据库中的数据比其处理Excel表格中的数据容易许多。
那么如何用VisualC#读取Excel表格中的数据?
在以前用Delphi编程的时候,对于不同的用户,他们对于打印的需求是不一样的,如果要使得程序中的打印功能适用于每一个用户,可以想象程序设计是十分复杂的。
这时想到Excel,由于Excel表格的功能强大,又由于几乎每一台机器都安装了它,如果把程序处理的结果放到Excel表格中,这样每一个用户就可以根据自己的需要在Excel中定制自己的打印。
这样不仅使得程序设计简单,而且又满足了诸多用户的要求,更加实用了。
那么用VisualC#如何调用Excel,如何又把数据存放到Excel表格中?
本文就来探讨一下上述问题的解决办法。
一.程序设计及运行环境
(1).微软视窗2000服务器版
(2)..NetFrameworkSDKBeta2
(3).MicrosoftDataAccessComponent2.6以上版本(MDAC2.6)
(4).Office2000套件
二.VisualC#读取Excel表格中的数据:
本节将通过一个程序来介绍VisualC#读取Excel表格中的数据,并把数据以DataGrid的形式显示出来。
(1).如何读取数据
其实读取Excel表格中的数据和读取数据库中的数据是非常类似的,因为在某种程度上Excel表格可以看成是一张一张的数据表。
其二者的主要区别在于所使用的数据引擎不一样。
在本文的程序中,通过下列代码实现读取Excel表格数据,具体如下:
//创建一个数据链接
stringstrCon="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:
\\sample.xls;ExtendedProperties=Excel8.0";
OleDbConnectionmyConn=newOleDbConnection(strCon);
stringstrCom="SELECT*FROM[Sheet1$]";
myConn.Open();
file:
//打开数据链接,得到一个数据集
OleDbDataAdaptermyCommand=newOleDbDataAdapter(strCom,myConn);
file:
//创建一个DataSet对象
myDataSet=newDataSet();
file:
//得到自己的DataSet对象
myCommand.Fill(myDataSet,"[Sheet1$]");
file:
//关闭此数据链接
myConn.Close();
怎么样读取Excel表格中的数据其实和读取数据库中的数据没有什么实质上的区别。
注释:
这里读取的是C盘根目录下的"Sample.xls"文件。
(2).用DataGrid来显示得到的数据集
在得到DataSet对象后,只需要通过下列二行代码,就可以把数据集用DataGrid显示出来了:
DataGrid1.DataMember="[Sheet1$]";
DataGrid1.DataSource=myDataSet;
(3).用VisualC#读取Excel表格,并用DataGrid显示出来的程序代码(Read.cs)和程序运行的界面
掌握了上面二点,水到渠成就可以得到以下代码:
usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Data;
usingSystem.Data.OleDb;
publicclassForm1:
Form
{
privateButtonbutton1;
privateSystem.Data.DataSetmyDataSet;
privateDataGridDataGrid1;
privateSystem.ComponentModel.Containercomponents=null;
publicForm1()
{
file:
//初始化窗体中的各个组件
InitializeComponent();
file:
//打开数据链接,得到数据集
GetConnect();
}
file:
//清除程序中使用过的资源
protectedoverridevoidDispose(booldisposing)
{
if(disposing)
{
if(components!
=null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
privatevoidGetConnect()
{
file:
//创建一个数据链接
stringstrCon="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:
\\sample.xls;ExtendedProperties=Excel8.0";
OleDbConnectionmyConn=newOleDbConnection(strCon);
stringstrCom="SELECT*FROM[Sheet1$]";
myConn.Open();
file:
//打开数据链接,得到一个数据集
OleDbDataAdaptermyCommand=newOleDbDataAdapter(strCom,myConn);
file:
//创建一个DataSet对象
myDataSet=newDataSet();
file:
//得到自己的DataSet对象
myCommand.Fill(myDataSet,"[Sheet1$]");
file:
//关闭此数据链接
myConn.Close();
}
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
DataGrid1.DataMember="[Sheet1$]";
DataGrid1.DataSource=myDataSet;
}
staticvoidMain()
{
Application.Run(newForm1());
}
}
(4).总结
以上只是读取了Excel表格中"Sheet1"中的数据,对于其他"Sheet"中的内容,可以参照读取"Sheet1"中的程序,只作一点修改就可以了,譬如要读取"Sheet2"中的内容,只需要把"Read.cs"程序中的"Sheet1$"改成"Sheet2$"就可以了。
三.VisualC#调用Excel表格,并在Excel表格中存储数据:
在VisualC#中调用Excel表格,并不像读取Excel表格中的数据那么容易了,因为在VisualC#中调用Excel表格要使用到Excel的COM组件。
如果你安装Office套件在"C"盘,那么在"C:
\ProgramFiles\MicrosoftOffice\Office"可以找到这个COM组件"EXCEL9.OLB",在《VisualC#如何使用ActiveX组件》一文中,这些COM组件都是非受管代码的,要在VisualC#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的类库。
所以在用VisualC#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。
(1).非受管代码COM组件转换成受管代码的类库
首先把COM组件"EXCEL9.OLB"拷贝到C盘的根目录下,然后输入下列命令:
tlbimpexcel9.olb
这样在C盘的根目录下面就产生了三个DLL文件:
"Excel.dll"、"Office.dll"、"VBIDE.dll"。
在产生了上面的三个文件后,这种转换就成功完成了。
在下面的程序中,就可以利用这转换好的三个类库编写和Excel表格相关的各种操作了。
注释:
1.在安装的程序中或许找不到excel9.olb,可以利用下面的命令格式获取dll文件
Tlbimpexecel.exe
也可以生成文件"Excel.dll","VBIDE.dll"
2.也可以使用VisualStudio.net2003或其以上版本添加引用找到Excel.exe文件,会自动转化为excel.dll文件,然后在程序中添加包含即可
例如:
usingExcel;
请根据包的不同情况添加
(2).VisualC#打开Excel表格:
在"Excel.dll"中定义了一个命名空间"Excel",在差命名空间中封装了一个类"Application",这个类和启动Excel表格有非常重要的关系,在VisualC#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:
Excel.Applicationexcel=newExcel.ApplicationClass();
excel.Application.Workbooks.Add(true);
excel.Visible=true;
但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。
(3).往Excel表格中输入数据:
在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个下单元。
通过给差"Cell"赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。
Excel.Applicationexcel=newExcel.ApplicationClass();
excel.Application.Workbooks.Add(true);
excel.Cells[1,1]="第一行第一列";
excel.Cells[1,2]="第一行第二列";
excel.Cells[2,1]="第二行第一列";
excel.Cells[2,2]="第二行第二列";
excel.Cells[3,1]="第三行第一列";
excel.Cells[3,2]="第三行第二列";
excel.Visible=true;
(4).VisualC#调用Excel表格,并在Excel表格中存储数据的程序代码(Excel.cs):
了解了上面的这些知识,得到完成上述功能的程序代码就显得比较容易了,具体如下:
usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Data;
usingSystem.Data.SqlClient;
publicclassForm1:
Form
{
privateButtonbutton1;
privateSystem.ComponentModel.Containercomponents=null;
publicForm1()
{
file:
//初始化窗体中的各个组件
InitializeComponent();
}
file:
//清除程序中使用的各个资源
protectedoverridevoidDispose(booldisposing)
{
if(disposing)
{
if(components!
=null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
privatevoidInitializeComponent()
{
button1=newButton();
SuspendLayout();
button1.Location=newSystem.Drawing.Point(32,72);
button1.Name="button1";
button1.Size=newSystem.Drawing.Size(100,30);
button1.TabIndex=0;
button1.Text="调用Excel文件!
";
button1.Click+=newSystem.EventHandler(button1_Click);
AutoScaleBaseSize=newSystem.Drawing.Size(5,13);
this.ClientSize=newSystem.Drawing.Size(292,273);
this.Controls.Add(button1);
this.Name="Form1";
this.Text="如何用VisualC#调用Excel表格!
";
this.ResumeLayout(false);
}
staticvoidMain()
{
Application.Run(newForm1());
}
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
Excel.Applicationexcel=newExcel.Application();
excel.Application.Workbooks.Add(true);
excel.Cells[1,1]="第一行第一列";
excel.Cells[1,2]="第一行第二列";
excel.Cells[2,1]="第二行第一列";
excel.Cells[2,2]="第二行第二列";
excel.Cells[3,1]="第三行第一列";
excel.Cells[3,2]="第三行第二列";
excel.Visible=true;
}
}
(5).编译源程序和程序运行界面:
在经过了下列命令编译后:
Csc.exe/r:
system.dll/r:
system.windows.forms.dll/r:
system.drawing.dll/r:
excel.dll/r:
office.dll/r:
vbide.dllexcel.cs
就可以得到"Excel.exe",运行后界面如下
四.VisualC#处理Office套件中的其他成员程序:
本文虽然只介绍了VisualC#在处理Excel表格中经常遇到的一些问题的解决方法,但其实对Office套件的其他成员也有很强的借鉴意义,譬如VisualC#来处理Word文档,在调用Word文档的时候,必须先完成COM组件从非受管代码到受管代码的转换,Word的COM组件位"MSWORD9.OLB",经过转换后也会产生三个DLL文件,但分别是"Word.dll"、"Office.dll"、"VBIDE.dll"。
其实在VisualC#中调用Word,也非常容易。
只需要把调用Excel表格中的代码换成调用Word的代码就可以了,具体如下:
Word.Applicationword=newWord.Application();
word.Application.Visible=true;
不信你试一下,看看是否达到你的要求。
对于针对Word的其他的操作,总体来说和对Excel表格的操作相类似。
由于针对Word只是一个文档,程序对Word进行的操作是比较少的,所以就不一一介绍了。
五.总结:
本文介绍VisualC#来处理Excel表格的几种最常遇到的情况,虽然针对的只是Excel表格,但对其他Office套件中的成员也具有十分的借鉴意义。
程序示例及常见问题:
前提:
首先要把Excel加入到引用,加入方法见:
非受管代码COM组件转换成受管代码的类库
示例1:
读取一个模板excel文件另存为另外一个excel文件
usingSystem;
usingExcel;
namespaceExcelOperator.ClassExcel
{
///
///Example1的摘要说明。
///-----2006.08.31Peter---------
///读取一个模板excel文件另存为另外一个excel文件
///在做完操作之后立刻结束excel进程
///--------End------------
///
publicclassExample1
{
privateDateTimebeforeTime;//Excel启动之前时间
privateDateTimeafterTime;//Excel启动之后时间
privatestringOriginalPath;
privatestringCurrentPath;
publicExample2(stringCurrentPath,stringOriginalPath)
{
this.OriginalPath=OriginalPath;
this.CurrentPath=CurrentPath;
}
publicvoidOperatorExcel()
{
//GC.Collect();
Excel.Applicationexcel;//声明excel对象
beforeTime=DateTime.Now;//获取excel开始启动时间
excel=newExcel.ApplicationClass();//创建对象实例,这时在系统进程中会多出一个excel进程
afterTime=DateTime.Now;//获取excel启动结束的时间
try
{
objectmissing=System.Reflection.Missing.Value;//Missing用于调用带默认参数的方法。
objectreadOnly=true;
excel.Visible=false;//是否显示excel文档
//OpenOriginalExcelFile
excel.Application.Workbooks.Open(OriginalPath,missing,readOnly,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
Excel.WorkbookmyBook=excel.Workbooks[1];//Workbooks从1开始计数的
Excel.WorksheetmySheet=(Excel.Worksheet)myBook.Worksheets[3];//从1开始计数的
Excel.Ranger=mySheet.get_Range(mySheet.Cells[1,17],mySheet.Cells[65231,17]);//获取矩形选择框
r.NumberFormatLocal=XlColumnDataType.xlTextFormat;//设置该矩形框的文本格式
//SaveAsOriginalExcelFileToCurrentPath
mySheet.SaveAs(CurrentPath,missing,missing,missing,missing,missing,missing,missing,missing,missing);
//释放Excel对象,但在AWeb程序中只有转向另一个页面的时候进程才结束
//可以考虑使用KillExcelProcess()杀掉进程
//ReleaseComObject方法递减运行库可调用包装的引用计数。
详细信息见MSDN
System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
System.Runtime.InteropServices.Marshal.ReleaseComObject(r);
myBook.Close(null,null,null);
excel.Workbooks.Close();
r=null;
mySheet=null;
myBook=null;
missing=null;
readOnly=null;
excel.Quit();
excel=null;
}
catch
{
KillExcelProcess();//杀掉进程
}
finally
{
//可以把KillExcelProcess();放在该处从而杀掉Excel的进程
}
}
privatevoidKillExcelProcess()
{
System.Diagno