手机版

ASP NET(C#)阅读EXCEL和分享解决日期问题的方法

时间:2021-11-14 来源:互联网 编辑:宝哥软件园 浏览:

Excel文件可以使用OLEDB读取,我们只需要将excel文件作为数据源。在磁盘d上创建excel文件test . xls :

要将第二个工作表Sheet1的内容读取到DataSet中,请按如下方式复制代码: string strconn=' provider=Microsoft . jet . oledb . 4.0;数据源=d :/test . xls;'扩展属性=“Excel 8.0”;数据集ds=新数据集();OleDbDataAdapter oada=new OleDbDataAdapter('从[Sheet1$]中选择* ',strcon n);oada。填充(ds);读取的数据集为:

从图中可以看出,excel文件中的第一行变成了DataSet中的列名,这是系统的默认设置。第三,如果我们想使用第一行作为数据线,我们可以给连接字符串添加一个HDR=No属性,比如:复制代码如下: String strconn=' provider=Microsoft。jet . oledb . 4.0;数据源=d :/test . xls;'扩展属性=' Excel 8.0HDR=否“”;数据集ds=新数据集();OleDbDataAdapter oada=new OleDbDataAdapter('从[Sheet1$]中选择* ',strcon n);oada。填充(ds);结果你可能想不到:

第一行的第一列和第三列变为空,因为系统将第一列识别为数字,第三列识别为日期,第一行的数据不符合格式要求,所以变为空。第四,我们还可以将所有列作为字符串读取,并且可以通过添加属性IMEX=1来复制代码。代码如下: String strconn=' provider=Microsoft。jet . oledb . 4.0;数据源=d :/test . xls;'扩展属性=' Excel 8.0HDR=不;IMEX=1“”;数据集ds=新数据集();OleDbDataAdapter oada=new OleDbDataAdapter('从[Sheet1$]中选择* ',strcon n);oada。填充(ds);会发生什么?

你又惊讶了吗?第三行的日期是怎么变成数字的?事实上,excel在转换格式时会自动将日期更改为数字。这个数字是怎么来的?如果把日期改为1900年1月1日,那么可以看到它的换算结果是1,以此类推,可以看到哪一天是39902。这里的解决方案:方法一:复制代码如下:公共静态字符串getdatestr(string strvalue){ int I=convert . toint 32(strvalue);日期时间d1=转换。today time(' 1900-1-1 ');DateTime d2=d1。AddDays(I-2);字符串strTemp=d2。ToString(' d ');返回strTemp}方法2:复制代码如下: datetime . from adate(convert . toint 32(str value))。tostring(' d ');也许你不想阅读整个excel内容。如果您只想阅读前两列,可以使用:从[Sheet1$A:B]中选择*。如果您只想阅读从A1到B2的内容,请使用:从[第1页$ A13360b2]中选择*。不知道工作表名称被人为修改了怎么办?我们可以通过索引获取指定工作表的名称,可以用下面的方法获取工作表名称的数组:复制代码如下: ArrayList al=new ArrayList();字符串strConnstrConn='Provider=Microsoft。Jet . OLEDB.4.0数据源=d :/test . xls;'扩展属性=Excel 8.0';oledb connection conn=new oledb connection(STrconn);conn . Open();DataTable sheet names=conn . GetOleDbSchemaTable(OleDbSchemaGuid。Tables,new object[] { null,null,null,' TABLE ' });conn . Close();sheetNames中的foreach (DataRow dr)。行){ al。add(dr[2]);}返回al;当IMEX=1时,不是所有的都将被视为字符串。根据系统默认设置,如果前8行有字符串,该列将被视为字符串。如果都是数字,这个列就是数字列,日期也是一样的。如果觉得8行不够或者太多,只能修改注册表HKEY _ local _ machine/software/Microsoft/jet/4.0/engines/excel/typeguessrows。如果这个值是0,你会根据所有的行来判断使用什么类型,除非你有少量的数据,否则通常不建议使用。无法读取EXCEL中的数据单元格。有数据,但是读的时候都是空的。解决方法:1。将IMEX=1添加到导入的数据连接字符串中。数据源=' C: \ Data.xls扩展属性=' Excel 8.0HDR=是;IMEX=1;“,所以你可以。注:“HDR=是;指示第一行包含列名而不是数据IMEX=1;告诉驱动程序始终将“混合”数据列作为文本读取。两者必须一起使用。我觉得还行。但是在实际使用过程中,这个设置还是行不通。查阅大量数据后发现注册表中还有需要修改的信息,这使得excel不再使用前8行的内容来确定该列的类型。注册表修改如下:HKEY _ local _ machine \ software \ Microsoft \ jet \ 4.0 \ engines \ excel中有一个TypeGuessRows值,默认值为8,这意味着将首先读取前8行来确定每个字段的类型。因此,如果前8行的数据都是数字,那么出现在第9行之后的文本数据就会变成null,所以如果要解决这个问题,就需要。

版权声明:ASP NET(C#)阅读EXCEL和分享解决日期问题的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。