Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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# 将Excel文件读入DataTable会返回DataRows中的空字段_C#_Excel_Datatable_Datarow - Fatal编程技术网

C# 将Excel文件读入DataTable会返回DataRows中的空字段

C# 将Excel文件读入DataTable会返回DataRows中的空字段,c#,excel,datatable,datarow,C#,Excel,Datatable,Datarow,我将一个excel文件导入一个DataTable,然后从每个后续的DataRow中获取所需的信息,然后将这些信息插入到列表中。 我有一个方法,当我需要将Excel(.xlsx或.xls)文件导入数据表时,我会调用它,并且在我的程序中的其他6或7个位置使用它,所以我非常确定那里没有任何错误 我的问题是,当我访问一个数据行时,在这个特定的数据表上,前几个字段包含值,但其他所有字段都是空的。 如果我在Locals窗口中查看它,我可以看到DataRow如下所示: [0] {"Some string va

我将一个excel文件导入一个DataTable,然后从每个后续的DataRow中获取所需的信息,然后将这些信息插入到列表中。 我有一个方法,当我需要将Excel(.xlsx或.xls)文件导入数据表时,我会调用它,并且在我的程序中的其他6或7个位置使用它,所以我非常确定那里没有任何错误

我的问题是,当我访问一个数据行时,在这个特定的数据表上,前几个字段包含值,但其他所有字段都是空的。 如果我在Locals窗口中查看它,我可以看到DataRow如下所示:

[0] {"Some string value"}
[1] {}
[2] {}
[3] {}
[0] {"Some string value"}
[1] {"Another string value"}
[2] {"Foo"}
[3] {"Bar"}
当它看起来像这样时:

[0] {"Some string value"}
[1] {}
[2] {}
[3] {}
[0] {"Some string value"}
[1] {"Another string value"}
[2] {"Foo"}
[3] {"Bar"}
以下是处理导入的方法:

public List<DataTable> ImportExcel(string FileName)
        {
            List<DataTable> _dataTables = new List<DataTable>();
            string _ConnectionString = string.Empty;
            string _Extension = Path.GetExtension(FileName);
            //Checking for the extentions, if XLS connect using Jet OleDB
            if (_Extension.Equals(".xls", StringComparison.CurrentCultureIgnoreCase))
            {
                _ConnectionString =
                    "Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0";
            }
            //Use ACE OleDb
            else if (_Extension.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase))
            {
                _ConnectionString =
                    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0";
            }

            DataTable dataTable = null;
            var count = 0;
            using (OleDbConnection oleDbConnection =
                new OleDbConnection(string.Format(_ConnectionString, FileName)))
            {
                oleDbConnection.Open();
                //Getting the meta data information.
                //This DataTable will return the details of Sheets in the Excel File.
                DataTable dbSchema = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables_Info, null);
                foreach (DataRow item in dbSchema.Rows)
                {
                    //reading data from excel to Data Table
                    using (OleDbCommand oleDbCommand = new OleDbCommand())
                    {
                        oleDbCommand.Connection = oleDbConnection;
                        oleDbCommand.CommandText = string.Format("SELECT * FROM [{0}]",
                            item["TABLE_NAME"].ToString());

                        using (OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter())
                        {
                                if (count < 3)
                                {
                                    oleDbDataAdapter.SelectCommand = oleDbCommand;
                                    dataTable = new DataTable(item["TABLE_NAME"].ToString());
                                    oleDbDataAdapter.Fill(dataTable);
                                    _dataTables.Add(dataTable);
                                    count++;
                                }
                        }
                    }
                }
            }
            return _dataTables;
        }
公共列表导入cel(字符串文件名)
{
列表_dataTables=新列表();
string _ConnectionString=string.Empty;
字符串_Extension=Path.GetExtension(文件名);
//如果XLS使用Jet OleDB连接,则检查扩展
if(_Extension.Equals(“.xls”,StringComparison.CurrentCultureIgnoreCase))
{
_连接字符串=
“Provider=Microsoft.Jet.OLEDB.4.0;数据源={0};扩展属性=Excel8.0”;
}
//使用ACE OleDb
else if(_Extension.Equals(“.xlsx”,StringComparison.CurrentCultureIgnoreCase))
{
_连接字符串=
“Provider=Microsoft.ACE.OLEDB.12.0;数据源={0};扩展属性=Excel8.0”;
}
DataTable=null;
var计数=0;
使用(OLEDB连接OLEDB连接=
新的OLEDB连接(string.Format(_ConnectionString,FileName)))
{
oleDbConnection.Open();
//获取元数据信息。
//此数据表将在Excel文件中返回图纸的详细信息。
DataTable dbSchema=oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables_Info,null);
foreach(dbSchema.Rows中的数据行项)
{
//将数据从excel读取到数据表
使用(OLEDBCOMAND OLEDBCOMAND=新OLEDBCOMAND())
{
oleDbCommand.Connection=oleDbConnection;
oleDbCommand.CommandText=string.Format(“从[{0}]中选择*”,
项[“表名称”].ToString());
使用(OleDbDataAdapter OleDbDataAdapter=新OleDbDataAdapter())
{
如果(计数<3)
{
oleDbDataAdapter.SelectCommand=oleDbCommand;
dataTable=新的dataTable(项[“TABLE_NAME”].ToString());
oleDbDataAdapter.Fill(数据表);
_dataTables.Add(dataTable);
计数++;
}
}
}
}
}
返回数据表;
}

有什么想法吗?

您可能需要添加
;IMEX=1
到连接字符串中的“扩展属性”。但归根结底,用OleDb读取excel文件充其量也很脆弱。您应该使用第三方库来处理这些问题,如:

XLS的NPOI


EPPlus for XLSX

证明故障出在excel文档上。 显然,excel文档有一个名为共享字符串的隐藏表。 因为这个表,我找不到我要找的值