0

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

4

1 回答 1

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

于 2010-04-15T15:48:19.597 回答