为什么在填写DataTable时OleDbDataAdapter会留下工件?

我写了一些应该为Excel文件中的每个WorkSheet获取DataTable的方法:

第一步是获取包含在.xlsx文件中的所有工作表的名称:

private static List<string> GetSheetNames(string filePath) { List<string> sheetNames = new List<string>(); DataTable dt = null; try { OleDbConnection connection = new OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + filePath + "';Extended Properties='Excel 12.0 Xml;HDR=YES;'"); connection.Open(); dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if (dt == null) { return null; } // Add the sheet name to the string array. foreach (DataRow row in dt.Rows) { sheetNames.Add(row["TABLE_NAME"].ToString()); } }catch(Exception ex) { MessageBox.Show(ex.Message); } return sheetNames; } 

第二步是读取每一张表并返回一个相应的DataTable

 private static DataTable ReadExcelSheet(string filePath,string sheetName) { DataTable table = new DataTable(); ValidateSheetName(ref sheetName); try { OleDbConnection connection; DataSet DtSet; OleDbDataAdapter cmd; connection = new OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + filePath + "';Extended Properties='Excel 12.0 Xml;HDR=YES;'"); cmd = new OleDbDataAdapter("select * from ["+sheetName+"]", connection); cmd.TableMappings.Add("Table", sheetName.Replace("$",string.Empty)); DtSet = new DataSet(); cmd.Fill(DtSet); table = DtSet.Tables[0]; connection.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return table; } 

这两个方法都是从最后一个返回List<DataTable>方法调用的:

 private static List<DataTable> ConvertExcelToTables(string filePath) { List<string> sheetNames = GetSheetNames(filePath); List<DataTable> tableList = new List<DataTable>(); foreach(string sheetName in sheetNames) { tableList.Add(ReadExcelSheet(filePath,sheetName)); } return tableList; } 

还有一个小帮手的方法应该是不相关的问题:

 private static void ValidateSheetName(ref string sheetName) { sheetName = sheetName.EndsWith("$") ? sheetName : sheetName + "$"; } 

如果我从示例文件中获取一张表,如下所示:

在这里输入图像说明

现在,无论是在debugging时查看DataTable ,还是将其作为DataGridViewDataSource DataGridView ,结果都显得有些不可思议:

在这里输入图像说明

我的猜测是,这可能与Excel工作表开始计数1而不是0.但即使是这种情况下,我真的不能想到一个解决scheme。 或者我错过了什么。 其实这是一个可惜,因为这似乎是一个干净的解决scheme伊莫。

不,问题是由…造成的

 HDR=YES; 

在你的连接string。 将其更改为

 HDR=NO; 

HDR=YES表示您的Excel工作表的第一行假定包含您的表的字段的名称。 但是,作为一个例子,并不是这种情况。 事实上,OleDb提供者不能确定第二列的名称(它是空白的),因此它分配了默认值(字母F后跟逐行的数字)

你可以在connectionstrings.com上find关于excel 连接字符的很多例子和解释