关闭

C#操作Excel

538人阅读 评论(0) 收藏 举报
分类:

有时,需要将软件中计算获得的数据导出保存到Excel,并支持将Excel中的数据导入到软件中,所以会利用C#操作Excel非常必要。

一、添加引用

       要想用C#操作Excel,首先需要保证导入了Excel类库,具体操作如下:

       解决方案选项卡下-->项目节点上右键-->添加引用-->.NET选项卡-->选择Microsoft.Office.Interop.Excel-->确定

二、接口类型

       有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎)。

       Jet 引擎可以访问 Office 97-2003,但不能访问 Office 2007。

       ACE 引擎是随 Office 2007 一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问 Office 97-2003。

另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。

Microsoft.ACE.OLEDB.12.0 安装文件:

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=7554f536-8c28-4598-9b72-ef94e038c891

        Excel 2003扩展名为.xls,Excel 2007扩展名为.xlsx

三、操作方法

读写Excel有两种方法:a)用OLEDB通过设置连接字符串像操作SqlServer一样读写Excel;

                                       b)类似操作数组一样操作Excel单元格

3.1 OLEDB方式

3.1.1 连接Excel字符串

     Jet引擎     String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + ExcelPath + ";Extended Properties=Excel 8.0;HDR=Yes;IMEX=1";

     ACE引擎  String sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + ExcelPath + ";Extended Properties=Excel 12.0;HDR=Yes;IMEX=1";

     其中Extended Properties 关键字设置 Excel 特定的属性,Excel 8.0 针对Excel2000、2003,Excel12.0针对Excel2007、2010;Data Source对应给出的ExcelPath为要连接的Excel表格的全路径;“HDR=Yes;”指示第一行中包含列名,而不是数据,缺省值为Yes;“IMEX=1;”通知驱动程序始终将互混数据列作为文本读取。

3.1.2 连接Excel重要对象

3.1.3 实例

下面为一个简单的Excel操作类,可以作为一个工具类,在需要用OLEDB方法操作Excel时调用。(只是简单版,可扩充完善)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.IO;

namespace Flow_Cytometry
{
    public class ExcelOperating
    {
        OleDbConnection conn = null;
        OleDbCommand cmd = null;
        OleDbDataReader odr = null;
        public ExcelOperating(string ExcelPath)
        {
            String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + ExcelPath + ";Extended Properties=Excel 8.0;";//此处用的Excel2003
            conn = new OleDbConnection(sConnectionString);
            cmd = new OleDbCommand();
        }

        private OleDbConnection GetConn()//获取连接Excel对象,如果当前为未连接状态,这改为连接状态
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            return conn;
        }


        public DataTable ExecuteQuery(string cmdText)//通过Sql语句cmdText,读取Excel中数据
        {
            DataTable dt = new DataTable();
            cmd.Connection = GetConn();
            cmd.CommandText = cmdText;    
            using (odr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(odr);
            }
            return dt;
        }


        public int ExcecuteNonQuery(string cmdText)//操作Excel,如创建、更改、插入、删除等
        {

            cmd.Connection = GetConn();
            cmd.CommandText = cmdText;    
            return cmd.ExecuteNonQuery();
        }


        public void ConnClose()//关闭连接,在最后不再操作Excel时或关闭软件时调用
        {
            conn.Close();
        }
    }
}

前些日子作一些数据项目的时候 在ADO.NET 中处理 ExecuteNonQuery()方法时,总是通过判断其返回值是否大于0来判断操作时候成功 。但是实际上并不是这样的,好在处理的数据操作多时 修改, 插入, 删除,否则的话问题就有点打了,都是些基础的知识,但是很重要个人觉得有必要记下来。

     ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete  语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1,对于这种更新操作 用我们平时所用的是否大于0的判断操作应该没有问题而且比较好,但是对于其他的操作如对数据库结构的操作,如果操作成功时返回的却是-1,这种情况跟我们平时的思维方式有点差距所以应该好好的注意了,例如对数据库共添加一个数据表的Create操作,当创建数据表成功时返回-1,如果操作失败的话(如数据表已经存在)往往会发生异常,所以执行这种操作时最好用try--catch--语句来容错。

  例如用ExecuteNonQuery()方法执行create操作

   

    SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=PSDB;Integrated Security=SSPI");
        
   string str = "CREATE TABLE aaa ( " +
  "[ID] [int] IDENTITY (1, 1) NOT NULL , " +
  "[BasicID] [int] NULL ," +
  "[AdoptedName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
  "[AdoptedSex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ," +
  "[AdoptBirthday] [smalldatetime] NULL ," +
  "[AdoptedType] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ," +
  "[ApprTime] [smalldatetime] NULL ," +
  "[Remark] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL " +
") ON [PRIMARY]   ";     

  SqlCommand comm = new SqlCommand(str, conn);
        int i = 10;
        try
        {
            conn.Open();
            i = comm.ExecuteNonQuery();
            conn.Close();
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }

        Response.Write(i.ToString());

       如果执行成功的话 返回的值为-1,如果数据表已经存在的话返回异常:数据库中已存在名为 'aaa' 的对象。



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:741356次
    • 积分:7701
    • 等级:
    • 排名:第2918名
    • 原创:44篇
    • 转载:423篇
    • 译文:2篇
    • 评论:57条
    最新评论