使用OLEDB可以对excel文件进行读取,我们只要把该excel文件作为数据源即可。

一 在D盘创建excel文件test.xls:

  

二 将工作表Sheet1的内容读取到DataSet   string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+       "Extended Properties='Excel 8.0'";   DataSet ds = new DataSet();   OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);   oada.Fill(ds);

读取的DataSet为:

  

从图中可以看出excel文件中的第一行变成了DataSet中的列名,这正是系统的默认设置。

三 如果想把第一行也作为数据行,那我们可以给连接字符串添加一个HDR=No属性如:   string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+       "Extended Properties='Excel 8.0;HDR=No'";   DataSet ds = new DataSet();   OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);   oada.Fill(ds);   结果也许会让你有点想不到:

  

第一行的第一列和第三列都变成空的了,这是因为系统把第一列识别成了数字,把第三列识别成了日期,

而第一行的数据不符合格式的要求,所以就变成空的了。

四 我们还可以把所有列都做为字符串来读取,只要添加属性IMEX=1即可

  string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+       "Extended Properties='Excel 8.0;HDR=No;IMEX=1'";   DataSet ds = new DataSet();   OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);   oada.Fill(ds);   结果又会如何呢?

  

是不是再次出乎你的意料,第三行的日期怎么变成数字了,其实excel在转换格式的时候就自动把日期变成数字了,

那这个数字是怎么来的呢 ? 如果你把日期改成1900年1月1日,那么你可以看到他的转换结果是1,以此类推,39902是哪一天就明白了吧。

这里解决办法:

方法一:   public static string getDateStr(string strValue)       {           int i = Convert.ToInt32(strValue);           DateTime d1 = Convert.ToDateTime("1900-1-1");           DateTime d2 = d1.AddDays(i - 2);           string strTemp = d2.ToString("d");
          return strTemp;       }   方法二:   DateTime.FromOADate(Convert.ToInt32(strValue)).ToString("d");

五 也许你并不想读取整个excel的内容

如果只想读取前两列可以用:select * from [Sheet1$A:B]

如果只想读取A1到B2的内容,就用:select * from [Sheet1$A1:B2]

六 如果不知道工作表的名字或名字被人为修改了该怎么办呢?

我们可以通过索引来获取指定工作表的名字,以下方法可以用来获取工作表名称的数组:

  ArrayList al = new ArrayList();   string strConn;   strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+       "Extended Properties=Excel 8.0;";   OleDbConnection conn = new OleDbConnection(strConn);   conn.Open();   DataTable sheetNames = conn.GetOleDbSchemaTable       (OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });   conn.Close();   foreach (DataRow dr in sheetNames.Rows)   {       al.Add(dr[2]);   }   return al;

IMEX=1的时候并不是全都会作为字符串来处理,根据系统的默认设置,通常如果前8行有字符串,则该列会作为字符串来处理,如果全都为数字,则该列为数字列,日期也是一样。

如果你觉得8行不够或者太多了,则只能修改注册表HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows,如果此值为0,则会根据所有行来判断使用什么类型,通常不建议这麽做,除非你的数据量确实比较少。

无法读取EXCEL中的数据单元格。有数据,但是读出来全是空值。

解决方法:

1.在导入数据连接字符串中,将IMEX=1加入,“Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:\Data.xls";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1; ”,这样就可以。

注:

“HDR=Yes;”指示第一行中包含列名,而不是数据;

“IMEX=1;”通知驱动程

序始终将“互混”数据列作为文本读取。

两者必须一起使用。

本以为这样就OK了。但在实际使用过程中,这样设置还是不行,查阅了不少资料才发现,原来还有一个注册表里的信息需要修改,这样带能让excel不再使用前8行的内容来确定该列的类型。

注册表修改内容如下:

在HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Excel有一个TypeGuessRows值,预设是8,表示会先读取前8列来决定每一个栏位的型态,所以如果前8列的资料都是数字,到了第9列以后出现的文字资料都会变成null,所以如果要解决这个问题,只要把TypeGuessRows机码值改成0,就可以解这个问题了。

(转)ASP.NET(C#) 读取EXCEL ——另加解决日期问题的更多相关文章

  1. ASP.NET(C#) 读取EXCEL ——另加解决日期问题

    转载:http://www.cnblogs.com/diony/archive/2011/09/08/2171133.html 使用OLEDB可以对excel文件进行读取,我们只要把该excel文件作 ...

  2. asp.net本地读取excel正确。但在iis服务器上就报错 未在本地计算机上注册“Microsoft.ACE.OleDb.12.0”提供程序

    本地vs2010可以上传ecxel文件.并读取数据,但部署到本地IIS.并访问.则提示: 未在本地计算机上注册“Microsoft.ACE.OleDb.12.0”提供程序 首先:确保安装了Micros ...

  3. 通过jxl 读取excel 文件中的日期,并计算时间间隔

    java读取excel里面的日期会出现相差8小时的问题. 比如excel里面有一个日期是:2012-7-2 17:14:03秒,用Cell cell=readSheet.getCell(colNo, ...

  4. java读取excel或者csv时日期格式数据处理

    背景:最近写一个通过excel批量导入数据的功能,里面含有时间,但是java读取之后把时间转为了距离1990年1月1号的天数,比如excel中时间为2018/9/16 18:30,java读取之后变成 ...

  5. ASP.NET中读取excel内容并显示

    项目中经常会用到把excel的文件内容导入到数据库中的,刚刚花了点时间,做了个例子,基本上能实现导入Excel后显示的功能吧,导入的excel文件得是xls,即是2003的.     代码思路如下:要 ...

  6. C# 读取Excel 单元格是日期格式

    原文地址:https://www.cnblogs.com/liu-xia/p/5230768.html DateTime.FromOADate(double.Parse(range.Value2.To ...

  7. js/ts/tsx读取excel表格中的日期格式转换

    const formatDate = (timestamp: number) => { const time = new Date((timestamp - 1) * 24 * 3600000 ...

  8. asp.net读取excel文件多种方法

    asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取.   方法一:采用OleDB读取Excel文件 把Excel文件 ...

  9. ASP.NET中上传并读取Excel文件数据

    在CSDN中,经常有人问如何打开Excel数据库文件.本文通过一个简单的例子,实现读取Excel数据文件. 首先,创建一个Web应用程序项目,在Web页中添加一个DataGrid控件.一个文件控件和一 ...

随机推荐

  1. Selenium Grid Configuration

    Start Hub and Node with Json config 1. Start Hub with json config file title HubWebDriver java -jar ...

  2. Java GC系列(4):垃圾回收监视和分析

    本文由 ImportNew - lomoxy 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这个Java GC系列教程中,让我们学习 ...

  3. http协议分析工具【转】

    转自:http://www.cnblogs.com/klguang/p/4624333.html

  4. hdu----(1671)Phone List(Trie带标签)

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. #ifdef __cplusplus extern "C"

    #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #endif首先,__cplusplus是cp ...

  6. 自定义Encoder/Decoder进行对象传递

    转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...

  7. Linux CC攻击脚本

    CC(ChallengeCollapsar)主要是用来攻击页面的.大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库 ...

  8. 二分图 最大权匹配 km算法

    这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...

  9. 统计类别数量并且使用pyplot画出柱状图

    从数据库中读取数据,具体操作为: # -*- coding: utf-8 -*- from numpy import * import numpy as np import pandas as pd ...

  10. oracle之to_char,to_date用法

    [转载自]http://www.jb51.net/article/45591.htm 这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星 ...