使用Jet访问某些Excel工作表时出错

时间:2010-04-15 14:55:49

标签: excel oledb jet

我使用ASP.NET打开服务器上托管的Excel 2003文档。 excel电子表格由我控制之外的系统生成,有5个命名的工作表。我按如下方式访问每个工作表中的数据(为了便于阅读,添加了换行符):

string ExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\sample.xls;
    Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\";";

OleDbDataAdapter myData = 
    new OleDbDataAdapter("SELECT * FROM [mysheet]", ExcelConn);
myData.TableMappings.Add("Table", "mysheet");
myData.Fill(ExcelDS);

这适用于5张纸中的3张。另外两个抛出这个错误:

  

Microsoft Jet数据库引擎   找不到对象'mysheet'。   确保对象存在且存在   你拼写它的名字和路径名   正确。

我通过检查底部选项卡中的文本并检查在Excel中生成的字符串的结尾,对工作表名称进行了四重检查:

=CELL("filename")
c:\[sample.xls]mysheet

连接字符串指定一次,并重复使用所有5张。

我是否可能需要使用与Excel中可见的名称不匹配的字符串来引用工作表?也许隐藏的字符,空格等?有没有其他方法可以找到工作表的真实名称?有关检索此数据的任何其他建议吗?

注意:我无法修改Excel文档(如果可以的话,我会使用SSIS导入CSV。)

我正在使用.NET 3.5 / II6。

1 个答案:

答案 0 :(得分:1)

好吧,我找到了一种方法来揭示工作表的实际名称。

在问题中使用连接字符串,我可以这样做......

OleDbConnection conn = new OleDbConnection(ExcelConn);
conn.Open();
...
conn.Close();

打开连接后,我可以使用调试器来检索工作表名称。

conn.GetSchema("Tables").Rows[0]["TABLE_NAME"]
conn.GetSchema("Tables").Rows[1]["TABLE_NAME"]
...
conn.GetSchema("Tables").Rows[9]["TABLE_NAME"]

我发现Excel文档中有10个工作表名称。造成错误的2张纸张上贴有类似名称后固定为“$”。我认为我是支持噩梦,因为我愿意在向我发送之前打赌有人使用Excel文档 - 但至少我知道如何提取数据。