C#操作Excel文件 之一

27 篇文章 0 订阅
8 篇文章 0 订阅

     在工作中是要对Excel的操作,实际项目中除了读取excel,写入excel。还很有肯能要做一些更加具体的操作。比如:单元格的样式,长宽。工作表的拷贝等等。下面是经过本人收集的一些资料。

 

C#操作Excel文件 之一

C#操作Excel文件 之二

C#操作Excel文件 之三

 

摘要:本文介绍了Excel对象、C#中的受管代码和非受管代码,并介绍了COM组件在.net环境中的使用。

  关键词:受管代码;非受管代码;Excel对象;动态连接库
  引言

  Excel是微软公司办公自动化套件中的一个软件,他主要是用来处理电子表格。Excel以其功能强大,界面友好等受到了许多用户的欢迎。在设计应用系统时,对于不同的用户,他们对于打印的需求是不一样的,如果要使得程序中的打印功能适用于每一个用户,可以想象程序设计是十分复杂的。由于Excel表格的功能强大,又由于几乎每一台机器都安装了它,如果把程序处理的结果放到Excel表格中,这样每一个用户就可以根据自己的需要在Excel中定制自己的打印。这样不仅使得程序设计简单,而且又满足了诸多用户的要求,更加实用了。那么用Visual C#如何调用Excel,如何又把数据存放到Excel表格中?本文就来探讨上述问题的解决办法。

  Excel对象

  微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我们简单介绍一下其中最重要,也是用得最多的四个对象。

  (1) Application对象。Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。

  (2) Workbook对象。Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。

  (3) Worksheet对象。Worksheet对象包含于Workbook对象,表示一个Excel工作表。

  (4) Range对象。Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。

 C#中的受管代码和非受管代码

  在.net公用语言框架内运行的程序为受管代码。受管代码在程序中所有类型都受到严格检查,没有指针,对内存的管理完全由运行系统控制。受控状态下,编写程序更为容易,且更少出错,我们可以花更多的时间在解决实际问题上而不是在计算机语言问题上。相对而言,那些在.NET框架外运行的程序为非受管代码。比如:COM组件、ActiveX组件、Win32 API函数、指针运算等。C#编程中在某些特定情况下,需要运用非受管代码,例如,要利用一个成熟的COM组件,或者调用一个API函数,或者用指针去编写实时/高效程序等。

  Visual C#中调用Excel的COM组件

  一个.NET组件事实上是一个.NET下的DLL,它包含的不仅是运行程序本身,更重要的是包含这个DLL的描述信息(Meta Data,即元数据),而一个COM组件是用其类库(TLB)储存其描述信息。这些COM组件都是非受管代码,要在Visual C#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的.NET组件。所以在用Visual C#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。

  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组件一起起作用。

  2、Visual C#打开Excel表格

  事实上,在C#中使用一个经转换的COM组件和使用任何一个其它.NET组件完全一样。可以用new关键字创建一个经转换的COM组件,然后再像使用任何一个其它C#对象一样使用这个组件对象。

  在转换后的.NET组件中定义了一个命名空间Excel,在此命名空间中封装了一个类Application,这个类和启动Excel表格有非常重要的关系,在Visual C#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:

Excel.Application excel = new Excel.Application ();//引用Excel对象
excel.Application.Workbooks.Add ( true );//引用Excel工作簿
excel.Visible = true ;//使Excel可视


  但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。

  3、往Excel表格中输入数据

  在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个单元格。通过给"Cell"赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。

Excel.Application excel = new Excel.Application () ;
excel.Application.Workbooks.Add ( true ) ;
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" ;
excel.Visible = true ;

 

 

 4、实例

  下面实例在C#中连接Oracle数据库(Name),从表(TableName)中读取数据,并写入Excel。

string cnString="Provider=msdaora.1;Data source=Name; ";
cnString=cnString+"user id=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 );}
}
}


  5、安装一个使用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+机制来处理事务的提交、回滚等。

  小结

  通过以上讨论,我们知道了在C#中,如何使用Excel的COM组件。需要注意的是,Excel对象包含的许多内容我们没有介绍,在使用过程中需要我们不断学习。也使我们了解了在C#中如何使用COM组件。

  参考文献:

  [1] 刘洪成 C#高级编程 清华大学出版社 2003.7工作 187~200
====================================================================================


 
 

前些日子,有很多朋友说需要C#导出到Excel的代码,现共享给大家

