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;