我使用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。
答案 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文档 - 但至少我知道如何提取数据。