在.NET开发中,不管是web程序还是桌面软件(尤其是涉及数据库操作的MIS系统等),常常需操作Excel,如导出数据到Excel,读取Excel中数据到程序中等。总结起来,其操作不外乎创建、打开、读写、保存(后退出/释放),而其操作方法,则主要有:通过ADO.NET数据连接方式通过Excel对象模型“自动化”操作使用中间数据格式如文本文件,XML等间接操作Excel使用第三方控件(主要用于向Excel传输数据)等。

在开始讨论之前,先把相关的一些网上资源罗列一下,其中大部分来自MSDN:

MSDN: 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
http://support.microsoft.com/kb/306023/zh-cn

MSDN: 从 .NET 开发人员的角度理解 Excel 对象模型 
http://msdn.microsoft.com/zh-cn/library/aa168292(office.11).aspx

如何:使用 COM Interop 创建 Excel 电子表格(C# 编程指南)
http://msdn.microsoft.com/zh-cn/library/ms173186(VS.80).aspx

Office XP 主互操作程序集入门
http://msdn.microsoft.com/zh-cn/library/aa201322(office.11).aspx

如何通过 Visual C# 使 Excel 自动执行操作以使用数组来填充或获取某区域中的数据
http://support.microsoft.com/kb/302096/zh-cn

如何在 Microsoft Visual C# .NET 中实现 Microsoft Excel 自动化
http://support.microsoft.com/kb/302084/zh-cn

如何使用 Visual C# .NET 处理 Excel 事件
http://support.microsoft.com/kb/823981/zh-cn

C#中创建、打开、读取、写入、保存Excel的一般性代码
http://hi.baidu.com/zhaochenbo/blog/item/f6d70ff7bf32fa2a730eec39.html

如何使用 ASP.NET、ADO.NET 和 Visual C# .NET 查询和显示 Excel 数据
http://support.microsoft.com/kb/306572/zh-cn

在 Visual C#.NET 中使用 GetOleDbSchemaTable 从 Excel 如何: 检索元数据
http://support.microsoft.com/kb/318452/zh-cn

与 XML 一起使用 Visual Basic 和 ASP 生成 Excel 2003 工作簿
http://msdn.microsoft.com/zh-cn/library/aa203722(office.11).aspx

下面开始就各种方法逐步说明其具体的Excel操作过程:

1.通过ADO.NET数据库连接方式

Microsoft Jet 提供程序用于连接到 Excel 工作簿。在以下连接字符串中,Extended Properties 关键字设置 Excel 特定的属性。“HDR=Yes;”指示第一行中包含列名,而不是数据,“IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取。Excel 8.0 针对Excel2000及以上版本,Excel5.0 针对Excel97。

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""

注意,Extended Properties 所需的双引号必须还要加双引号。

使用ADO.NET打开、读取并关闭代码示例如下:

using System.Data.OleDb;
using System.Data; String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=c:/test.xls;" +
"Extended Properties=Excel 8.0;";
OleDbConnection objConn = new OleDbConnection(sConnectionString);
objConn.Open();
OleDbCommand objCmdSelect =new OleDbCommand("SELECT * FROM [sheet1]", objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;
DataSet objDataset1 = new DataSet();
//将Excel中数据填充到数据集
objAdapter1.Fill(objDataset1, "XLData");
objConn.Close();

从上面可以看出,使用ADO.NET可将Excel当作普通数据库,使用SQL语句来操作。

通过ADO.NET获取Excel文件的各Sheet名称,可使用元数据方式:

String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=c:/test.xls;" +
"Extended Properties=Excel 8.0;";
OleDbConnection cn = new OleDbConnection(sConnectionString);
cn.Open();
DataTable tb = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
foreach (DataRow row in tb.Rows)
{
//遍历弹出各Sheet的名称
MessageBox.Show(row["TABLE_NAME"]);
}

关于使用ADO.NET创建并写入Excel文件与普通数据库操作极为类似,参见以下代码:

String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=c:/test.xls;" +
"Extended Properties=Excel 8.0;";
OleDbConnection cn = new OleDbConnection(sConnectionString);
string sqlCreate = "CREATE TABLE TestSheet ([ID] INTEGER,[Username] VarChar,[UserPwd] VarChar)";
OleDbCommand cmd = new OleDbCommand(sqlCreate, cn);
//创建Excel文件:C:/test.xls
cn.Open();
//创建TestSheet工作表
cmd.ExecuteNonQuery();
//添加数据
cmd.CommandText = "INSERT INTO TestSheet VALUES(1,'elmer','password')";
cmd.ExecuteNonQuery();
//关闭连接
cn.Close();

关于SQL语句中用到的数据类型,请查看System.Data.OleDb.OleDbType 枚举。

至此,使用ADO.NET打开、创建、读取、写入、保存并退出已全部实现,总结起来,与数据库操作基本无异,很简单。这种方式的好处就是通用性强,将Excel中内容看作数据表,读取操作简单可靠,适合内容规范的Excel表格的数据读取。缺点是当Excel结构复杂,如含合并单元等时,无法正确读取,甚至出现不可预知的异常。

2.通过Excel对象模型的“自动化”操作

3.通过中间数据格式间接操作

4.使用第三方控件

C#操作Excel(创建、打开、读写、保存)几种方法的总结的更多相关文章

  1. 【转载】C# winform操作excel(打开、内嵌)

    本文转载自静待"花落<C# winform操作excel(打开.内嵌)>   说明:显示的excel是利用模板创建的 using System;using System.Coll ...

  2. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  3. Java 8创建Stream流的5种方法

    不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺 ...

  4. (转)C#调用默认浏览器打开网页的几种方法

    转载,原文地址:http://blog.csdn.net/testcs_dn/article/details/42246969 CSharp调用默认浏览器打开网页的几种方法 示例界面: 方法一:从注册 ...

  5. Openerp 中打开 URL 的三种 方法

    来自:http://shine-it.net/index.php/topic,8013.0.html 最近总结了,Openerp 中打开 URL 的三种 方法: 一.在form view 添加 < ...

  6. 使用express创建node服务器的两种方法及区别

    使用express创建node服务器有两种方法,如下所示: 方法一: var express = require('express'); var app = express(); app.listen ...

  7. 使用urllib2打开网页的三种方法(Python2)

    python2才有urllib2模块,python3把urllib和urllib2封装成了urllib模块 使用urllib2打开网页的三种方法 #coding:utf-8 import urllib ...

  8. ajax返回json在 IE下,提示打开或保存的解决方法

    Content-type要设置成 text/html 我是用的mvc jquery.form.js 提交的表单. 返回json响应数据. 结果在ie下提示打开或保存,查看保存的内容.就是我返回的jso ...

  9. Windows下自由创建.htaccess文件的N种方法

    .htaccess是apache的访问控制文件,apache中httpd.conf的选项配合此文件,完美实现了目录.站点的访问控 制,当然最多的还是rewrite功能,即URL重写,PHP中实现伪静态 ...

随机推荐

  1. vector实现(只能装入string)

    #include<iostream> #include<string> #include<memory> #include<utility> using ...

  2. 数据恢复软件extundelete介绍

    linux下文件系统一般由文件名.Inode.Block三部分组成.当一个用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它的inode,看该用户是否具有访问这个文件的权限.如果有, ...

  3. How to Pronounce the Word SOMETHING

    How to Pronounce the Word SOMETHING Share Tweet Share Something tells me you’re going to like this v ...

  4. The 2018 Nobel prizesThe Nobel prize for economics is awarded for work on the climate and economic growth

    The 2018 Nobel prizesThe Nobel prize for economics is awarded for work on the climate and economic g ...

  5. linux替换字符串的几种方法

    1. 基本替换:s/str1/str2/ 替换当前行第一个str1为str2:s/str1/str2/g 替换当前行所有str1为str2:n,$s/str1/str2/ 替换第 n 行开始到最后一行 ...

  6. Mysql 中json 相关函数的使用

    1.JSON_LENGTH: select content from test1 ["1","2","3","4",&q ...

  7. js ParseUrl

    js ParseUrl function parseURL(url) { var a = document.createElement('a'); a.href = url; return { sou ...

  8. win10磁盘碎片整理

    如果我们想要加快win10系统运行速度的话,就需要定期整理碎片才可以,减少卡顿,提高性能. 一:注意事项 固态硬盘用户千万不要使用‘磁盘碎片整理功能’,因为使用的技术不一样,使用window自带的该功 ...

  9. Bioconductor应用领域之基因芯片

    引用自https://mp.weixin.qq.com/s?__biz=MzU4NjU4ODQ2MQ==&mid=2247484662&idx=1&sn=194668553f9 ...

  10. 将2020年交期的PR回写出来了

    OUT_pr表中的交期为2020年和2019年,不应该 回写的PR却回写出来了 优化如下: