C#操作Excel

原创 2015年07月08日 18:12:16

有时,需要将软件中计算获得的数据导出保存到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' 的对象。



版权声明:本文为博主原创文章,未经博主允许不得转载。

C#项目中操作Excel文件——使用NPOI库

实际C#项目中经常会涉及到需要对本地Excel文件进行操作,特别是一些包含数据记录、分析、汇总功能模块的项目。常用的操作Excel文件的方法主要有三个: 1. OleDb: 这种方式是把整个Exc...
  • dcrmg
  • dcrmg
  • 2016年08月29日 20:23
  • 16281

C#操作Excel总结

0. 导入命名空间:  1 2 3 4 using Microsoft.Office.Core; using Microsoft.Office....
  • weizhiai12
  • weizhiai12
  • 2015年08月28日 20:34
  • 2802

C#学习之操作excel表格

-------------------自己的实践方案          今天开始学习C#使用Excel。          首先,要先添加引用:   若发现没有这个项,可以重新安装office,我...
  • HK_5788
  • HK_5788
  • 2015年10月18日 01:21
  • 3299

操作EXCEL代码(c#完全版)

using System;     using System.Collections;     using Excel=Microsoft.Office.Interop.Excel;    ...
  • my98800
  • my98800
  • 2016年11月08日 09:26
  • 1047

C#(源码)操作Excel大全1

C#对excel的操作
  • u011981242
  • u011981242
  • 2015年09月24日 10:35
  • 360

C#操作excel(多种方法比较)

我们在做excel资料的时候,通常有以下方法。 一.导入导出excel常用方法: 1.用查询表的方式查询并show在数据集控件上。 public static string st...
  • u012543266
  • u012543266
  • 2014年03月26日 21:30
  • 1554

C#中操作Excel(4)—— 向Excel中插入两种图表以及设置图表格式

引言         本文主要讨论下向Excel中插入图表的两种方式。在Excel中图表是有两种级别的,一种是和sheet同级别的图表,也就是说整个excel的标签页就是一个图表;还有一种就是我们最...
  • lzhui1987
  • lzhui1987
  • 2016年11月18日 11:41
  • 2844

C#中操作Excel(3)—— Excel中操作文本、图片和批注

一 引言        本文主要介绍向Excel中插入文本和图片的方法。相信大家对Excel的模型对象都有了一定的了解,和Word相似,Excel中插入文本和图片也需要依靠Range对象。但是与Wor...
  • lzhui1987
  • lzhui1987
  • 2016年11月17日 11:35
  • 1584

C#操作Excel的OLEDB方式与COM方式比较

在对Excel进行读写操作时,使用微软自身提供的解决方案,有两种,分别是OLEDB方式和调用COM组件的方式 1. OLEDB方式 用这种方法读取Excel速度相对调用COM组件来讲是非常的快的,...
  • sundacheng1989
  • sundacheng1989
  • 2013年03月14日 15:45
  • 5020

C#操作Excel文件(读取Excel,写入Excel)

C#操作Excel文件(读取Excel,写入Excel)        2009-01-09 10:25157690人阅读评论(59)收藏举报 excelc#datasetexceptions...
  • kirawoo
  • kirawoo
  • 2015年06月17日 20:30
  • 4891
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#操作Excel
举报原因:
原因补充:

(最多只允许输入30个字)