/// <summary>
  /// 读取Excel文档
  /// </summary>
  /// <param name="Path">文件名称</param>
  /// <returns>返回一个数据集</returns>
  public DataSet ExcelToDS(string Path)
  {
   string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
   OleDbConnection conn = new OleDbConnection(strConn);
   conn.Open(); 
   string strExcel = "";  
   OleDbDataAdapter myCommand = null;
   DataSet ds = null;
   strExcel="select * from [sheet1$]";
   myCommand = new OleDbDataAdapter(strExcel, strConn);
   ds = new DataSet();
   myCommand.Fill(ds,"table1");  
   return ds;
  }

/// <summary>
  /// 写入Excel文档
  /// </summary>
  /// <param name="Path">文件名称</param>
  public bool SaveFP2toExcel(string Path)
  {
   try
   {
    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
    OleDbConnection conn = new OleDbConnection(strConn);
    conn.Open(); 
    System.Data.OleDb.OleDbCommand cmd=new OleDbCommand ();
    cmd.Connection =conn;
    //cmd.CommandText ="UPDATE [sheet1$] SET 姓名='2005-01-01' WHERE 工号='日期'";
    //cmd.ExecuteNonQuery ();
    for(int i=0;i<fp2.Sheets [0].RowCount -1;i++)
    {
     if(fp2.Sheets [0].Cells[i,0].Text!="")
     {
      cmd.CommandText ="INSERT INTO [sheet1$] (工号,姓名,部门,职务,日期,时间) VALUES('"+fp2.Sheets [0].Cells[i,0].Text+ "','"+
       fp2.Sheets [0].Cells[i,1].Text+"','"+fp2.Sheets [0].Cells[i,2].Text+"','"+fp2.Sheets [0].Cells[i,3].Text+
       "','"+fp2.Sheets [0].Cells[i,4].Text+"','"+fp2.Sheets [0].Cells[i,5].Text+"')";
      cmd.ExecuteNonQuery ();
     }
    }
    conn.Close ();
    return true;
   }
   catch(System.Data.OleDb.OleDbException ex)
   {
    System.Diagnostics.Debug.WriteLine ("写入Excel发生错误:"+ex.Message );
   }
   return false;
  }

这种方法目前最有效,如果有不明白的地方可以来信交流

 




====================================================================================

首先将excel.exe copy 到 ../Microsoft Visual Studio .NET 2003/SDK/v1.1/Bin目录下
利用.net 中带的工具在命令提示符下执行tlbimp excel.exe.这样就不会因为你的Excel是xp或2000的不同要去找不同的*.olb文件,还有一点就是因为在2000以后的版本中没有了excel9.olb这个文件了。

通过执行tlbimp excel.exe后我们会得到excel.dll文件。

只要有了这个Excel.dll,现在我们就能使用Excel的各种操作函数了。
下面就让我们具体看看C#是如何使用这些东东吧。
1. 创建一个新Excel的Application:

Application exc = new Application();
if (exc == null) {
Console.WriteLine("ERROR: EXCEL couldn't be started");
return 0;
}

2. 让这个工程可见:
exc.set_Visible(0, true);
3. 获取WorkBooks集合:
Workbooks workbooks = exc.Workbooks;
4. 加入新的WorkBook:
_Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet, 0);
5. 获取WorkSheets集合:

_Worksheet worksheet = (_Worksheet) sheets.get_Item(1);
if (worksheet == null) {
Console.WriteLine ("ERROR in worksheet == null");
}
6. 给单元格设置变量:

 

