代码之家  ›  专栏  ›  技术社区  ›  Mayo

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

  •  0
  • Mayo  · 技术社区  · 14 年前

    我正在使用ASP.NET打开服务器上托管的Excel2003文档。由我控制之外的系统生成的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文档(如果我可以用自己的方式导入csv,我会使用ssis)。

    我用的是.NET 3.5/II6。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Mayo    14 年前

    嗯,我找到了一种方法来揭开这张纸的实际名称。

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

    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个工作表名称。导致错误的两张纸有相似的名称,用“$”固定。我想我是在做一个支持噩梦,因为我愿意打赌有人在发送给我之前玩过Excel文档-但至少我知道如何提取数据。