Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 470|回复: 0

ASP.NET实现Excel导入SQL数据库以及各种出现的问题解决方案

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 792 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    723136
    发表于 2021-6-9 16:30:42 | 显示全部楼层 |阅读模式

    这两天想实现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文件中的连接字符串,将数据库对象改成自己的对应数据库名,用户名和密码。

     

     

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-18 10:29 , Processed in 0.061081 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表