iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >利用C# 怎么将Excel数据读取到SQL server中
  • 303
分享到

利用C# 怎么将Excel数据读取到SQL server中

2023-06-07 21:06:01 303人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关利用C# 怎么将excel数据读取到SQL Server中,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  先上读取Excel文件的code如下。public 

这期内容当中小编将会给大家带来有关利用C# 怎么将excel数据读取到SQL Server中,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

  先上读取Excel文件的code如下。

public bool GetFiles(string equipName)    {      //choose all sheet? or all data in sheet?      string strExcel = "select * from [Sheet1$]";      //初始化system.io的配置(路径)      DirectoryInfo directoryInfo1 = new DirectoryInfo(WPath + equipName + "\\Working");      //用文件流来获取文件夹中所有文件,存放到      FileInfo[] files1 = directoryInfo1.GetFiles();      foreach (FileInfo file in files1) // Directory.GetFiles(srcFolder)      {        // 连接到excel 数据源,  xlsx要用ACE        string strConn = ("Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source= " + file.FullName + "; Extended Properties='Excel 12.0';");        OleDbConnection OledbConn = new OleDbConnection(strConn);        if (IsUsed(file.FullName))        {          flag = IsUsed(file.FullName);          continue;        }        try        {          OledbConn.Open();          // 存入datatable          OleDbDataAdapter dAdapter = new OleDbDataAdapter(strExcel, strConn);            //写入ds中的一个table          dAdapter.Fill(ds);          OledbConn.Dispose();          OledbConn.Close();        }        catch (Exception ex)        {        }      }    }

foreach用于遍历所有Excel文件;

strExcel用于选择Excel文件中sheet的内容,select * 表示选取sheet中所有行和列;

strConn用于设置读取的方法,provider的设置很重要,ACE表示最新的.xlsx文件,jet 表示读取.xls文件,两者有点区别,DataSource表示文件名,包括路径。

OleDbDataAdapter 用于按(命令)去执行填充dataset的功能

dataset简而言之可以理解为 虚拟的 数据库或是Excel文件。而dataset里的datatable 可以理解为数据库中的table活着Excel里的sheet(Excel里面不是可以新建很多表吗)。

这样说应该很容易懂了,相当于dataset只是暂时存放下数据,微软官方解释是存在内存中。至于为啥要找个“中介”来存数据,这个估计是为了和sql匹配。

好了,接下来说下这次的重点。

在把Excel的数据存到dataset后,我们要把dataset的数据存入SQL才算完事。

废话不多说先上后面的代码:(总的代码)

using System.IO;using System.Data;using System.Configuration;using System.ServiceProcess;using System.Data.SqlClient;using System.Data.OleDb;using System.Timers;using System;namespace DataCollection_model_HD{  public partial class Service1 : ServiceBase  {    public Service1()    {      InitializeComponent();      InitTimer();    }    #region 各种配置的全局定义    //定义一个dataset 用于暂时存放excel中的数据,后续要存入datatable    DataSet ds = new DataSet();    Timer TimModel = new Timer();    public static string LogPath = ConfigurationManager.AppSettings["LogPath"].ToString();    public static string WPath = ConfigurationManager.AppSettings["WorkingPath"].ToString();    public static string APath = ConfigurationManager.AppSettings["ArcHivePath"].ToString();    //数据库登录    //注意Integrated Security不写(false)表示必须要用pwd登录,true表示不用密码也能进入数据库    public static string ConnStr = ConfigurationManager.AppSettings["ConnStr"].ToString();    //用于记录log的时候,机台名字    public static string MachineName = "test";    #endregion    #region 定时器的初始化,及其事务    //这个按钮用于模拟服务(定时器)启动    public void InitTimer()    {      //DFL的定时器       TimModel.Interval = 15 * 1000;      //定时器的事务      TimModel.Elapsed += new ElapsedEventHandler(ElapsedEventDFL);      TimModel.Enabled = true;      TimModel.AutoReset = true;    }    private void ElapsedEventDFL(object source, ElapsedEventArgs e)    {            if (GetFiles("test"))      {        //多次读取数据,存在多个文件时但其中某个文件在使用的bug        ds.Tables.Clear();        Log4App.WriteLine(" ---- End the collect ! ----", LogPath, machineName, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(), Log4AES.Type.InfORMation);      }      else      {        DataToSql("test");        BackupData("test");        Log4App.WriteLine(" ---- End the collect ! ----", LogPath, machineName, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(), Log4AES.Type.Information);      }          }    #endregion    //log初始化设置    Log4Application Log4App = new Log4Application();        public void BackupData(string equipName)    {      //需要存放(备份)的文件夹路径(Achieve)      string ArchivePath = APath + equipName + " Equipment Temp. monitoring by third tool\\Archive";      //读取数据源文件的文件夹路径(Working)      string WorkingPath = WPath + equipName + " Equipment Temp. monitoring by third tool\\Working";      //初始化system.IO的配置(路径)      DirectoryInfo directoryInfo = new DirectoryInfo(WorkingPath);      //用文件流来获取文件夹中所有文件,存放到      FileInfo[] files = directoryInfo.GetFiles();      //循环的把所有机台数据备份到Achieve文件夹      try      {        foreach (FileInfo file in files) // Directory.GetFiles(srcFolder)        {          //使用IO中的Moveto函数进行移动文件操作          file.MoveTo(Path.Combine(ArchivePath, file.Name));        }      }      catch (Exception ex)      {      }    }    //判断Excel是否在被人使用    public bool IsUsed(String fileName)    {      bool result = false;      try      {        FileStream fs = File.OpenWrite(fileName);        fs.Close();      }      catch      {        result = true;      }      return result;    }    //将xls文件投入datatable , 返回一个datatable为 ds.table[0]    public bool GetFiles(string equipName)    {      bool flag = false;      //choose all sheet? or all data in sheet?      string strExcel = "select * from [Sheet1$]";      //初始化system.IO的配置(路径)      DirectoryInfo directoryInfo1 = new DirectoryInfo(WPath + equipName + " Equipment Temp. monitoring by third tool\\Working");      //用文件流来获取文件夹中所有文件,存放到      FileInfo[] files1 = directoryInfo1.GetFiles();      foreach (FileInfo file in files1) // Directory.GetFiles(srcFolder)      {        // 连接到excel 数据源,  xlsx要用ACE        string strConn = ("Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source= " + file.FullName + "; Extended Properties='Excel 12.0';");        OleDbConnection OledbConn = new OleDbConnection(strConn);        if (IsUsed(file.FullName))        {          flag = IsUsed(file.FullName);          continue;        }        try        {          OledbConn.Open();          // 存入datatable,Excel表示哪一个sheet,conn表示连接哪一个Excel文件(jet、ACE)          OleDbDataAdapter dAdapter = new OleDbDataAdapter(strExcel, strConn);          dAdapter.Fill(ds);          OledbConn.Dispose();          OledbConn.Close();        }        catch (Exception ex)        {        }      }      return flag;    }    // 将datatable中的数据存入SQL server    public void DataToSql(string equipName)    {      //初始化配置 sqlserver的服务器名用户等      SqlConnection Conn = new SqlConnection(ConnStr);      Conn.Open();      //配置SQLBulkCopy方法,真正用于复制数据到数据库的方法      SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnStr, SqlBulkCopyOptions.UseInternalTransaction)      {        DestinationTableName = "ModelTest_HD"      };      try      {        foreach (DataColumn item in ds.Tables[0].Columns)        {          //只复制所选的相关列          bulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName);        }        //开始复制到sql,每次在数据库中添加        bulkCopy.WriteToServer(ds.Tables[0]);        bulkCopy.Close();        //copy完了,要清空ds的内容,不然会引起循环写入上一个内容        ds.Tables.Clear();      }      catch (Exception ex)      {      }      finally      {        //关闭数据库通道        Conn.Close();      }    }    protected override void OnStart(string[] args)    {      //启动服务时做的事情    }    protected override void OnStop()    {      //停止服务时做的事情    }  }}

认真看注释可以看出本程序的逻辑就是:

读取到Excel数据

存Excel数据到SQL server

备份Excel文件到另一个文件夹

其中一些功能大家可以看一看,注释也写的很清楚。对于初学者 configurationmanager的内容是在 app.config中设置的,这里直接去配置就行(类似html

foreach (DataColumn item in ds.Tables[0].Columns){//只复制所选的相关列bulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName);}

注意这一段代码,表示只复制数据库与Excel表中  “列名”一致的数据,如果不一致就不复制。(注意数据的格式,int还char 这些必须弄清楚)

然后bulkCopy.WriteToServer(ds.Tables[0])这里,就是把ds.tables的数据复制到SQLserver ,Tables[0]表示ds第一张表(其实我们也只有一张表,至于怎么在dataset中新建table自己可以查查资料)

上述就是小编为大家分享的利用C# 怎么将Excel数据读取到SQL server中了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 利用C# 怎么将Excel数据读取到SQL server中

本文链接: https://www.lsjlt.com/news/250265.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中函数返回值的类型是由什么决定的
    在 c++ 中,函数返回值类型由其函数原型的类型决定,包括:函数原型指定返回值类型:在函数名称后跟冒号,再跟返回值类型。默认返回值类型为 int:如果不指定返回值类型,默认类型为 int...
    99+
    2024-05-14
    c++
  • 在c++中,什么叫函数的返回值
    在 c++ 中,函数只能返回一个值。解决方法:引用传递、结构体或类、out 参数。没有返回值的函数可以使用 void 类型,表示不返回任何值。 什么是 C++ 中函数的返回值? 在 C...
    99+
    2024-05-14
    c++
  • c++中static的作用和用法
    c++ 中的 static 关键字用于声明静态变量、函数或类成员,使其在程序生命周期内存在或与类的每个实例关联。具体用法如下:静态变量:在函数外声明,仅创建一份副本,在程序启动时初始化且...
    99+
    2024-05-14
    c++
  • static在c和c++中的区别
    static关键字在c和c++中用于控制变量的生命周期和作用域。在c中,它延长局部变量和限制全局变量的作用域。在c++中,它还用于定义类成员变量和函数、命名空间中的变量和函数,以及函数内...
    99+
    2024-05-14
    c语言 c++ 作用域
  • c++中a++与++a的区别
    c++ 中 a++ 和 ++a 区别:后缀递增 a++ 先返回原始值,再递增;前缀递增 ++a 先递增,再返回递增后的值。 C++ 中 a++ 与 ++a 的区别 在 C++ 中,a+...
    99+
    2024-05-14
    c++
  • if else在c++中的用法
    在 c++ 中,if else 语句根据条件执行不同代码块的语法为:if (condition) { } else { }。它可用于:检查数字是否为正数根据条件执行嵌套 if els...
    99+
    2024-05-14
    c++
  • struct在c和c++中的区别
    c和c++中struct的区别包括:c中成员默认公开访问,c++中默认私有访问。c++可以在struct定义中初始化成员,c中不允许。c++支持成员函数,c不支持。c++不支持匿名str...
    99+
    2024-05-14
    c++
  • c++中的所有函数都是传值调用吗
    函数调用类型可分为传值调用和引用调用,默认采用传值调用,传值调用中形参接收实参副本,引用调用中形参接收实参引用,对形参进行的修改也会影响实参。 C++中的函数调用类型 C++中,函数调...
    99+
    2024-05-14
    c++
  • c++中ifdef的用法
    c++ 中的 #ifdef 预处理器指令用于根据预定义宏是否存在来编译或不编译代码块。它的语法是 #ifdef ,其作用包括:检查宏是否存在,如果宏已定义,则编译其后的代码块;实现条件编...
    99+
    2024-05-14
    c++
  • c++中的函数调用有哪几种方式?它们有什么区别
    c++ 中的函数调用方式有 4 种:值传递(复制实参值,不影响实参)、引用传递(传递实参地址,修改形参值会修改实参)、指针传递(传递实参指向的内存地址,修改指向的值会影响实参)、rval...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作