原文地址:http://blog.csdn.net/dannywj1371/article/details/7447710
使用OLEDB可以对excel文件进行读取,我们只要把该excel文件作为数据源即可。
一 在D盘创建excel文件test.xls:
二 将工作表Sheet1的内容读取到DataSet
读取的DataSet为:
从图中可以看出excel文件中的第一行变成了DataSet中的列名,这正是系统的默认设置。
三 如果想把第一行也作为数据行,那我们可以给连接字符串添加一个HDR=No属性
如:
第一行的第一列和第三列都变成空的了,这是因为系统把第一列识别成了数字,把第三列识别成了日期,而第一行的数据不符合格式的要求,所以就变成空的了。
四 我们还可以把所有列都做为字符串来读取,只要添加属性IMEX=1即可
是不是再次出乎你的意料,第三行的日期怎么变成数字了,其实excel在转换格式的时候就自动把日期变成数字了,那这个数字是怎么来的呢 ? 如果你把日期改成1900年1月1日,那么你可以看到他的转换结果是1,以此类推,39902是哪一天就明白了吧。
五 也许你并不想读取整个excel的内容
如果只想读取前两列可以用:select * from [Sheet1$A:B]
如果只想读取A1到B2的内容,就用:select * from [Sheet1$A1:B2]
六 如果不知道工作表的名字或名字被人为修改了该怎么办呢?
我们可以通过索引来获取指定工作表的名字,以下方法可以用来获取工作表名称的数组:
修正:
IMEX=1的时候并不是全都会作为字符串来处理,根据系统的默认设置,通常如果前8行有字符串,则该列会作为字符串来处理,如果全都为数字,则该列为数字列,日期也是一样。
如果你觉得8行不够或者太多了,则只能修改注册表HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows,如果此值为0,则会根据所有行来判断使用什么类型,通常不建议这麽做,除非你的数据量确实比较少。
=====================================================================================
一.使用OleDb,这个法子好像不大好使.容易读错.
引用System.Data.OleDb;
PS: 另贴一段我自己的程序里面的代码。
#region 导入导出
[HttpPost]
public void Import(string file)
{
int num = 0;
if (Request.Files.Count > 0)
{
try
{
string filename = Server.MapPath("/Content/upload/Excel/" + Projects.Tool.Util.StringUtil.CreateRandomString(16) + ".config");
Request.Files[0].SaveAs(filename);
string tableName = GetExcelFirstTableName(filename);
//设置T_Sql
string TSql = "SELECT * FROM [" + tableName + "]";
//读取数据
DataTable table = ExcelToDataSet(filename, TSql).Tables[0];
if (table != null && table.Rows.Count > 1)
{
for (int i = 0; i < table.Columns.Count; i++)
{
table.Columns[i].ColumnName = table.Rows[0][i].ToString();
}
for (int i = 1; i < table.Rows.Count; i++)
{
try
{
string lockpickId = table.Rows[i]["开锁器编号"].ToString().Replace("'", "");
string model = table.Rows[i]["型号"].ToString().Replace("'", "");
string bluetoothName = table.Rows[i]["蓝牙名称"].ToString().Replace("'", "");
string macAddress = table.Rows[i]["蓝牙地址"].ToString().Replace("'", "");
Lockpick pickEntity = lockpickService.GetlockpickById(lockpickId);
if (pickEntity == null)
{
pickEntity = new Lockpick
{
LockpickId = lockpickId,
Model = model,
BluetoothName = bluetoothName,
MacAddress = macAddress
};
lockpickService.Createlockpick(pickEntity);
}
else
{
pickEntity.Model = model;
pickEntity.BluetoothName = bluetoothName;
pickEntity.MacAddress = macAddress;
lockpickService.Updatelockpick(pickEntity);
}
}
catch
{
num++;
}
}
}
}
catch
{
Response.Write("<script>alert('导入失败');</script>");
Response.End();
//return View();
}
}
else
{
Response.Write("<script>alert('请选择Excel文件');</script>");
Response.End();
//return View();
}
if (num > 0)
{
Response.Write("<script>alert('数据导入失败" + num.ToString() + "条');</script>");
}
else
{
Response.Write("<script>alert('导入成功');location.href='/lockpick/index';</script>");
}
Response.End();
//return View();
}
/// <summary>
/// 返回Excel数据源
/// </summary>
/// <param name="filename">文件路径</param>
/// <param name="TSql">TSql</param>
/// <returns>DataSet</returns>
public static DataSet ExcelToDataSet(string filename, string TSql)
{
DataSet ds;
string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\"";
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = TSql;
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
ds = new DataSet();
myCommand.Fill(ds);
myConn.Close();
return ds;
}
/// <summary>
/// 动态取Excel表名
/// </summary>
/// <param name="fullPath">文件路径</param>
/// <returns></returns>
public static string GetExcelFirstTableName(string fullPath)
{
string tableName = null;
if (System.IO.File.Exists(fullPath))
{
//Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties="Excel 12.0;HDR=YES;IMEX=1;Data Source=1.xls"
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fullPath + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\""))
{
conn.Open();
tableName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[1][2].ToString().Trim();
}
}
return tableName;
}
#endregion