当前位置: 首页 > news >正文

读取Execl表数据 导入数据库

不知不觉博客园园林都两年多了,我是今年毕业的应届生,最近公司项目需要改动,很多的数据需要导入,很多的实体类需要些。考虑到这些问题自己写了两个winform版的小工具,一个是读取Execl数据导入数据库,另一个是自动生成实体类,以及增,删,改的方法。今天先分享Execl数据导入数据库。基本上没什么界面就两个按钮而已。一个是选择导入的文件,一个是导入数据库按钮。

首先我写了一个MSSQLAction的类,取数据的类,相当于三层里面的SqlHelper类,里面有两个方法

一个是准备读取数据前的命令配置

public static void PrepareCommand(SqlConnection conn, SqlCommand cmd, SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] value)
{
  try
  {
    if (conn.State != ConnectionState.Open)
    {
      conn.Open();
    }
    cmd.Connection = conn;
    if (trans != null)
    {
      cmd.Transaction = trans;
    }
    cmd.CommandText = cmdText;
    cmd.CommandType = cmdType;
    if (value != null)
    {
      foreach (SqlParameter item in value)
      {
        cmd.Parameters.Add(item);
      }
    }
  }
  catch (Exception ex)
  {
    throw new Exception(ex.Message);
  }
}

另一个就是操作增,删,改的方法

public static int ExecuteNonQuery(string connString, CommandType cmdTyep, string cmdText, params SqlParameter[] value)
{
  using (SqlConnection conn = new SqlConnection(connString))
  {
    SqlCommand cmd = new SqlCommand();
    PrepareCommand(conn, cmd, null, cmdTyep, cmdText, value);
    int result = cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    return result;
  }
}

取数据的类写好了,现在写Form的后台,一个四个方法:

一个是选择文件的事件,filepath 是一个全局变量

private void File_Click(object sender, EventArgs e)
{
  OpenFileDialog file = new OpenFileDialog();
  file.ShowDialog();
  filepath = file.FileName;
  label1.Text = file.FileName;
}

 一个是获取Execl数据的方法

public List<System.Data.DataTable> GetExcelDatatable(string fileUrl)
{
  const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'";

  //建立连接
  OleDbConnection conn = new OleDbConnection(string.Format(cmdText, fileUrl));
  try
  {
    //打开连接
    if (conn.State != ConnectionState.Open)
    {
      conn.Open();
    }

    List<System.Data.DataTable> list = new List<DataTable>();
    System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    //获取Excel的第一个Sheet名称
    for (int i = 0; i < schemaTable.Rows.Count; i++)
    {
      System.Data.DataTable dt = new DataTable();
      string sheetName = schemaTable.Rows[i]["TABLE_NAME"].ToString().Trim();
      string strSql = "select * from [" + sheetName + "]";
      OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
      DataSet ds = new DataSet();
      da.Fill(ds);
      dt = ds.Tables[0];
      list.Add(dt);
    }
    return list;
  }
  catch (Exception exc)
  {
    throw exc;
  }
  finally
  {
    conn.Close();
    conn.Dispose();
  }
}

 一个是往数据库插入数据的方法

