您的位置:首页 > 编程语言 > C#

c# 调用Excel的一些知识

2013-10-10 17:01 246 查看
0 引言
   Excel是微软公司办公自动化套件中的一个软件,他主要是用来处理电子表格。Excel以其功能强大,界面友好等受到了许多用户 的欢迎。在设计应用系统时,对于不同的用户,他们对于打印的需求是不一样的,如果要使得程序中的打印功能适用于每一个用户,可以想象程序设计是十分复杂 的。由于Excel表格的功能强大,又由于几乎每一台机器都安装了它,如果把程序处理的结果放到Excel表格中,这样每一个用户就可以根据自己的需要在 Excel中定制自己的打印。这样不仅使得程序设计简单,而且又满足了诸多用户的要求,更加实用了。

1 Excel对象
  微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我们简单介绍一下其中最重要,也是用得最多的四个对象。
²  Application对象。Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。
²  Workbook对象。Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。
²  Worksheet对象。Worksheet对象包含于Workbook对象,表示一个Excel工作表。
²  Range对象。Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。
2 C#中的受管代码和非受管代码在. NET公用语言框架内运行的程序为受管代码。
受管代码在程序中所有类型都受到严格检查,没有指针,对内存的管理完全由运行系统控制。受控状态下,编写程序 更为容易,且更少出错,我们可以花更多的时间在解决实际问题上而不是在计算机语言问题上。相对而言,那些在.NET框架外运行的程序为非受管代码。比如: COM组件、ActiveX组件、Win32 API函数、指针运算等。C#编程中在某些特定情况下,需要运用非受管代码,例如,要利用一个成熟的COM组件,或者调用一个API函数,或者用指针去编 写实时/高效程序等。
3 Visual C#中调用Excel的COM组件
一个.NET组件事实上是一个.NET下的DLL,它包含的不 仅是运行程序本身,更重要的是包含这个DLL的描述信息(Meta Data,即元数据),而一个COM组件是用其类库(TLB)储存其描述信息。这些COM组件都是非受管代码,要在Visual C#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的.NET组件。所以在用Visual C#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。
使用COM组件操控Excel的优势和缺点
优势:
提供了完整的Excel操控能力。可以方便的进行复杂操作。
提供了对Excel文件的底层操作,工作效率高。
和VBA方式相比可以脱离特定的Excel文件进行使用。
缺点:
代码复杂不易理解。
在操作中需要处理大量的数据类型。
使用方法
 Visual Studio 2005中默认提供了封装好的Microsoft Office 2003的.Net Excel编程模型。图中所显示的是已经安装了Office2005之后VS2005所带的.Net Excel模型。大家可以看到名为“Microsoft Excel 12.0 Object Library”的COM组件。
 由于Excel的版本一直在升级,如果我们需要操作更新版本的Excel文件,但又没有安装最新的Office,这个时候我们就需要手工进行Excel COM组件的封装。
