热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#从Excel批量导入数据库

最近遇到了关于C#MVC批量添加数据的问题,解决后就自己写了一个未完成的小Demo不管什么编程语言都会提供操作Excel文件的方式,C#操作Excel主要有以下几种方式:

最近遇到了关于 C# MVC 批量添加数据的问题,解决后就自己写了一个未完成的小Demo 

 

 

不管什么编程语言都会提供操作Excel文件的方式,C#操作Excel主要有以下几种方式:

 

1.Excel   

 

说明:利用Office 的Excel组件来操作excel文件

 

优点:能够完全操作Excel文件,生成丰富文件内容

 

缺点:需要电脑安装Excel,会启动Excel进程这在web上很不方便

 

2.OpenXML

 

说明:一个操作字处理文档的组件包括Excel

 

优点:能够操作操作Excel2007版本文件

 

缺点:只能够操作Excel2007文件

 

3.NPOI

 

说明:一个开源的Excel读写库

 

优点:不需要安装Excel

 

缺点:只能够操作Excel2003文档,对文档内容控制不完全

 

4.OleDb

 

说明:使用Microsoft Jet 提供程序用于连接到 Excel 工作簿,将Excel文件作为数据源来读写

 

优点:简单快速,能够操作高版本Excel

 

缺点:只能够进行有限的操作(读、写)

 

 

今天学习使用OleDb操作Excel文件

连接字符串:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\test.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'

provider:表示提供程序名称

Data Source:这里填写Excel文件的路径

Extended Properties:设置Excel的特殊属性

Extended Properties 取值:

Excel 8.0   针对Excel2000及以上版本,Excel5.0 针对Excel97。

HDR=Yes 表示第一行包含列名,在计算行数时就不包含第一行

IMEX   0:导入模式,1:导出模式:2混合模式

 

1.读取Excel

if (openFileDialog1.ShowDialog() == DialogResult.OK)  
            {  
                String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +  
     "Data Source="+openFileDialog1.FileName+";"+  
     "Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'";  
  
                //实例化一个Oledbconnection类(实现了IDisposable,要using)  
                using (OleDbConnection ole_cOnn= new OleDbConnection(sConnectionString))  
                {  
                    ole_conn.Open();  
                    using (OleDbCommand ole_cmd = ole_conn.CreateCommand())  
                    {  
                        //类似SQL的查询语句这个[Sheet1$对应Excel文件中的一个工作表]  
                        ole_cmd.CommandText = "select * from [Sheet1$]";  
                        OleDbDataAdapter adapter = new OleDbDataAdapter(ole_cmd);  
                        DataSet ds = new DataSet();  
                        adapter.Fill(ds, "Sheet1");  
                       for (int i = 0; i 0].Rows.Count; i++)  
                        {  
                            MessageBox.Show(ds.Tables[0].Rows[i]["商家名称"].ToString());  
                        }  
                    }  
                }  
            }  

 

 

2.获取工作簿中所有的工作表

if (openFileDialog1.ShowDialog() == DialogResult.OK)  
            {  
                String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +  
     "Data Source="+openFileDialog1.FileName+";"+  
     "Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'";  
  
                //实例化一个Oledbconnection类(实现了IDisposable,要using)  
                using (OleDbConnection ole_cOnn= new OleDbConnection(sConnectionString))  
                {  
                    ole_conn.Open();  
                    using (OleDbCommand ole_cmd = ole_conn.CreateCommand())  
                    {  
                        DataTable tb = ole_conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);  
                        foreach (DataRow row in tb.Rows)  
                        {  
                            MessageBox.Show(row["TABLE_NAME"].ToString());  
                        }  
                    }  
                }  
            }  

 

3.写入数据到Excel表

if (openFileDialog1.ShowDialog() == DialogResult.OK)  
            {  
                String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +  
     "Data Source="+openFileDialog1.FileName+";"+  
     "Extended Properties=Excel 8.0;";  
  
                //实例化一个Oledbconnection类(实现了IDisposable,要using)  
                using (OleDbConnection ole_cOnn= new OleDbConnection(sConnectionString))  
                {  
                    ole_conn.Open();  
                    using (OleDbCommand ole_cmd = ole_conn.CreateCommand())  
                    {  
                        ole_cmd.CommandText = "insert into [Sheet1$](商户ID,商家名称)values('DJ001','点击科技')";  
                        ole_cmd.ExecuteNonQuery();  
                        MessageBox.Show("数据插入成功......");  
                    }  
                }  
            }  

 

4.创建Excel文件并写入数据

String sCOnnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" +  
     "Data Source=d:\\excel1.xls;" +  
     "Extended Properties=Excel 8.0;";  
            //实例化一个Oledbconnection类(实现了IDisposable,要using)  
                using (OleDbConnection ole_cOnn= new OleDbConnection(sConnectionString))  
                {  
                    ole_conn.Open();  
                    using (OleDbCommand ole_cmd = ole_conn.CreateCommand())  
                    {  
                        ole_cmd.CommandText = "CREATE TABLE CustomerInfo ([CustomerID] VarChar,[Customer] VarChar)";  
                        ole_cmd.ExecuteNonQuery();  
                        ole_cmd.CommandText = "insert into CustomerInfo(CustomerID,Customer)values('DJ001','点击科技')";  
                        ole_cmd.ExecuteNonQuery();  
                        MessageBox.Show("生成Excel文件成功并写入一条数据......");  
                    }  
                }  

 

 

    1 首先 我们 在前台进行文件的上传

 

      

