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数据的完整性。
我新建一个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、修改电话字段后,读不出"电话")
我将上面的记录的第一条复制为两条,结果如下:
别名 姓名 公司 地址 电话 部门
别名 姓名 公司 地址 电话 部门
测试别名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..........
.
.
.
你所说的第一行记录是不是第一行的列信息还是内容第一行?
在EXCEL表格定义的话,一定要表的定义
列名1 列名2 列名3..........
内容1 内容2 内容3..........
.
.
.
你所说的第一行记录是不是第一行的列信息还是内容第一行?
#7
to;gj121(男儿当自强)
明白,俺首先获得概念上的突破。
我所说的"第一条记录"是说整个excel文档的第一行。
现在问题是:如果用户没有excel表的定义,我如何做?有除开使用select语句之外的方法吗?
(不引入com组件)
明白,俺首先获得概念上的突破。
我所说的"第一条记录"是说整个excel文档的第一行。
现在问题是:如果用户没有excel表的定义,我如何做?有除开使用select语句之外的方法吗?
(不引入com组件)
#8
其实你所说的第一行就是它的列,你可以通过下面方法取得
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
ds.Tables[0].Columns[i].ColumnName;
}
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
ds.Tables[0].Columns[i].ColumnName;
}
#9
问题就在这里啊:ds里根本就没有
别名 姓名 公司 地址 电话 部门
的集合
除非excel里写2次:
别名 姓名 公司 地址 电话 部门
别名 姓名 公司 地址 电话 部门
别名 姓名 公司 地址 电话 部门
的集合
除非excel里写2次:
别名 姓名 公司 地址 电话 部门
别名 姓名 公司 地址 电话 部门
#10
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
System.Console.WriteLine(ds.Tables[0].Columns[i].ColumnName.ToString());
}
我可以的啊!
{
System.Console.WriteLine(ds.Tables[0].Columns[i].ColumnName.ToString());
}
我可以的啊!
#11
1、读不到第一条记录
>>试用ado.net对excel文件,第一行默认为字段名,这没什么办法,如果你想获得字段名,那么ds.Tables[0].Columns[i].ColumnName取得
2、修改电话字段后,读不出"电话"
>>这跟数据类型有关系,当数据中有些是字符串、有些是数字的时候就会出现这个问题,我曾经花过至少一天的时间期望总结出一定的规律和解决办法,不果;最后所有单元格都最为字符串来处理---在每个单元格的值前加个单引号...
>>试用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;表示混合的数据类型转换为文本类型。
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数据的完整性。
我新建一个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、修改电话字段后,读不出"电话")
我将上面的记录的第一条复制为两条,结果如下:
别名 姓名 公司 地址 电话 部门
别名 姓名 公司 地址 电话 部门
测试别名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..........
.
.
.
你所说的第一行记录是不是第一行的列信息还是内容第一行?
在EXCEL表格定义的话,一定要表的定义
列名1 列名2 列名3..........
内容1 内容2 内容3..........
.
.
.
你所说的第一行记录是不是第一行的列信息还是内容第一行?
#7
to;gj121(男儿当自强)
明白,俺首先获得概念上的突破。
我所说的"第一条记录"是说整个excel文档的第一行。
现在问题是:如果用户没有excel表的定义,我如何做?有除开使用select语句之外的方法吗?
(不引入com组件)
明白,俺首先获得概念上的突破。
我所说的"第一条记录"是说整个excel文档的第一行。
现在问题是:如果用户没有excel表的定义,我如何做?有除开使用select语句之外的方法吗?
(不引入com组件)
#8
其实你所说的第一行就是它的列,你可以通过下面方法取得
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
ds.Tables[0].Columns[i].ColumnName;
}
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
ds.Tables[0].Columns[i].ColumnName;
}
#9
问题就在这里啊:ds里根本就没有
别名 姓名 公司 地址 电话 部门
的集合
除非excel里写2次:
别名 姓名 公司 地址 电话 部门
别名 姓名 公司 地址 电话 部门
别名 姓名 公司 地址 电话 部门
的集合
除非excel里写2次:
别名 姓名 公司 地址 电话 部门
别名 姓名 公司 地址 电话 部门
#10
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
System.Console.WriteLine(ds.Tables[0].Columns[i].ColumnName.ToString());
}
我可以的啊!
{
System.Console.WriteLine(ds.Tables[0].Columns[i].ColumnName.ToString());
}
我可以的啊!
#11
1、读不到第一条记录
>>试用ado.net对excel文件,第一行默认为字段名,这没什么办法,如果你想获得字段名,那么ds.Tables[0].Columns[i].ColumnName取得
2、修改电话字段后,读不出"电话"
>>这跟数据类型有关系,当数据中有些是字符串、有些是数字的时候就会出现这个问题,我曾经花过至少一天的时间期望总结出一定的规律和解决办法,不果;最后所有单元格都最为字符串来处理---在每个单元格的值前加个单引号...
>>试用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;表示混合的数据类型转换为文本类型。
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
多谢多谢,受益匪浅