这个时候我们需要使用 Framework v2.0 SDK tools中的一个工具tlbimp.exe-类型库导入程序(http://msdn2.microsoft.com/zh-cn/library/tt0cf3sx(VS.80).aspx),默认安装位置在。C:\Program Files\Microsoft Visual Studio8\SDK\v2.0\Bin
 把需要封装的Excel的主程序(excel.exe)复制到 tlbimp工具所在目录下。
执行命令: tlbimp excel.exe /out:excel.dll
生成封装好的excel.dll。然后就可对excel.dll进行引用。
成功引用后,引用下会出现
1.Excel
2.Microsoft.Office.Core
3.Microsoft.Office.Interop.Excel
三个类库。
其中:1为我们手工封装的Excel COM组件。2、3为我们直接引用的安装在VS2005中的Excel COM组件。如果使用VS2005内置COM组件,1将不会出现,如使用手工封装的COM组件2、3就不会出现。
n  3.1 添加引用.
将Excel的COM组件转换为.NET组件在 项目中打开Add Reference对话框,选择COM栏,之后在COM列表中找到“Microsoft Excel 9.0 Object Library”(Office 2000),然后将其加入到项目的References中即可。Visual C#.NET会自动产生相应的.NET组件文件,以后即可正常使用。
这个转换形成.NET组件不能单独使用,它不过是以前的COM组件的一个外层包装,在.NET中可以通过这个外层包装去发现原来的COM组件并调用其相应的界面函数。所以它必须与原来的COM组件一起起作用。
n  3.2 Visual C#打开Excel表格
事实上,在C#中使用一个经转换的COM组件和使用任何一个其它.NET组件完全一样。可以用new关键字创建一个经转换的COM组件,然后再像使用任何一个其它C#对象一样使用这个组件对象。
在转换后的.NET组件中定义了一个命名空间Excel,在此命名空间中封装了一个类Application,这个类和启动Excel表格有非常重要的关系,在Visual C#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:
Excel.Application excel = newExcel.Application ();//引用Excel对象

excel.Visible = true ;//使Excel可视b.设置进程的界面是否可见

但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。
n  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;
n  3. 4数据操作
  在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个单元格。通过给"Cell"赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。Cell的下标是从1开始的.在c#中,如果对下标为0的单元格赋值,则会出现Exception from HRESULT: 0x800A03EC.
excel.Cells[ 1 , 1 ] = "First Row First Column";

excel.Cells[ 1 , 2 ] = "First Row Second Column" ;

excel.Cells[ 2 , 1 ] = "Second Row First Column" ;

excel.Cells[ 2 , 2 ] = "Second Row Second Column" ;
 
//读取数据,通过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的背景色
 
使用“自动化”功能逐单元格传输数据,代码如下:

// Add data to cells in the first worksheet in the new workbook.

m_objRange = m_objSheet.get_Range("A1", m_objOpt);

m_objRange.Value = "Last Name";

m_objRange = m_objSheet.get_Range("B1", m_objOpt);

m_objRange.Value = "First Name";

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";
// Apply bold to cells A1:B1.

m_objRange = m_objSheet.get_Range("A1", "B1");

m_objFont = m_objRange.Font;

m_objFont.Bold=true;
n  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 <
ab11
br />
  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;
n  3.6网页显示
public voidshowFile()      
{         
              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();     
       }      
n  3.7 实例
下面实例在C#中连接Oracle数据库(Name),从表(TableName)中读取数据,并写入Excel.

string cnString="Provider=msdaora.1;Data source=Name; ";
cnString=cnString+"userid=UserName;password=Password";
try
{
OleDbConnection cn=new OleDbConnection (cnString);
cn.Open ();
try
{
string s="select * from Name.TableName";
OleDbCommand cmd=new OleDbCommand (s,cn);
OleDbDataReader dr=cmd.ExecuteReader ();
Excel.Application xlApp = new Excel.Application();
if(xlApp==null)
{
MessageBox.Show ("Can’t open Excel!");
return;
}
xlApp.Application .Workbooks .Add (true);
int row=2,fieldcount;
fieldcount=dr.FieldCount ;
for(int col=0;col<fieldcount;col++)
xlApp.Cells [1,col+1]=dr.GetName(col);
while (dr.Read ())
{
for(int col=0;col<fieldcount;col++)
                     {
xlApp.Cells [row,col+1]=dr.GetValue(col).ToString();
row++;
                     }
xlApp.Visible =true;
xlApp=null;
              }
}
catch(Exception ex )
{
MessageBox.Show (ex.Message );
}
Finally
{
cn.Close();
}
}
catch(Exception ex)
{
MessageBox.Show (ex.Message );
}
4安装一个使用COM组件的.NET程序
如果要将这样的程序安装运行在另一台机器上,那么除了安装运行程序外,还做三件事。
首先,是安装.NET运行系统。因为任何一个.NET程序都不能离开.NET运行系统去独立运行。
其次,所调用的COM组件必须要安装在目标机器上。本例中大多数目标机器上都装有Microsoft Office的Excel,一般不会有这个问题。但如果是另一个用户自定义的COM组件,那么这个COM组件在运行.NET程序之前必须先安装好。
最后,转换后的.NET组件DLL文件要安装在目标机器上。因为.NET组件不需要在Windows Registry中注册,所以最简单的方法是将.NET组件DLL文件拷贝到运行程序目录下。如果此.NET组件被多个.NET程序共享,可以将其安装 在.NET公用组件区中,从而可被任何一个.NET组件使用。只有当一个.NET组件参与了事务处理时,才需要将它注册为一个COM+组件。因为.NET 仍然用传统的COM+机制来处理事务的提交、回滚等。
 
 
 
1、 读写Excel文件A、设计Excel模版B、打开一个目标文件并且读取模版内容C、目标文件按格式写入需要的数据D、保存并且输出目标Excel文件

2、 Excel对象资源释放,这个在以前项目没有注意彻底释放使用到Excel对象,对客户计算机资源造成一定浪费,此次得到彻底解决。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# excel
相关文章推荐