假设我有一个Excel文件包含一个工作表,在这个工作表中有2个表,一个用于员工,包含字段[empID,empName,title],另一个表用于包含字段[deptId,deptName]的部门。
我想知道如何从该Excel文件中读取数据并在数据表中加载两个表,一个用于emplyee
,另一个用于department
。
我搜索并发现在使用Excel进行oleDb连接后,我可以通过“select * from [sheet $]”查询表单,但在我的情况下,表单包含两个结构不同的表。
我正在使用VS2010 C#开发Windows应用程序。
答案 0 :(得分:1)
首先,制作SheetSelectionForm。然后将这些代码放在表单上,并调用PopulateSheetsOfExcelFile(excelFilePath)
方法。此表单将显示Excel工作表的名称,您可以选择要从Excel中读取的工作表。
正如您所说,这些表具有不同的结构,因此您需要为每张Excel制作不同的DataTable。
还有另一种方法可以使用DataAdapter读取整个Excel。使用我的方法,您可以创建自定义DataTable,并通过提供excel列/行索引来填充它。
using System.Data.OleDb;
private void SelectItem()
{
ExcelSheetName = excelSheetsListBox.SelectedItem != null ?
excelSheetsListBox.SelectedItem.ToString() : string.Empty;
Close();
}
private void PopulateSheetsOfExcelFile(string excelFilePath)
{
try
{
String connString = string.Empty;
try
{
connString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;\"", excelFilePath);
using (OleDbConnection objConn = new OleDbConnection(connString))
{
objConn.Open();
using (DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null))
{
if (dt == null)
return;
excelSheetsListBox.Items.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow row = dt.Rows[i];
excelSheetsListBox.Items.Add(row["TABLE_NAME"].ToString());
}
}
}
}
catch (Exception exA1)
{
connString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"", excelFilePath);
using (OleDbConnection objConn = new OleDbConnection(connString))
{
objConn.Open();
using (DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null))
{
if (dt == null)
return;
excelSheetsListBox.Items.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow row = dt.Rows[i];
excelSheetsListBox.Items.Add(row["TABLE_NAME"].ToString());
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(“HATA”);
ExcelSheetName = string.Empty;
Close();
}
}