1.需要到添加引用Microsoft.Office.Interop.Excel程序集
2.编码
//定义全局变量
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataTable dt_temp = new System.Data.DataTable();
dt_temp.Tables[0].Merge( efDevGrid1.DataSource as System.Data.DataTable);//获取grid的表结构
dt_temp.Tables[0].Clear();
//选择要导入的Excel文件
OpenFileDialog open = new OpenFileDialog();
open.ShowDialog();
string fileName = open.FileName;
if (fileName != "")
{
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//定义一个Excel文件变量
Microsoft.Office.Interop.Excel.Workbook workbook;//定义一个Excel工作薄
Microsoft.Office.Interop.Excel.Worksheet worksheet;//定义一个Excel文件的sheet页
//获取Excel文件
workbook = excel.Workbooks.Open(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
worksheet = (Worksheet)workbook.Worksheets.get_Item(1);//获取sheet页,这里默认取第一个sheet页
int rowCount = worksheet.UsedRange.Rows.Count-1;//获取sheet页的数据行数(指非空的数据行)
int colCount = worksheet.UsedRange.Columns.Count;//获取sheet页的列数
Microsoft.Office.Interop.Excel.Range range1;//
int i;
for (i = 0; i < colCount; i++)
{
string temp = ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i+1]).Text.ToString();//获取单元格文本
if (temp.Trim() == "")
{
continue;
}
range1 = worksheet.Range[worksheet.Cells[1, i + 1], worksheet.Cells[1, i + 1]];//获取单元格
//dt.Columns.Add(range1.Value2.ToString());
string A="";
if (range1.Value2 != null)
{
A = range1.Value2.ToString();//获取单元格的值
for (int k = 0; k < dt_temp.Tables[0].Columns.Count; k++)
{
//将Excel中的列添加到数据表中
if (!dt.Columns.Contains(A) && dt_temp.Tables[0].Columns[k].Caption == A)
{ //dt.Columns.Add(range1.Value2.ToString());
dt.Columns.Add(dt_temp.Tables[0].Columns[k].ColumnName);
string c = dt_temp.Tables[0].Columns[k].DataType.ToString();
dt.Columns[dt_temp.Tables[0].Columns[k].ColumnName].DataType = Type.GetType(c);
dt.Columns[dt_temp.Tables[0].Columns[k].ColumnName].AllowDBNull = true;
break;
}
if (k == dt_temp.Tables[0].Columns.Count - 1)
{
if (!dt.Columns.Contains(A))
{
dt.Columns.Add(range1.Value2.ToString());
}
}
}
}
}
//将数据行添加到数据表中
int j;
for (j = 1; j < rowCount; j++)
{
DataRow dr = dt.NewRow();
for (i = 0; i < colCount; i++)
{
range1 = worksheet.Range[worksheet.Cells[j + 1, i + 1], worksheet.Cells[j + 1, i + 1]];
dr[i] = range1.Value2;
}
dt.Rows.Add(dr);
}
//
dt_temp.Tables[0].Merge(dt);
3.说明
Microsoft.Office.Interop.Excel.Application excel
对象表示
Excel
应用程序本身。
Application
对
象公开了大量有关正在运行的应用程序、应用于该实例的选项以及在该实例中打开的当前用户的对象的信
息。
Microsoft.Office.Interop.Excel.Application excel
对象表示
Excel
应用程序本身。
Application
对
象公开了大量有关正在运行的应用程序、应用于该实例的选项以及在该实例中打开的当前用户的对象的信
息。
(2).Microsoft.Office.Interop.Excel.Workbook 类表示 Excel 应用程序中的单个工作簿
(3).Microsoft.Office.Interop.Excel.Worksheet 对象是 Worksheets 集合的成员
(4).Microsoft.Office.Interop.Excel.Range 对象是 Excel 应用程序中最常用的对象。在能够处理 Excel 内的任何范围之前,必须将它表示为 Range 对象,并处理该对象的方法和属性。Range 对象表示一个单元格、一行、一列、包含一个或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个工作表中的一组单元格
(5)Type.Missing:
1.Type.Missing指的是空类型,因为有些方法你传null给它会出错的,必须要用Type.Missing.
2.表示 Type 信息中的缺少值。 使用 Missing 字段通过反射进行调用,以获取参数的默认值。如果传入一个参数值的 Missing 字段,并且该参数没有默认值,则引发 ArgumentException。
(6)引用Microsoft.Office.Interop.Excel程序集
需要修改程序集的嵌入互操作类型为false,否则可能会报编译动态表达式找不到引用的错误
参考链接:
https://wenku.baidu.com/view/a14880c23b3567ec102d8aa5.html
http://blog.sina.com.cn/s/blog_6c6780330101e4l9.html