我写了一些方法,这是为了获取在一个Excel文件中的每个工作表的DataTable:为什么OleDbDataAdapter在填充DataTable时会留下工件?
步骤1是让所有表的名称中包含一个.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;
}
步骤2是读取每片,并返回一个根据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;
}
这两种方法从这个LA称为ST方法返回一个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 + "$";
}
如果我从一个例子一个表文件,它看起来像这样:
现在不管,如果我只看到DataTable
在调试时,或者如果我绑定它作为一个DataGridView
结果的DataSource
看起来有点怪异:
我的猜测是,这可能与Excel表格开始与计数做1不是0。但即使是这样的情况下,我无法真正想到一个解决方案。或者我错过了什么。其实这是一个遗憾,因为这似乎是一个干净的解决方案imo。
这确实解决了问题。也许你想提供一些关于这个参数实际上代表什么的信息?顺便说一句,列标题仍然被命名为F1,F2 ..这不是一个大问题,但仍然不完美^^ – 2014-11-05 09:40:10
不值得另一篇文章。如果所有单元格都是空的,并且包含信息的第一个单元格是B7,它将位于我的数据表单的单元格(0,0)中。有没有办法避免这种情况? – 2014-11-05 09:50:08
通常情况下,您的工作表是从A1延伸到最后一个有效行/单元格的表格。用所有的空行和列。除非您在Excel工作表中定义一个范围,然后在您的OleDb命令中使用[RangeName]语法中的SELECT * – Steve 2014-11-05 10:00:04