如何得到excel表格的第一条记录?使用OleDB

时间:2021-11-18 00:27:42
我访问excel文件的代码如下:
string strConn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0"; 
OleDbConnection conn = new OleDbConnection(strConn);
DataSet ds = new DataSet();
try
{
conn.Open();

//得到Excel文档的第一个sheet名
System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null); 
string tableName=schemaTable.Rows[0][2].ToString().Trim(); 

OleDbDataAdapter adp = new OleDbDataAdapter("SELECT * FROM [" + tableName + "]" ,conn);
adp.Fill(ds,"Book1");
}
catch(Exception eOleExl)
{
//do sth
         }
这样得到的dataset不包含excel第一条记录,请问如何得到第一条记录。
我曾希望在conn.GetOleDbSchemaTable 返回的datatable中找到,但也没有结果。

15 个解决方案

#1


mark

#2


你的Excel的表内容是怎么定义的啊!
列的内容写了吗?

#3


我并没有特别定义表内容,
我新建一个excel文档后输入以下数据用于测试:
别名  姓名     公司          地址          电话          部门
测试别名1 测试姓名一    测试公司一 测试地址一 测试电话一 测试部门一
测试别名二测试姓名二    测试公司二 测试地址二 测试电话二 测试部门二
然后保存,读入的dataset中没有第一行的记录,我需要第一行的记录判断用户excel数据的完整性。

#4


旧的不去,新的又来:
我将上面的记录的第一条复制为两条,结果如下:
别名  姓名     公司          地址          电话          部门
别名  姓名     公司          地址          电话          部门
测试别名1 测试姓名一    测试公司一 测试地址一 测试电话一 测试部门一
测试别名二测试姓名二    测试公司二 测试地址二 测试电话二 测试部门二
这时dataset中包含第二到第四条记录。
在我将电话字段:测试电话一、测试电话二分别改为13547598932、13325698548后保存。
重新读取到dataset文件中,这时"电话"读不出来了,dataset中为null,以下是调试模式下的command窗口输出:
ds.Tables[0].Rows[0].ItemArray
{Length=0x6}
    [0x0]: "别名"
    [0x1]: "姓名"
    [0x2]: "公司"
    [0x3]: "地址"
    [0x4]: {System.DBNull}
    [0x5]: "部门"
ds.Tables[0].Rows[1].ItemArray
{Length=0x6}
    [0x0]: "测试别名一"
    [0x1]: "测试姓名一"
    [0x2]: "测试公司一"
    [0x3]: "测试地址一"
    [0x4]: {13325698548.0}
    [0x5]: "测试部门一"
这两个问题如何解决?(1、读不到第一条记录2、修改电话字段后,读不出"电话")

#5


问题搞不定阿~~~
自己顶一下

#6


兄弟有一点要跟你强调一下,如果你要用Select语句的话
在EXCEL表格定义的话,一定要表的定义
列名1 列名2 列名3..........
内容1 内容2 内容3..........
.
.
.
你所说的第一行记录是不是第一行的列信息还是内容第一行?

#7


to;gj121(男儿当自强)
明白,俺首先获得概念上的突破。

我所说的"第一条记录"是说整个excel文档的第一行。

现在问题是:如果用户没有excel表的定义,我如何做?有除开使用select语句之外的方法吗?
(不引入com组件)

#8


其实你所说的第一行就是它的列,你可以通过下面方法取得
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
  ds.Tables[0].Columns[i].ColumnName;
}

#9


问题就在这里啊:ds里根本就没有
别名  姓名     公司          地址          电话          部门
的集合
除非excel里写2次:
别名  姓名     公司          地址          电话          部门
别名  姓名     公司          地址          电话          部门

#10


for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
  System.Console.WriteLine(ds.Tables[0].Columns[i].ColumnName.ToString());
}
我可以的啊!

#11


1、读不到第一条记录
>>试用ado.net对excel文件,第一行默认为字段名,这没什么办法,如果你想获得字段名,那么ds.Tables[0].Columns[i].ColumnName取得

2、修改电话字段后,读不出"电话"
>>这跟数据类型有关系,当数据中有些是字符串、有些是数字的时候就会出现这个问题,我曾经花过至少一天的时间期望总结出一定的规律和解决办法,不果;最后所有单元格都最为字符串来处理---在每个单元格的值前加个单引号...

#12


是的啊!楼上兄弟说的对啊!列名名称都要在前面加一个单引号,表示为字符型

#13