public int InsetData(System.Data.DataTable dt)
{
    int i = 0;
    foreach (DataRow dr in dt.Rows)
    {
      string findDate = dr[0].ToString().Trim() == "" ? null :
      Convert.ToDateTime(dr[0].ToString().Trim()).ToShortDateString().ToString();
      string date = Convert.ToDateTime(findDate).ToString("s");
      string resultDate = date.Substring(0, 10);
      string brand = dr[1].ToString().Trim() == "" ? null : dr[1].ToString().Trim();
      string storeName = dr[2].ToString().Trim() == "" ? null : dr[2].ToString().Trim();
      string type = storeName.Substring(0, 2);
      string city = dr[3].ToString().Trim() == "" ? null : dr[3].ToString().Trim();
      string throughTrain = dr[4].ToString().Trim() == "" ? "0" : dr[4].ToString().Trim();
      string showNumber = dr[5].ToString().Trim() == "" ? "0" : dr[5].ToString().Trim();
      string payNumber = dr[6].ToString().Trim() == "" ? "0" : dr[6].ToString().Trim();
      string freeNumber = dr[7].ToString().Trim() == "" ? "0" : dr[7].ToString().Trim();
      string drillShow = dr[8].ToString().Trim() == "" ? "0" : dr[8].ToString().Trim();
      string visitorsNumber = dr[9].ToString().Trim() == "" ? "0" : dr[9].ToString().Trim();
      string commission = dr[10].ToString().Trim() == "" ? "0" : dr[10].ToString().Trim();
      string activity = dr[11].ToString().Trim() == "" ? "0" : dr[11].ToString().Trim();
      string other = dr[12].ToString().Trim() == "" ? "0" : dr[12].ToString().Trim();

      string strConnection = "server=.;database=tests;Integrated Security=True";

      string strSql = "Insert into LemonFlagshipStore(Lemon1,Lemon2,Lemon3,Lemon4,Lemon5,Lemon6,Lemon7,Lemon8,Lemon9,Lemon10,Lemon11,Lemon12,Lemon13,Lemon14) Values ('" + brand + "','" + city + "','" + resultDate + "','" + storeName + "','" +       commission + "','" + activity + "','" +
      throughTrain + "','" + drillShow + "','" + other + "','" + freeNumber + "','" +
      payNumber + "','" + showNumber + "','" + visitorsNumber + "','" + type + "')";

      int result = MSSQLAction.ExecuteNonQuery(strConnection, CommandType.Text, strSql);
      i++;
    }
    return i;
}

 

最后就是一个简单点击导入数据的事件

private void Import_Click(object sender, EventArgs e)
{
  try
  {
    List<System.Data.DataTable> table = this.GetExcelDatatable(filepath);
    int listCount = 0;
    foreach (System.Data.DataTable dt in table)
    {
         int result = this.InsetData(dt);
      listCount += result;
    }
    MessageBox.Show("一共导入" + listCount + "数据", "导入成功");
  }
  catch (Exception ex)
  {
    MessageBox.Show("导入失败\r\n" + "失败原因为:\r\n" + ex, "提示");
  }
}

 基本的代码实现就这么多,当然插入要使用此代码的话自己要把数据库链接和字符串和sql的表明字段改了。做完之后是不是觉得很简单,呵呵.....

另一个改天分享。如若需要源码:QQ 2212907254

 

转载于:https://www.cnblogs.com/Struggle-xh/p/7500749.html

相关文章:

  • jQuery插件ReverseOrder实现Javascript倒序及了解prependTo函数
  • 洛谷—— P1041 传染病控制
  • Python学习系列-----第二章 操作符与表达式
  • BZOJ 1617 Usaco River Crossing
  • SQL Server 2005数据库中,获取某个表的创建时间
  • 【bzoj2694】Lcm 莫比乌斯反演+线性筛
  • Eclipse中安装Java反编译插件JD-Eclipse
  • STM32单片机是如何启动的?
  • jmeter参考网址
  • C# 中的事务
  • 边缘高亮效果(三)
  • 命定的局限与挑战,读《命若琴弦》——leo鉴书(17)
  • mybatis增删改查
  • NetXray
  • 中国程序员技术联盟,期待你的加盟(10.25修订)
  • 《剑指offer》分解让复杂问题更简单
  • CAP 一致性协议及应用解析
  • ComponentOne 2017 V2版本正式发布
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • mongodb--安装和初步使用教程
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • SegmentFault 2015 Top Rank
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vue.js 移动端适配之 vw 解决方案
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 技术胖1-4季视频复习— (看视频笔记)
  • 蓝海存储开关机注意事项总结
  • 前端代码风格自动化系列(二)之Commitlint
  • 日剧·日综资源集合(建议收藏)
  • 数据仓库的几种建模方法
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小李飞刀:SQL题目刷起来!
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)STL算法之元素计数
  • (javascript)再说document.body.scrollTop的使用问题
  • (k8s中)docker netty OOM问题记录
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (一) springboot详细介绍
  • (原創) 未来三学期想要修的课 (日記)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)菜鸟学数据库(三)——存储过程
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)Linux 多线程条件变量同步
  • ***详解账号泄露:全球约1亿用户已泄露
  • .CSS-hover 的解释
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core WebAPI中使用swagger版本控制,添加注释