ASP.NET(C#) 读取EXCEL另加解决日期问题的方法分享

使用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,就可以解这个问题了。

(0)

相关推荐

  • asp.net下日期加减的方法

    一个日期加上或减去一个值 (比如年份): DateTime newDate = DateTime.Now.AddYears(2);    //加 DateTime newDate = DateTime.Now.AddYears(-2);   //减 两个日期相减 DateTime   date1   =   new   DateTime(2007,7,15);    DateTime   date2 =   DateTime.Now;    TimeSpan   ts   =   date2 -

  • asp.net 2个日期之间的整月数的算法

    今天,有个网友提问: c# 算出整月 问题补充: 我是说两个日期之间间隔整月,比如2008-11-5 和 2009-4-3之间的整月,结果是12,1,2,3这四个月 算法的代码很简单,主要是思路问题. 复制代码 代码如下: DateTime dt1 = 日期1; DateTime dt2 = 日期2; int 整月数 = (dt2.Year - dt1.Year) * 12 + (dt2.Month - 1) - dt1.Month;

  • 基于ASP.NET实现日期转为大写的汉字

    这篇文章主要介绍的是利用ASP.NET将日期格式转为大写汉字,比如: "2013年12月3日" 转换成 "贰零壹叁年拾贰月叁日",下面一起来看看怎么实现. 一样话不多说,直接上代码 //年份转换为大写汉字 public static string numtoUpper(int num) { return "零壹贰叁肆伍陆柒捌玖"[num].ToString(); } //月份转换大写汉字 public static string monthtoU

  • ASP.NET如何获取两个日期之间的天数

    复制代码 代码如下: DateTime startdate=DateTime.Parse("2013-11-01"); DateTime enddate = DateTime.Parse("2013-11-11"); int d = enddate.Subtract(startdate).Days; 定义开始时间startdate 结束时间enddate 使用方法Subtract得到两个时间差

  • 基于Asp.net与Javascript控制的日期控件

    控件效果如下: 从左到右:month,day,year .cs文件初始化这三个下拉列表 复制代码 代码如下: private void BindBirthDay(int day, int month, int year) { int dayNow = day; int monNow = month; int yearNow = year; //binding Month for (int i = 1; i <= 12; i++) { ddlBirMon.Items.Add(new ListIte

  • Asp.net 时间操作基类(支持短日期,长日期,时间差)

    复制代码 代码如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; nam

  • ASP.NET Calendar日历(日期)控件使用方法

    Calendar 控件显示一个日历,用户可通过该日历导航到任意一年的任意一天.当 ASP.NET 网页运行时,Calendar 控件以 HTML 表格的形式呈现.因此,该控件的许多属性与多种不同的表格格式相符.在这些属性中,有几个在一些低版本的浏览器中不能得到完全支持,因此在这些浏览器中并不能使用所有的格式功能. 使用 Calendar 控件在网页上显示日历的单个月.该控件使您可以选择日期并移到下个月或上个月.Calendar 控件支持 System.Globalization 命名空间中的所有

  • asp.net下定制日期输出格式的代码

    以前用日期作为字符串时,我这么写: string sDate = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() 其实,只要下面一句就可以了 ^o^

  • asp.net 日期函数 某月的第一天和最后一天的日期

    #region 得到一个月的第一天和最后一天的日期 /// <summary> /// 得到本月的第一天日期 /// </summary> /// <returns>DateTime</returns> public static DateTime GetFirstDayOfMonth() { return GetFirstDayOfMonth(DateTime.Now); } /// <summary> /// 得到本月的最有一天的日期 ///

  • asp.net 时间类 一周的周一和周末的日期

    好多时候,数据库查询统计时需要使用本周统计 这里又不想把计算的任务交给数据去做 于是自己写个小函数,得到本周的周一和周末的时间,数据库比较的时候只需要 between ... and 就可以了 代码如下: #region 得到一周的周一和周日的日期 /// <summary> /// 计算本周的周一日期 /// </summary> /// <returns></returns> public static DateTime GetMondayDate()

随机推荐