C# 在c中读取excel(.xlsx)文件#

C# 在c中读取excel(.xlsx)文件#,c#,excel,xlsx,C#,Excel,Xlsx,我正在用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(s

我正在用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(输出,“School”)中遇到错误; 错误是

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.

我无法找出代码中发生了什么错误。

变量
工作表
包含值:
+\u xlnm.Print\u Area+

这个
+\u xlnm.Print\u区域+
实际上并不存在

这就是为什么会发生错误


检查该对象。

我会检查您在
行[“TABLE_NAME”]中得到的内容。ToString()值。或者,您可以尝试OpenXMLSDK:

我相信您的工作表名为
\uxlnm.Print\uArea
。 试着换一行

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


在工作表中定义打印区域时,“打印区域”自动添加到新工作表中。请从excel表格中删除打印区域或使用以下代码

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

您的excel文件的版本是什么?是否有这样做的原因?您不能使用一些现有库来读取
*.xlsx
文件吗?@voo它是excel 2007文件。从哪里可以看到这个对象?看到了吗,在您的数据库“xlnm.Print\u区域”中,这个特定的表或对象是否存在?如果不是,则[这绝对不是]通过调试器从何处输入此值。行[“TABLE_NAME”]。ToString()将表名命名为xlnm.Print_Area,但我不知道它为什么会这样。行[“TABLE_NAME”]。ToString()正在将表名命名为xlnm.Print_Area,但我不知道为什么会这样。是否尝试从Excel中清除源文档中的打印区域?1.单击工作表上要清除打印区域的任意位置。2.在“页面布局”选项卡上的“页面设置”组中,单击“清除打印区域”。
if (!dr["TABLE_NAME"].ToString().Contains("_xlnm#Print_Area"))
{    
   obj.SheetName = dr["TABLE_NAME"].ToString();
   lst.Add(obj);
}