读取Excel文件的类库

原文地址:http://www.cnblogs.com/fatway/archive/2008/12/02/1345499.html

/*
 * 操作Excel文件类
 * 目前功能列表:
 *     1、读取Excel文件,返回一个DataSet
 *     2、读取Excel文件,返回其工作表ArrayList
 * by Lee 2008/11/27 11:51:56
 * Copyright © 7thSpace
 *
 */

using System;
using System.Data;
using System.Data.OleDb;
using System.Collections;

namespace LEE.OperateExcelFile
{
    public class OperateExcel
    {
        /// <summary>
        /// 读取Excel文档中的Sheet1工作表
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns>返回DataSet数据集</returns>
        public DataSet GetExcelToDataSet(string path)
        {
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=Excel 8.0;";
            new OleDbConnection(connectionString).Open();
            string selectCommandText = "";
            OleDbDataAdapter adapter = null;
            DataSet dataSet = null;
            selectCommandText = "select * from [sheet1$]";
            adapter = new OleDbDataAdapter(selectCommandText, connectionString);
            dataSet = new DataSet();
            adapter.Fill(dataSet, "table1");
            return dataSet;
        }

        /// <summary>
        /// 读取Excel文档中指定的工作表
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <param name="tablename">工作表名</param>
        /// <returns>返回DataSet数据集</returns>
        public DataSet GetExcelToDataSet(string path, string tablename)
        {
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=Excel 8.0;";
            new OleDbConnection(connectionString).Open();
            OleDbDataAdapter adapter = null;
            DataSet dataSet = null;
            adapter = new OleDbDataAdapter("select * from [" + tablename + "]", connectionString);
            dataSet = new DataSet();
            adapter.Fill(dataSet, tablename);
            return dataSet;
        }

        /// <summary>
        /// 获取Excel文档中的所有工作表清单
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns>返回ArrayList</returns>
        public ArrayList GetExcelSheet(string path)
        {
            ArrayList tableName = new ArrayList();
            using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data     Source=" + path))
            {
                conn.Open();
                DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                for(int i=0; i<dt.Rows.Count; i++)
                {
                    tableName.Add(dt.Rows[i][2].ToString());
                }
            }
            return tableName;
        }
    }
}

2008/12/03 17:50:44


刚才看到“晓风残月”写的《ADO.NET如何读取Excel》,http://www.cnblogs.com/Jinglecat/archive/2006/08/15/477472.html


里面更深入的讲了读取表格时的其它问题


摘录过来了:


复制代码
如何引用表名?
对 Excel 工作簿中表(或范围)的有效引用。
若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如:


select * from [Sheet1$]
若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如:


select * from [Sheet1$A1:B10]
若要引用指定的范围,请使用该范围的名称。例如:


select * from [MyNamedRange]
ref:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp
说明:
可以引用Excel 工作簿中的三种对象:
• 整张工作表:[Sheet1$]  ,Sheet1 就是工作表的名称
• 工作表上的命名单元格区域:[MyNamedRange] (不需要指定工作表,因为整个xls中命名区域只能唯一)
XLS命名方法:选中单元格范围》插入》名称》定义
• 工作表上的未命名单元格区域 :[Sheet1$A1:B10]
(在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)


注意:
•必须使用[](方括号),否将报:
FROM 子句语法错误
•必须跟$(美元符号),否则报:
Microsoft Jet 数据库引擎找不到对象'Sheet2'。请确定对象是否存在,并正确地写出它的名称和路径。
•如果工作表名称不对,或者不存在,将报:
'Sheet2$' 不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。
•在 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据   中提到可以使用
~  和 '(波浪线和单引号)代替[],使用ADO。NET测试没有成功,报:
FROM 子句语法错误
•当引用工作表明名([Sheet1$])时,数据提供程序认为数据表从指定工作表上最左上方的非空单元格开始。比如,工作表从第 3 行,C 列开始,第3行,C列之前以及第1、2行全为空,则只会显示从第3行,C列开始的数据;以最后表最大范围内的非空单元结束;
•因此,如需要精确读取范围,应该使用命名区域 [NamedRange],或者指定地址:[Sheet1$A1:C10]


4。如何引用列名?
•根据默认连接字符串中,数据提供程序会将有效区域内的第一行作为列名,如果此行某单元格为空则用F1、F2表示,其中序数,跟单元格的位置一致,从1开始;
•如果希望第一行作为数据显示,而非列名,可以在连接串的 Extended Properties 属性指定:HDR=NO
默认值为:HDR=NO (应该为 HDR=YES,即默认将第一行作为列名,竟然一直没有发现这个错误,汗upadted 2007年8月18日)格式如下:


        string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                        "Extended Properties=\"Excel 8.0;HDR=NO\";" +
                        "data source=" + xlsPath;
注意: Excel 8.0;HDR=NO  需要使用双引号(这里的反斜扛,是C#中的转义)


ref:ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/WD_ADONET/html/745c5f95-2f02-4674-b378-6d51a7ec2490.htm 中 《连接Excel》节(说明:在我自己的MSDN中,它的例子使用了两个双引号是错的,测试没有通过,原文这样说的:


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



在这种情况下,所有的列名都是以F开头,然后跟索引,从F1开始,F2,F3。。。。。。。


5。为什么有效单元格数据不显示出来?
出现这种情况的可能原因是,默认连接中,数据提供程序根据前面单元格推断后续单元个的数据类型。
可以通过 Extended Properties 中指定 IMEX=1


“IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取
ref:同4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值