为什么在填写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
,还是将其作为DataGridView
的DataSource
DataGridView
,结果都显得有些不可思议:
我的猜测是,这可能与Excel工作表开始计数1而不是0.但即使是这种情况下,我真的不能想到一个解决scheme。 或者我错过了什么。 其实这是一个可惜,因为这似乎是一个干净的解决scheme伊莫。
不,问题是由…造成的
HDR=YES;
在你的连接string。 将其更改为
HDR=NO;
HDR=YES
表示您的Excel工作表的第一行假定包含您的表的字段的名称。 但是,作为一个例子,并不是这种情况。 事实上,OleDb提供者不能确定第二列的名称(它是空白的),因此它分配了默认值(字母F
后跟逐行的数字)
你可以在connectionstrings.com上find关于excel 连接字符的很多例子和解释