Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用c读取Excel中的数据列标题和每个单元格的数据_C#_Excel_C# 4.0_Excel 2007 - Fatal编程技术网

C# 如何使用c读取Excel中的数据列标题和每个单元格的数据

C# 如何使用c读取Excel中的数据列标题和每个单元格的数据,c#,excel,c#-4.0,excel-2007,C#,Excel,C# 4.0,Excel 2007,我有一张类似以下内容的excel表格: 我想读取数据列标题:All、col1、col2、col3、col4、col5 并获取所有单元格数据。例如,行=2和列2=0中的单元格 我目前正在编写以下代码: OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT top 5 * FROM " + excelSheets[j], connString); DataTable fooData = new DataTable(); dbAdapter

我有一张类似以下内容的excel表格:

我想读取数据列标题:All、col1、col2、col3、col4、col5

并获取所有单元格数据。例如,行=2和列2=0中的单元格

我目前正在编写以下代码:

OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT top 5 * FROM " + excelSheets[j], connString);
DataTable fooData = new DataTable();
dbAdapter.Fill(fooData);
foreach (DataRow row in fooData.Rows)
{
    Response.Write(row[0].ToString());
    //Response.Write(row[1].ToString());
}
但它只返回一个包含1列和1..5行文本的数据表

我怎么能做到

请在不使用Linq to Excel提供程序的情况下说出答案并打开Xml

编辑1:

string file_name = "C:\\Book1.xlsx";
        string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_name + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"";
        objConn = new OleDbConnection(connString);
        objConn.Open();
        dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

        if (dt == null)
        {
            Response.Write("Not Exist");
        }

        String[] excelSheets = new String[dt.Rows.Count];
        int i = 0;

        foreach (DataRow row in dt.Rows)
        {
            excelSheets[i] = row["TABLE_NAME"].ToString();
            i++;
        }

        // Loop through all of the sheets if you want too...
        for (int j = 0; j < excelSheets.Length; j++)
        {
            OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT top 100 * FROM " + excelSheets[j], connString);
            DataTable fooData = new DataTable();
            dbAdapter.Fill(fooData);
            foreach (DataRow row in fooData.Rows)
            {
                Response.Write(row[0].ToString());
            }

        }

例如,可以通过fooData.Columns[0]获取第一列的列名。ColumnName-请参阅

编辑:

将SELECT更改为SELECT*FROM,并使用Fill 0,5,newdatatable[]{fooData}


试试这个。它应该返回A1到C5的所有单元格。

您选择的驱动程序用于连接字符串中的Excel 2007 Provider=Microsoft.ACE.OLEDB.12.0。您的Excel文件是2007还是2010?

仅用于逻辑的数据列标题如下:

                 string filePath = "C:\\Book1.xlsx";
                string connString = string.Empty;
                if (path.EndsWith(".xlsx"))
                {
                    //2007 Format
                    connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No'", path);
                }
                else
                {
                    //2003 Format
                    connString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No'", path);
                }
                using (OleDbConnection con = new OleDbConnection(connString))
                {
                    using (OleDbCommand cmd = new OleDbCommand())
                    {
                        //Read the First Sheet
                        cmd.Connection = con;
                        con.Open();
                        DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        con.Close();
                        string firstSheet = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();

                        //Read the Header Row
                        cmd.CommandText = "SELECT top 1 * From [" + firstSheet + "]";
                        using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
                        {
                            DataTable HeaderColumns = new DataTable();
                            da.SelectCommand = cmd;
                            da.Fill(HeaderColumns);
                            List<string> Filedata = new List<string>();
                            foreach (DataColumn column in HeaderColumns.Columns)
                            {
                                string columnName = HeaderColumns.Rows[0][column.ColumnName].ToString();


                                Filedata.Add(columnName);

                                ViewBag.Data = Filedata;
                            }
                        }
                    }
                }

如果改用SELECT*FROM,会发生什么情况?它返回的行数超过100000行,我知道-但你得到的是列标题吗?不幸的是,我的数据表只有一列,我不知道是什么,不需要更改SELECT-请参阅下面的答案,在我的示例中,它只返回一列。所有执行fooData时会发生什么。列[1].ColumnName?出现异常:找不到第1列。请查看我的编辑-这样您就不会加载所有行,只加载前5行。。。并且应该得到所有列。。。然后您可以通过fooData.Columns[1].ColumnName…@Yahia让我们了解以下错误:Microsoft Office access数据库引擎找不到对象“Nima$A1:C5”。确保对象存在,并且正确拼写其名称和路径名。尝试将IMEX=1附加到ConnectionString。如果缺少转义序列,您可以在网站上找到更多详细信息。尝试更改此选项:OleDbDataAdapter dbAdapter=新OleDbDataAdapter从+excelSheets[j]中选择前100*connString;到OleDbDataAdapter dbAdapter=新OleDbDataAdapter从[+excelSheets[j]+]中选择前100*,connString;
                 string filePath = "C:\\Book1.xlsx";
                string connString = string.Empty;
                if (path.EndsWith(".xlsx"))
                {
                    //2007 Format
                    connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No'", path);
                }
                else
                {
                    //2003 Format
                    connString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No'", path);
                }
                using (OleDbConnection con = new OleDbConnection(connString))
                {
                    using (OleDbCommand cmd = new OleDbCommand())
                    {
                        //Read the First Sheet
                        cmd.Connection = con;
                        con.Open();
                        DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        con.Close();
                        string firstSheet = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();

                        //Read the Header Row
                        cmd.CommandText = "SELECT top 1 * From [" + firstSheet + "]";
                        using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
                        {
                            DataTable HeaderColumns = new DataTable();
                            da.SelectCommand = cmd;
                            da.Fill(HeaderColumns);
                            List<string> Filedata = new List<string>();
                            foreach (DataColumn column in HeaderColumns.Columns)
                            {
                                string columnName = HeaderColumns.Rows[0][column.ColumnName].ToString();


                                Filedata.Add(columnName);

                                ViewBag.Data = Filedata;
                            }
                        }
                    }
                }