c调用Excel的一些知识.docx
- 文档编号:9968551
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:14
- 大小:21.91KB
c调用Excel的一些知识.docx
《c调用Excel的一些知识.docx》由会员分享,可在线阅读,更多相关《c调用Excel的一些知识.docx(14页珍藏版)》请在冰点文库上搜索。
c调用Excel的一些知识
摘要:
本文介绍了Excel对象、C#中的受管代码和非受管代码,并介绍了COM组件在.NET环境中的使用。
0引言
Excel是微软公司办公自动化套件中的一个软件,他主要是用来处理电子表格。
Excel以其功能强大,界面友好等受到了许多用户的欢迎。
在设计应用系统时,对于不同的用户,他们对于打印的需求是不一样的,如果要使得程序中的打印功能适用于每一个用户,可以想象程序设计是十分复杂的。
由于Excel表格的功能强大,又由于几乎每一台机器都安装了它,如果把程序处理的结果放到Excel表格中,这样每一个用户就可以根据自己的需要在Excel中定制自己的打印。
这样不仅使得程序设计简单,而且又满足了诸多用户的要求,更加实用了。
1Excel对象
微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我们简单介绍一下其中最重要,也是用得最多的四个对象。
✧Application对象。
Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。
✧Workbook对象。
Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。
✧Worksheet对象。
Worksheet对象包含于Workbook对象,表示一个Excel工作表。
✧Range对象。
Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。
2C#中的受管代码和非受管代码在.NET公用语言框架内运行的程序为受管代码。
受管代码在程序中所有类型都受到严格检查,没有指针,对内存的管理完全由运行系统控制。
受控状态下,编写程序更为容易,且更少出错,我们可以花更多的时间在解决实际问题上而不是在计算机语言问题上。
相对而言,那些在.NET框架外运行的程序为非受管代码。
比如:
COM组件、ActiveX组件、Win32API函数、指针运算等。
C#编程中在某些特定情况下,需要运用非受管代码,例如,要利用一个成熟的COM组件,或者调用一个API函数,或者用指针去编写实时/高效程序等。
3VisualC#中调用Excel的COM组件
一个.NET组件事实上是一个.NET下的DLL,它包含的不仅是运行程序本身,更重要的是包含这个DLL的描述信息(MetaData,即元数据),而一个COM组件是用其类库(TLB)储存其描述信息。
这些COM组件都是非受管代码,要在VisualC#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的.NET组件。
所以在用VisualC#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。
使用COM组件操控Excel的优势和缺点
优势:
提供了完整的Excel操控能力。
可以方便的进行复杂操作。
提供了对Excel文件的底层操作,工作效率高。
和VBA方式相比可以脱离特定的Excel文件进行使用。
缺点:
代码复杂不易理解。
在操作中需要处理大量的数据类型。
使用方法
VisualStudio2005中默认提供了封装好的MicrosoftOffice2003的.NetExcel编程模型。
图中所显示的是已经安装了Office2005之后VS2005所带的.NetExcel模型。
大家可以看到名为“MicrosoftExcel12.0ObjectLibrary”的COM组件。
由于Excel的版本一直在升级,如果我们需要操作更新版本的Excel文件,但又没有安装最新的Office,这个时候我们就需要手工进行ExcelCOM组件的封装。
这个时候我们需要使用Frameworkv2.0SDKtools中的一个工具tlbimp.exe-类型库导入程序(Files\MicrosoftVisualStudio8\SDK\v2.0\Bin
把需要封装的Excel的主程序(excel.exe)复制到tlbimp工具所在目录下。
执行命令:
tlbimpexcel.exe/out:
excel.dll
生成封装好的excel.dll。
然后就可对excel.dll进行引用。
成功引用后,引用下会出现
1.Excel
2.Microsoft.Office.Core
3.Microsoft.Office.Interop.Excel
三个类库。
其中:
1为我们手工封装的ExcelCOM组件。
2、3为我们直接引用的安装在VS2005中的ExcelCOM组件。
如果使用VS2005内置COM组件,1将不会出现,如使用手工封装的COM组件2、3就不会出现。
⏹3.1添加引用.
将Excel的COM组件转换为.NET组件在项目中打开AddReference对话框,选择COM栏,之后在COM列表中找到“MicrosoftExcel9.0ObjectLibrary”(Office2000),然后将其加入到项目的References中即可。
VisualC#.NET会自动产生相应的.NET组件文件,以后即可正常使用。
这个转换形成.NET组件不能单独使用,它不过是以前的COM组件的一个外层包装,在.NET中可以通过这个外层包装去发现原来的COM组件并调用其相应的界面函数。
所以它必须与原来的COM组件一起起作用。
⏹3.2VisualC#打开Excel表格
事实上,在C#中使用一个经转换的COM组件和使用任何一个其它.NET组件完全一样。
可以用new关键字创建一个经转换的COM组件,然后再像使用任何一个其它C#对象一样使用这个组件对象。
在转换后的.NET组件中定义了一个命名空间Excel,在此命名空间中封装了一个类Application,这个类和启动Excel表格有非常重要的关系,在VisualC#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:
Excel.Applicationexcel=newExcel.Application();//引用Excel对象
excel.Visible=true;//使Excel可视b.设置进程的界面是否可见
但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。
⏹3.3添加WorkBook与WorkSheet
//得到WorkBook对象,可以用两种方式之一:
下面的是打开已有的文件
Excel.WorkbookxBook=xApp.Workbooks._Open(@"D:
\Sample.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
//xBook=xApp.Workbooks.Add(Missing.Value);//新建文件的代码
//excel.Application.Workbooks.Add(true);//引用Excel工作簿
//指定要操作的Sheet,两种方式:
Excel.WorksheetxSheet=(Excel.Worksheet)xBook.Sheets[1];
Excel.WorksheetxSheet=(Excel.Worksheet)xApp.ActiveSheet;
⏹3.4数据操作
在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个单元格。
通过给"Cell"赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。
Cell的下标是从1开始的.在c#中,如果对下标为0的单元格赋值,则会出现ExceptionfromHRESULT:
0x800A03EC.
excel.Cells[1,1]="FirstRowFirstColumn";
excel.Cells[1,2]="FirstRowSecondColumn";
excel.Cells[2,1]="SecondRowFirstColumn";
excel.Cells[2,2]="SecondRowSecondColumn";
//读取数据,通过Range对象
Excel.Rangerng1=xSheet.get_Range("A1",Type.Missing);
Console.WriteLine(rng1.Value2);
//读取,通过Range对象,但使用不同的接口得到Range
Excel.Rangerng2=(Excel.Range)xSheet.Cells[3,1];
Console.WriteLine(rng2.Value2);
//写入数据
Excel.Rangerng3=xSheet.get_Range("C6",Missing.Value);
rng3.Value2="Hello";
rng3.Interior.ColorIndex=6;//设置Range的背景色
使用“自动化”功能逐单元格传输数据,代码如下:
//Adddatatocellsinthefirstworksheetinthenewworkbook.
m_objRange=m_objSheet.get_Range("A1",m_objOpt);
m_objRange.Value="LastName";
m_objRange=m_objSheet.get_Range("B1",m_objOpt);
m_objRange.Value="FirstName";
m_objRange=m_objSheet.get_Range("A2",m_objOpt);
m_objRange.Value="Doe";
m_objRange=m_objSheet.get_Range("B2",m_objOpt);
m_objRange.Value="John";
//ApplyboldtocellsA1:
B1.
m_objRange=m_objSheet.get_Range("A1","B1");
m_objFont=m_objRange.Font;
m_objFont.Bold=true;
⏹3.5保存
//保存方式一:
保存WorkBook
xBook.SaveAs(@"D:
\CData.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
//保存方式二:
保存WorkSheet
xSheet.SaveAs(@"D:
\CData2.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
//保存方式三
xBook.Save();
xSheet=null;
xBook=null;
xApp.Quit();//这一句是非常重要的,否则Excel对象不能从内存中退出
xApp=null;
⏹3.6网页显示
publicvoidshowFile()
{
HttpContext.Current.Response.Charset
System.Text.Encoding.Default.WebName;
HttpContext.Current.Response.ContentType="application/vnd.ms-excel";
HttpContext.Current.Response.ContentEncoding=System.Text.Encoding.UTF8; HttpContext.Current.Response.WriteFile(fileName);
HttpContext.Current.Response.End();
}
⏹3.7实例
下面实例在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 xlApp.Cells[1,col+1]=dr.GetName(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); } 4安装一个使用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+机制来处理事务的提交、回滚等。 1、读写Excel文件A、设计Excel模版B、打开一个目标文件并且读取模版内容C、目标文件按格式写入需要的数据D、保存并且输出目标Excel文件 2、Excel对象资源释放,这个在以前项目没有注意彻底释放使用到Excel对象,对客户计算机资源造成一定浪费,此次得到彻底解决。 C#导入EXCEL /*注意: 测试过程中将执行时间设为非月末,此类放在实际中需要改成月末。 改变方法是把16行的==变为! =*/ usingSystem; usingSystem.Data; usingSystem.Data.SqlClient; usingSystem.Data.OleDb; usingSystem.Windows.Forms; usingSystem.Text; usingSystem.IO; usingSystem.Reflection; /*SQLserver2000中的电话记录以及信息发布记录打入数据导入excel文件*/ publicclassIntroduceExcel: System.Windows.Forms.Form { publicIntroduceExcel() { DateTimetoday=System.DateTime.Today;//获取当前时间 if(today.Day==DateTime.DaysInMonth(today.Year,today.Month)) {//如果并非月底,不执行导入 return; } else//否则执行导入 if(MessageBox.Show("点击确定开始导入,点击否可日后手动导入\n","月末电话记录,信息发布记录导入Excel程序自动开启",MessageBoxButtons.YesNo,MessageBoxIcon.Warning)==DialogResult.No) { return;}//if else { GetConnect("CallRecord");//打开数据链接,开启导入函数 GetConnect("PubInfRecord"); DeleteRecord("CallRecord");//清空本月的数据 DeleteRecord("PubInfRecord"); }//else } /*exel文件导入函数*/ privatevoidGetConnect(stringorigin) { SqlConnectioncon=creCon();//创建一个SQL2000数据库链接 con.Open(); stringsql="select*from"+origin+"orderbyNetId";//查询数据库 SqlDataAdaptersa=newSqlDataAdapter(sql,con); DataSetds=newDataSet(); sa.Fill(ds,origin);//填充数据 try { Excel.Applicationexcel=newExcel.Application();//开启excel excel.Application.Workbooks.Add(true); Excel.SheetsExcelSheets=excel.Worksheets;//建立一个新的工作表 excel.Cells[1,1]="NetId(网号)"; excel.Cells[1, 2]="MemId(成员号)"; excel.Cells[1,3]="CurCallNum(当前打入电话)"; excel.Cells[1,4]="CompanyName(公司名)"; excel.Cells[1,5]="UpWorker(坐席人员)"; excel.Cells[1,6]="SumNumber(本月次数统计)"; objectmissing=Missing.Value; excel.Visible=true; //excel文件可见 intRoLength=ds.Tables[0].Rows.Count;//行数 inti; for(i=0;i { /*从数据库中取出电话相关信息*/ stringNetId=ds.Tables[0].Rows[i][0].ToString(); stringMemId=ds.Tables[0].Rows[i][1].ToString(); stringCallNumber=ds.Tables[0].Rows[i][2].ToString(); stringCompanyName=ds.Tables[0].Rows[i][3].ToString(); stringWorker=ds.Tables[0].Rows[i][4].ToString(); stringNumber=ds.Tables[0].Rows[i][5].ToString(); /*填充到excel的工作表中*/ excel.Cells[i+1,1]=NetId; excel.Cells[i+1, 2]=MemId; excel.Cells[i+1,3]=CallNumber; excel.Cells[i+1,4]=CompanyName; excel.Cells[i+1,5]=Worker; excel.Cells[i+1,6]=Number; }//for con.Close();//关闭此数据链接 /*文件保存对话框,文件保存采用了一个file自定义类*/ SaveFileDialogsaveFileDialog=newSaveFileDialog(); saveFileDialog.Filter="Excelfiles(*.xls)|*.xls|Allfiles(*.*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 调用 Excel 一些 知识