如何从给定的行开始从Excel中读取数据并获取正确的types推断

我使用这些连接string从.xls和.xlsx文件导入数据

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\file.xls;Extended Properties="Excel 8.0;HDR=YES;IMEX=0;MaxScanRows=16;Empty Text Mode=NullAsEmpty;" 

要么

 "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=0;MaxScanRows=16;Empty Text Mode=NullAsEmpty;" 

我加载数据表中的数据。

  Using connection As New OleDbConnection(connString) connection.Open() wsName = "myWorksheet$" Dim SQL As [String] = String.Format("SELECT {1} FROM [{0}]", wsName, "*") Dim da As New OleDbDataAdapter(SQL, connection) Dim ds As New DataSet da.Fill(ds) dtb = ds.Tables(0) End Using 

如果数据从Excel文件的第一行开始,我会得到正确的types字段。 不幸的是,一些excel文件(包括xls和xlsx格式)在实际数据之前可能会有几行标题和其他烦恼。 这可能会打乱Jet的采样结果在字段中键入为文本时,他们应该是数字。

看来,迫使喷气机从X线开始阅读是不可能的。

我也尝试使用DataReader推进到数据的开始,然后创buildDataTable

  dtb.Load(reader) 

但问题是一样的,字段types是基于第一个实际的行。

所以我要求提供关于如何获得DataTable的相关信息,从Excel文件的第x行开始的数据。

这是一条你已经开始的黑暗之路。 我最近一直在尝试几个选项,我最后去了ExcelDataReader 。 这是一个不错的.NET库,可以从.xls和.xlsx文件导入数据。 基本导入如下:

 IExcelDataReader excelReader = default(IExcelDataReader); using (System.IO.FileStream excelStream = new System.IO.FileStream(fileName, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.ReadWrite)) { if (System.IO.Path.GetExtension(fileName).ToLower() == ".xls") { excelReader = ExcelReaderFactory.CreateBinaryReader(excelStream); } else { excelReader = ExcelReaderFactory.CreateOpenXmlReader(excelStream); } excelReader.IsFirstRowAsColumnNames = true; } // Library doesn't throw proper exceptions, create our own if (excelReader.ExceptionMessage != string.Empty) { throw new ExcelReaderException(excelReader.ExceptionMessage, fileName); } DataSet excelPages = excelReader.AsDataSet(); 

我正在使用遗留代码,所以我仍然必须将导入转换为DataSet。 但是,如果有机会,可以使用Sheet,Page和Cell对象。 到目前为止我遇到的一个问题是,我没有find一个很好的解决方法,有时库会从电子表格中导入空白行(几次,几千次)。 我们目前的解决办法是在import后修剪那些。

对于OLEDB:我相信有一个registry更新可以做,设置OLEDB使用的预读行数,以确定列应设置的数据types。 这是一个糟糕的select,因为它必须在每台客户机上完成。 此外,还有其他问题,您最有可能与基于OLEDB的Excel导入命中。 我不记得这一切,但我们完全放弃它已经足够了。