阅读excel(.xlsx)文件在C#

我正在阅读使用c#的.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"); } } 

但我在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. 

我无法弄清楚代码中发生了什么错误。

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

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

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

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

这个+_xlnm.Print_Area+实际上不存在。

这就是为什么错误来临。

检查该对象。

我会检查你row["TABLE_NAME"].ToString(); 值。 或者,您可以尝试OpenXML SDK: 如何parsing和读取大型电子表格文档(Open XML SDK)

当您在工作表中定义打印区域时,“_xlnm.Print_Area”将自动添加到新工作表中。 请删除Excel表格的打印区域或使用下面的代码

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