【问题标题】:Error accessing certain Excel sheets with Jet使用 Jet 访问某些 Excel 工作表时出错
【发布时间】:2010-04-15 14:55:49
【问题描述】:

我正在使用 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。

【问题讨论】:

    标签: excel oledb jet


    【解决方案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 文档发送给我之前玩过它——但至少我知道如何提取数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多