两个问题其实是同一个问题,只要把连接字符串修改就可以解决:
string strConn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + filepath + ";Extended Properties="+"\""+"Excel 8.0;HDR=NO;IMEX=1;"+"\""; 
其中:
HDR=YES;Excel第一行为列标题,
HDR=NO;Excel第一行为数据,此时列名变成"F1,F2,F3..."
IMEX=1;表示混合的数据类型转换为文本类型。

#14


lijipan(多空)是对的,以前还没想过要在连接字符串上设置~ 也学了一招

#15


多谢多谢,受益匪浅

#1


mark

#2


你的Excel的表内容是怎么定义的啊!
列的内容写了吗?

#3


我并没有特别定义表内容,
我新建一个excel文档后输入以下数据用于测试:
别名  姓名     公司          地址          电话          部门
测试别名1 测试姓名一    测试公司一 测试地址一 测试电话一 测试部门一
测试别名二测试姓名二    测试公司二 测试地址二 测试电话二 测试部门二
然后保存,读入的dataset中没有第一行的记录,我需要第一行的记录判断用户excel数据的完整性。

#4


旧的不去,新的又来:
我将上面的记录的第一条复制为两条,结果如下:
别名  姓名     公司          地址          电话          部门
别名  姓名     公司          地址          电话          部门
测试别名1 测试姓名一    测试公司一 测试地址一 测试电话一 测试部门一
测试别名二测试姓名二    测试公司二 测试地址二 测试电话二 测试部门二
这时dataset中包含第二到第四条记录。
在我将电话字段:测试电话一、测试电话二分别改为13547598932、13325698548后保存。
重新读取到dataset文件中,这时"电话"读不出来了,dataset中为null,以下是调试模式下的command窗口输出:
ds.Tables[0].Rows[0].ItemArray
{Length=0x6}
    [0x0]: "别名"
    [0x1]: "姓名"
    [0x2]: "公司"
    [0x3]: "地址"
    [0x4]: {System.DBNull}
    [0x5]: "部门"
ds.Tables[0].Rows[1].ItemArray
{Length=0x6}
    [0x0]: "测试别名一"
    [0x1]: "测试姓名一"
    [0x2]: "测试公司一"
    [0x3]: "测试地址一"
    [0x4]: {13325698548.0}
    [0x5]: "测试部门一"
这两个问题如何解决?(1、读不到第一条记录2、修改电话字段后,读不出"电话")

#5


问题搞不定阿~~~
自己顶一下

#6


兄弟有一点要跟你强调一下,如果你要用Select语句的话
在EXCEL表格定义的话,一定要表的定义
列名1 列名2 列名3..........
内容1 内容2 内容3..........
.
.
.
你所说的第一行记录是不是第一行的列信息还是内容第一行?

#7


to;gj121(男儿当自强)
明白,俺首先获得概念上的突破。

我所说的"第一条记录"是说整个excel文档的第一行。

现在问题是:如果用户没有excel表的定义,我如何做?有除开使用select语句之外的方法吗?
(不引入com组件)

#8


其实你所说的第一行就是它的列,你可以通过下面方法取得
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
  ds.Tables[0].Columns[i].ColumnName;
}

#9


问题就在这里啊:ds里根本就没有
别名  姓名     公司          地址          电话          部门
的集合
除非excel里写2次:
别名  姓名     公司          地址          电话          部门
别名  姓名     公司          地址          电话          部门

#10


for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
  System.Console.WriteLine(ds.Tables[0].Columns[i].ColumnName.ToString());
}
我可以的啊!

#11


1、读不到第一条记录
>>试用ado.net对excel文件,第一行默认为字段名,这没什么办法,如果你想获得字段名,那么ds.Tables[0].Columns[i].ColumnName取得

2、修改电话字段后,读不出"电话"
>>这跟数据类型有关系,当数据中有些是字符串、有些是数字的时候就会出现这个问题,我曾经花过至少一天的时间期望总结出一定的规律和解决办法,不果;最后所有单元格都最为字符串来处理---在每个单元格的值前加个单引号...

#12


是的啊!楼上兄弟说的对啊!列名名称都要在前面加一个单引号,表示为字符型

#13


两个问题其实是同一个问题,只要把连接字符串修改就可以解决:
string strConn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + filepath + ";Extended Properties="+"\""+"Excel 8.0;HDR=NO;IMEX=1;"+"\""; 
其中:
HDR=YES;Excel第一行为列标题,
HDR=NO;Excel第一行为数据,此时列名变成"F1,F2,F3..."
IMEX=1;表示混合的数据类型转换为文本类型。

#14


lijipan(多空)是对的,以前还没想过要在连接字符串上设置~ 也学了一招

#15


多谢多谢,受益匪浅