`

C#使用OleDb读取Excel,生成SQL语句

阅读更多

C#使用OleDb读取Excel,生成SQL语句

      之前在C#读取Excel数据动态生成对象并进行序列化也要对读取Excel文件,那时用的是Microsoft.Office.Interop.Excel组件,有一个致命的问题:读取效率低到不能忽略。所以一直想着有机会去换一个读取的机制,上网google了下,发现使用OleDb读写的效率是很不错的,所以在写把Excel的数据导成SQL语句的工具时,我就使用了OleDb,效率那是毫无疑问的。其实使用Microsoft.Office.Interop.Excel组件去读取Excel是相当于打开一个excel程序,而OleDb其实就是对Excel按数据库的方式进行读写。

     少说废话,直接贴代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
namespace ReadXlsxData
{
    static class ParseXlsx
    {
        public static readonly int COMMENT_INDEX=4;   //字段说明行下标
        public static readonly int KEY_INDEX = 5;    //主键行下标
        public static readonly int TYPE_INDEX = 6;   //字段类型行下标
        public static readonly int SQLNAME_INDEX = 7;      //数据库字段名行下标
        public static readonly int VALUE_INDEX = 8;      //value 行下标
        public static StringBuilder objectData = new StringBuilder();
        public static DataTable ToDataSet(string filePath)
        {
            string connStr = "";
           
            string fileType = System.IO.Path.GetExtension(filePath);
            if (string.IsNullOrEmpty(fileType)) return null;
            if (fileType == ".xls")
                connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"";
            else
                connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\"";
            string sql_F = "Select * FROM [{0}]";
            OleDbConnection conn = null;
            OleDbDataAdapter da = null;
            DataTable dataTable = new DataTable();
            try
            {
                // 初始化连接,并打开                  
                conn = new OleDbConnection(connStr);
                conn.Open();
                da = new OleDbDataAdapter();
                da.SelectCommand = new OleDbCommand(String.Format(sql_F, "Sheet1$"), conn);
                da.Fill(dataTable);
            }
            catch (Exception ex)
            {

            }
            finally
            {                  // 关闭连接                  
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    da.Dispose();
                    conn.Dispose();
                }
            }
            conn.Close();
            da.Dispose();
            conn.Dispose();
            return dataTable;
        }
        public static string ReadExcelFile(string namef, string sqlfile, string sqlcomment)
        {
            objectData.Clear();
            DataTable dt = ToDataSet(namef);
            string temp, key,temp1,temp2;
            List<int> index = new List<int>();
         
            //创建表头
            objectData.Append("DROP TABLE IF EXISTS `" + sqlfile + "`;\n");
            objectData.Append("CREATE TABLE `" + sqlfile + "` (\n");
            int columnSize = dt.Columns.Count;
            int rowSize = dt.Rows.Count;
            DataColumn dc;
            DataRow dr;
            temp = string.Empty;
            key = string.Empty;
            temp1 = string.Empty;
            temp2 = string.Empty;
            DataRow dr5 = dt.Rows[COMMENT_INDEX],dr9=dt.Rows[SQLNAME_INDEX],dr8=dt.Rows[TYPE_INDEX];
            for (int i = 1; i < columnSize; i++)
            {
                dc = dt.Columns[i];
                temp2 = dr5[dc].ToString();
                temp1 = dr9[dc].ToString();
                if (temp2 == string.Empty)//空列判断
                    break;
                else if (temp1.ToString() != string.Empty)  //数据库字段
                {
                    index.Add(i);
                    temp = dr8[dc].ToString();
                    if (temp.Contains("vachar"))
                        objectData.Append("\t`" + temp1 + "` " + temp + " NOT NULL DEFAULT '' COMMENT '" + temp2 + "',\n");
                    else
                        objectData.Append("\t`" + temp1 + "` " + temp + " NOT NULL DEFAULT '0' COMMENT '" + temp2 + "',\n");
                    temp = dt.Rows[KEY_INDEX][dc].ToString();
                    if (temp != null && temp.Contains("key"))
                    {
                        key += "`" + temp1 + "` ";

                    }

                }
            }
            if(key!=string.Empty)
                objectData.Append("\tPRIMARY KEY (" + key + ")\n");
            objectData.Append(") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='" + sqlcomment + "';\n");
            for (int i = VALUE_INDEX; i < rowSize; i++)   //读取数据记录
            {
                objectData.Append("INSERT INTO `" + sqlfile + "` VALUES ('");
                dr = dt.Rows[i];
                int length = index.Count;
                for (int j = 0; j < length; j++)
                {
                    objectData.Append(dr[index[j]] + "','");
                }
                objectData.Remove(objectData.Length - 3, 2);
                objectData.Append(");\n");
            }  
            return objectData.ToString();
        }
    }
 

}

 注:这段代码去掉了通用性,只考虑了读取Excel第一个sheet的情况。

    下面附上自己做的例子:

 
         

        转载在文首注明出处:http://dsqiu.iteye.com/blog/1895255

更多精彩请关注D.S.Qiu的博客和微博(ID:静水逐风)
 

 

 

 

 

参考:

Jyson: http://www.cnblogs.com/jys509/archive/2011/07/25/2116143.html

  • 大小: 111.3 KB
  • 大小: 109.5 KB
1
2
分享到:
评论
1 楼 sdgxxtc 2017-03-10  
[quo[color=red]te][/color]

相关推荐

    使用C#开发的Sqlite数据库创建、操作的源码项目工程

    这是一个使用C#开发的Sqlite数据库创建、操作的源码工程,关于Sqlite的所有操作已经单独创建了专门的跨平台【.NETCore3.1】类库包含相应的帮助类,可以直接生成后拿到任何项目中直接使用,高效简单,省去了从头开发...

    excel导入sql2005的几种方法归纳

    方法二、在查询分析器里,直接写 SQL语句: 1、如果是导入数据到现有表,则采用 INSERT INTO 表 SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$) 的形式 2...

    C#连接数据库源码下载

     实例260 使用OLE DB连接SQL Server数据库 365  实例261 建立SQL Server数据库连接 366  9.3 连接其他数据库 367  实例262 连接Excel 367  实例263 连接Oracle数据库 368  9.4 数据库结构的...

    C# 调用DBF DBF2SQL

    这是本人花了两天时间编写的,一个完全不依赖第三方(如odbc、jet等)直接读取...支持dbf导出sql建表语句及insert语句以及返回datatable类型。具体参考http://blog.csdn.net/xiaowu218/archive/2010/08/13/5809804.aspx

    非常实用c#操作Access数据库的例子(application)

    使用OleDbCommand类来执行Sql语句: OleDbCommand cmd = new OleDbCommand(sql, connection); connection.Open(); cmd.ExecuteNonQuery(); 2.取得Access自增标识字段在插入数据后的id值 cmd.CommandText = @"select ...

    C#程序开发范例宝典9

    366 9.3 连接其他数据库 367 实例262 连接Excel 367 实例263 连接Oracle数据库 368 9.4 数据库结构的读取与修改 369 实例264 读取SQL Server数据库结构 369 实例265 修改SQL Server...

    C#基类库(苏飞版)

    使用C#实现对Sql数据库的操作,执行存储过程,Sql语句,返回影响行数,返回DateTable,DataSet,DataReader,以及表集等方法。实现多个数据库的切换功能。功能强大,希望大家喜欢 2.一个操作Sql2005数据库的类(备份...

    DBHelper(C#, SqlHelper + OledbHelper)

    里面已经打包好Sql数据库操作类,和Oledb的操作类,只需要引用这个dll后,在webconfig(或appconfig)的connectionstrings字段或者appsetting字段里配置一个名为ConnString的节点,dll就会自动读取,或者在global的...

    C#.net_经典编程例子400个

    273 实例190 获取窗口文本 273 实例191 判断文件是否正在被使用 274 实例192 在程序中调用.HLP文件 275 实例193 C#中实现文件拖放 276 实例194 文件比较 276 第7章 操作系统与Windows...

    C#程序开发范例宝典(第2版).part08

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

    NET公共类库[转发]

    Oledb操作辅助类 OleDbHelper.cs 使用OleDb数据源执行SQL语句 ?Common Class Name File Function 执行命令类 CmdUtil.cs 执行各类命令;如:cmd.exe 公历/农历类 CNDate.cs 公历、农历、星座、气节等相关转换 日期格式...

    C#程序开发范例宝典(第2版).part02

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

    C#程序开发范例宝典(第2版).part12

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

    C#程序开发范例宝典(第2版).part13

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

Global site tag (gtag.js) - Google Analytics