"bulkDlg" >
class="col-xs-12"> class="form-horizontal" id="bulkForm" enctype="multipart/form-data">
class="form-group">
class="form-group">
class="col-sm-9"> "file" id="BulkXls" name="BulkXls" />
"button" id="sub" value="提交" />

 

 

  注意:在我们用ajax提交的时候,这里一定得用$.ajax, 不能用$.post(本人试过,post提交为成功!)contentType 和  processData 一定要有 并且必须为false 还有就是 FormData支持高版本浏览器 低版本浏览器(IE8以上)

 

  2 后台代码

    定义一个 方法来接受 前台传过来的文件,以及解析Excel文件中的内容,并转换为Dataset

          [HttpPost]

public string UploadXls()
        {
            try
            {
                HttpPostedFileBase file = HttpContext.Request.Files["BulkXls"];
                if (file == null)
                {
                    return  "请选择文件";
                }
                var ext = Path.GetExtension(file.FileName);
                var exts = ",.xls,.xlsx,";
                if (!exts.Contains("," + ext + ","))
                {
                    return "请上传.xls,.xlsx文件";
                }
                //上传文件
                var path = HttpContext.Request.MapPath("~/");
                var dir = "/Upload_Files/xls/";
                if (!Directory.Exists(path + dir))
                {
                    Directory.CreateDirectory(path + dir);
                }
                //保存文件
                var fullPath = path + dir + "hotels" + Path.GetExtension(file.FileName);
                file.SaveAs(fullPath);

                var filePath = Server.MapPath("~/Upload_Files/xls/" + "hotels" + Path.GetExtension(file.FileName));
                // 读取Excel文件到DataSet中
                string cOnnStr= "";
                string fileType = System.IO.Path.GetExtension(filePath);
                if (!string.IsNullOrEmpty(fileType))
                {
            //支持文件格式不一样,Excel有 97-2003及2007格式 分别为 .xls和.xlsx
if (fileType == ".xls") { connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\""; } else { connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; } string sql_F = "Select * FROM [{0}]"; OleDbConnection conn = null; OleDbDataAdapter da = null; DataSet ds = new DataSet(); try { // 初始化连接,并打开 cOnn= new OleDbConnection(connStr); conn.Open(); // 初始化适配器 da = new OleDbDataAdapter(); da.SelectCommand = new OleDbCommand(String.Format(sql_F, "Sheet1$"), conn); DataSet dsItem = new DataSet(); da.Fill(dsItem, "t"); ds.Tables.Add(dsItem.Tables[0].Copy());               //这里的for是循环DataSet中的值并向数据库中插入 for (int i = 0; i 0].Rows.Count; i++) {
                  
var hotelName = dsItem.Tables[0];
                  //比如我们导入的 Excel表中有 四列
if (!_HotelRepository.IsExist(u => u.HotelName == hotelName)) {
                   //实例化一个User对象并赋值
User model= new User();
                   //这里是Excel表格中对应的列
model.UserName= dsItem.Tables[0].Rows[i]["用户名"].ToString();// model.Account= dsItem.Tables[0].Rows[i]["账号"].ToString(); model.Password= dsItem.Tables[0].Rows[i]["密码"].ToString();
                   //执行插入的方法
_UserRepository.Add(model); } } } catch (Exception ex) { } finally { // 关闭连接 if (conn.State == ConnectionState.Open) { conn.Close(); da.Dispose(); conn.Dispose(); } } } } catch (Exception ex) { } return ""; }

 

  具体的像数据库插入数据,这里就不多说了,方法有很多

 

注意:在后台读取解析Excel文件的时候如果遇到  “未在本地计算机上注册“Microsoft.Ace.OleDb.12.0”提供程序。”  遇到这个问题的时候,请自行百度下载一个 名为 AccessDatabaseEngine.exe的插件     百度直接搜索  “未在本地计算机上注册“Microsoft.Ace.OleDb.12.0”提供程序。”  也行

 

 


推荐阅读
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了Java调用Windows下某些程序的方法,包括调用可执行程序和批处理命令。针对Java不支持直接调用批处理文件的问题,提供了一种将批处理文件转换为可执行文件的解决方案。介绍了使用Quick Batch File Compiler将批处理脚本编译为EXE文件,并通过Java调用可执行文件的方法。详细介绍了编译和反编译的步骤,以及调用方法的示例代码。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • delphi里的当前路径是什么意思 到底是什么路径 就是ExtractFilePath(ParamStr(0))表示什么路径 还有
    ExtractFileDir:根据参数内容(绝对文件名)获取该文件所在的路径(不含最后面的那个斜杠)getcurrentdir:获取当前路径,但是注意,此项值在调用OPENDIAL ... [详细]
author-avatar
牛哥粉丝_对白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有