这两天想实现Excel导入数据库的功能,于是自己百度,简单做了个小Demo,环境:office2010,VS2008,win7,SQL2005;大体思路是如下这种方式:
1.利用操作Excel语句,取得Excel的数据。
2.将取得的数据封装在DataSet中
3.循环上面的DataSet,然后将表中的内容,依次插入到对应表中。
下面是代码的基本实现方式:
前台实现:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ImportDemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
选择导入文件:<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button runat = "server" ID = "btnImpot" Text = "导入" onclick="btnImpot_Click" />
</div>
</form>
</body>
</html>
后台:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.OleDb;
namespace ImportDemo
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 导入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnImpot_Click(object sender, EventArgs e)
{
//是否含有文件
if (!this.FileUpload1.HasFile)
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script>alert('请选择导入的Excel表!');</script>");
return;
}
//判断导入文件是否正确
string Extension = System.IO.Path.GetExtension(this.FileUpload1.FileName).ToString().ToLower();
if (Extension != ".xls" && Extension !=".xlsx")
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script>alert('您导入的Excel文件不正确,请确认后重试!');</script>");
return;
}
//拼接服务器文件名
string FileName = DateTime.Now.ToString("yyyyMMddhhmmssmmmm") + this.FileUpload1.FileName;
//保存路径
string savePath = Server.MapPath("Excel/") + FileName;
//将文件保存到服务器上
FileUpload1.SaveAs(savePath);
//将Excel中的数据放到DataTable中
DataTable dt = GetExcelSheet(savePath, FileName);
//向数据库中插入数据
int i = InsetData(dt);
//提示导入成功数据
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script>alert('成功导入"+i+"条数据!');</script>");
}
/// <summary>
/// 将Excel中的数据放到DataTable中
/// </summary>
/// <param name="strFileName">路径</param>
/// <param name="strFileName">表名</param>
/// <returns>DataTable数据</returns>
public DataTable GetExcelSheet(string fileUrl,string table)
{
//office2007之前 仅支持.xls
//const string cmdText = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1';";
//支持.xls和.xlsx,即包括office2010等版本的 HDR=Yes代表第一行是标题,不是数据;
const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'";
DataTable dt = null;
//建立连接
OleDbConnection conn = new OleDbConnection(string.Format(cmdText, fileUrl));
try
{
//打开连接
if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed)
{
conn.Open();
}
DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
//获取Excel的第一个Sheet名称
string sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString().Trim();
//查询sheet中的数据
string strSql = "select * from [" + sheetName + "]";
OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
DataSet ds = new DataSet();
da.Fill(ds,table);
dt = ds.Tables[0];
return dt;
}
catch (Exception exc)
{
throw exc;
}
finally
{
conn.Close();
conn.Dispose();
}
}
/// <summary>
/// 向数据库插入数据
/// </summary>
/// <param name="dt">Excel中的DataTable数据</param>
public int InsetData(DataTable dt)
{
int i =0;
foreach (DataRow item in dt.Rows)
{
Person per = new Person();
per.Name = item["Name"].ToString();
per.Age = Convert.ToInt32( item["Age"].ToString());
per.Address = item["Address"].ToString();
per.Phone = item["Phone"].ToString();
if (DBHelper.Add(per) == 1)
{
i++;
}
}
return i;
}
}
public class Person
{
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 地址
/// </summary>
public string Address { get; set; }
/// <summary>
/// 电话
/// </summary>
public string Phone { get; set; }
}
}
之间新建了两个类:DBHelper 类(用于操作数据库的增删查改) 和 SqlConn 类(获得数据库连接字符串)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ImportDemo
{
public class SqlConn
{
/// <summary>
/// 获得连接字符串
/// </summary>
public static string ConnText
{
get { return System.Configuration.ConfigurationManager.ConnectionStrings["DbLink"].ConnectionString; ; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
namespace ImportDemo
{
public class DBHelper
{
/// <summary>
/// 增加
/// </summary>
/// <param name="per">人员类</param>
/// <returns>成功返回1,否则返回0</returns>
public static int Add(Person per)
{
int count = 0;
string cmdText = "insert into Person(Name,Age,Address,Phone) values(@Name,@Age,@Address,@Phone)";
SqlConnection conn = new SqlConnection(SqlConn.ConnText);
try
{
//打开连接
if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed)
{
conn.Open();
}
SqlCommand cmd = new SqlCommand(cmdText, conn);
SqlParameter[] sqlparas = { new SqlParameter("@Name",per.Name),
new SqlParameter("@Age",per.Age),
new SqlParameter("@Address",per.Address),
new SqlParameter("@Phone",per.Phone)
};
cmd.Parameters.AddRange(sqlparas);
count = cmd.ExecuteNonQuery();
}
catch (Exception exc)
{
throw exc;
}
finally
{
conn.Close();
}
return count;
}
}
}
在Web.config中添加连接数据库的字符串:
<connectionStrings>
<add name="DbLink" connectionString="Data Source=.\SQL2005;Initial Catalog=ceshi;User Id=sa;Password=123; "/>
</connectionStrings>
以上就是全部的代码。
当然在这之中也有几点需要注意的地方:
1.导入时,报错:导入的表不是预期格式。
原因:① Excel表的数据格式不正确。 解决:修改Excel表的数据格式。 ②.获得Excel数据的语句不正确。 解决:如果是office2007之前,可以用这种方式:
//office2007之前 仅支持.xls
const string cmdText = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1';";
如果是2010的,用如下这种方式:
//支持.xls和.xlsx,即包括office2010等版本的 HDR=Yes代表第一行是标题,不是数据;
const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; 2.打开某某数据库失败。 原因:数据库链接字符串出现错误。 解决:修改Web.config文件中的连接字符串,将数据库对象改成自己的对应数据库名,用户名和密码。
|