Range range1  =  worksheet.get_Range( " C1 " ,Missing.Value);
if  (range1  ==   null
{
Console.WriteLine (
"ERROR: range == null");
}

const   int  nCells  =   1 ;
Object[] args1 
=   new  Object[ 1 ];
args1[
0 =  nCells;
range1.GetType().InvokeMember(
" Value " ,BindingFlags.SetProperty,  null , range1, args1);

 

例程:

 

using  System;
using  System.Reflection; 
using  System.Runtime.InteropServices; 
using  Excel;
class  Excel  {
public static int Main() {
Application exc 
= new Application();
if (exc == null{
Console.WriteLine(
"ERROR: EXCEL couldn't be started!");
return 0;
}

exc.set_Visible(
0true); 
Workbooks workbooks 
= exc.Workbooks;
_Workbook workbook 
= workbooks.Add(XlWBATemplate.xlWBATWorksheet, 0); 
Sheets sheets 
= workbook.Worksheets;
_Worksheet worksheet 
= (_Worksheet) sheets.get_Item(1);
if (worksheet == null{
Console.WriteLine (
"ERROR: worksheet == null");
}

Range range1 
= worksheet.get_Range("C1", Missing.Value);
if (range1 == null{
Console.WriteLine (
"ERROR: range == null");
}

const int nCells = 1;
Object[] args1 
= new Object[1];
args1[
0= nCells;
range1.GetType().InvokeMember(
"Value", BindingFlags.SetProperty, null,range1, args1);
return 100;
}

}


现在我们来看看如何使用数组,他有些类似于设置单元格。仅仅需要的改变只是args2[0] = array2;

const   int  nCell  =   5 ;
Range range2 
=  worksheet.get_Range( " A1 " " E1 " );
int [] array2  =   new   int  [nCell];
for  ( int  i = 0 ; i  <  array2.GetLength( 0 ); i ++
{
array2[i] 
= i+1;
}

Object[] args2 
=   new  Object[ 1 ];
args2[
0 =  array2;
range2.GetType().InvokeMember(
" Value " , BindingFlags.SetProperty,  null , range2, args2);


  大家需要了解Tlbimp这个工具的使用啊:)这个东东很有用,可以将普通Win32程序移植到.Net下面来:)
如果操作的excel的格式很简单,就是一般的表的结构,那么其实操作EXCEL文件跟操作ACCESS数据库文件的方法几乎一样。
需要注意的地方就是,1、程序会把EXCLE表中的第一行记录作为列名;2、在使用EXCLE表的时候, 要在表名后面加上符号$

下面,我给你帖一段如何连接和读取EXCEL文件的代码吧:


 

DataSet ds  =   new  DataSet();
OleDbDataAdapter ad;


string  strDbPath  =   " ./code.xls " ;
string  strConn  =   " Provider=Microsoft.Jet.OleDb.4.0; Data Source= " + Server.MapPath(strDbPath) + " ; Extended Properties=Excel 8.0; " ;

OleDbConnection Conn 
=   new  OleDbConnection(strConn);

Conn.Open();

string  strSQL  =   " select * from [股票代码$] " ;


ad 
=   new  OleDbDataAdapter(strSQL, Conn);
ad.Fill(ds);

dg1.DataSource 
=  ds.Tables[ 0 ].DefaultView;   // dg1是一个DataGrid控件
dg1.DataBind();   // 将EXCLE中股票代码中的记录棒定到DataGrid控件上



如果是在asp.net 下使用的话,要记得在  <system.web>中添加<identity impersonate="true"/>
否则就会出现 “异常详细信息: System.UnauthorizedAccessException: 拒绝访问“。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "C" 是英文字母表中的第三个字母。它是一个常见字母,常用于拼写英语单词和形成各种语言的音节。在汉字中,"C" 通常用来表示音译外来词,如 "咖啡"(coffee)和 "巧克力"(chocolate)。此外,"C" 也是大量商品和品牌的首字母缩写,如 "Coca-Cola" 和 "Chanel"。 在计算机科学中,“C” 代表一种编程语言,它是世界上最常用的程序设计语言之一。由于其简洁性和灵活性,C 语言被广泛用于开发操作系统、应用程序和嵌入式系统。它是一种强类型、结构化的语言,可以直接与硬件进行交互,并提供了丰富的库函数和工具,方便开发人员进行编程。C 语言也有一些衍生语言,如 C++ 和 C#,它们在 C 语言的基础上增加了更多的功能和特性。 此外,"C" 还有其他多种含义和用途。在音乐中,"C" 是一个音符,代表中音 "do"。在化学中,"C" 是碳元素的化学符号,它是地球上最常见的化学元素之一。它在有机化学、生物化学和无机化学等多个领域都有重要的应用。此外,"C" 还可以表示摄氏温度单位和凯尔文温度的常数。 总之,"C" 是一个具有多重含义和不同用途的字母,它在字母表中的位置和在不同领域的应用都赋予了它多样的意义和重要性。 ### 回答2: c是字母表中的第三个字母,也是拉丁字母中的一员。在英语中,c的发音为/k/,是一个清爽有力的辅音音素。c通常与其他字母组合成不同的发音。例如,与a组合成ca的时候,c的发音变为/ka/,与h组合成ch的时候,c的发音变为/tʃ/。此外,c也可以与k互换使用,像cat和kat的发音是相同的。 在计算机科学领域,c也是一种非常重要的程序设计语言。由于它的效率和灵活性,c被广泛应用于操作系统、编译器、游戏开发等领域。c语言的语法简洁,易于学习和理解,但同时也要求程序员具备较高的细致观察和逻辑思维能力。 此外,c在化学中代表着“碳”元素。碳是地球上的生命之源,它是有机物的基础,也是生物体的组成部分。碳具有四个电子,因此可以与其他原子形成很多化合物。碳的化合物在生命过程中起着举足轻重的作用,比如糖类、脂类、蛋白质等都由碳组成。 总之,c作为字母、计算机语言和化学元素,都承载着重要的含义和作用。无论是语言、科学还是生命科学领域,c都是不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值