2013-04-03 66 views
4

我读使用C#这样读取Excel文件(.xlsx)格式文件

string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + 
          ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\";"; 

var output = new DataSet(); 

using (var conn = new OleDbConnection(strConn)) 
{ 
    conn.Open(); 

    var dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 

    foreach (DataRow row in dt.Rows) 
    { 
     string sheet = row["TABLE_NAME"].ToString(); 

     var cmd = new OleDbCommand("SELECT * FROM [+"+sheet+"+]", conn); 
     cmd.CommandType = CommandType.Text; 

     OleDbDataAdapter xlAdapter = new OleDbDataAdapter(cmd); 

     xlAdapter.Fill(output,"School"); 
    } 
} 

.xlsx文件但我在xlAdapter.Fill收到错误(输出, “学校”); 错误是

The Microsoft Office Access database engine could not find the object '+_xlnm.Print_Area+'. Make sure the object exists and that you spell its name and the path name correctly. 

我无法弄清楚,什么是错的代码中发生的事情。

+0

什么是您的excel文件的版本? – Alex

+0

是否有这样做的理由?你不能用一些现有的库来阅读'* .xlsx'文件吗? – harry180

+0

@voo它是excel 2007文件。 –

回答

3

我相信您的工作表被命名为_xlnm.Print_Area。 尝试改变这一行

var cmd = new OleDbCommand("SELECT * FROM [+"+sheet+"+]", conn); 

var cmd = new OleDbCommand("SELECT * FROM ["+sheet+"]", conn); 
0

变量sheet包含值:+_xlnm.Print_Area+

+_xlnm.Print_Area+并不实际存在。

这就是为什么错误来了。

检查该对象。

+0

从哪里可以看到此对象? –

+0

看到,在你的数据库'xlnm.Print_Area'这个特定的表或对象是否存在?如果没有[这绝对不是]从这个值来的地方[通过调试器]。 – Freelancer

+0

row [“TABLE_NAME”]。ToString()给出的表名为xlnm.Print_Area,但我知道为什么它给了这个。 –

0

我会检查你在row["TABLE_NAME"].ToString();值。或者,您可以尝试OpenXML SDK:How to: Parse and read a large spreadsheet document (Open XML SDK)

+0

row [“TABLE_NAME”]。ToString()给出的表名称为xlnm.Print_Area,但我不知道它为什么给出这个。 –

+0

您是否尝试过从Excel清除源文档中的打印区域?1.单击要清除打印区域的工作表上的任意位置。 2.在页面布局选项卡的页面设置组中,单击清除打印区域。 – jle

0

当您在表中定义打印区域“_xlnm.Print_Area”自动加入您的新表。请删除excel表格的打印区域表格或使用以下代码

if (!dr["TABLE_NAME"].ToString().Contains("_xlnm#Print_Area")) 
{  
    obj.SheetName = dr["TABLE_NAME"].ToString(); 
    lst.Add(obj); 
}