添加"Microsoft Office 12.0 Object Library" com组件  1 using System;
 using System.Data;
 using System.Data.OleDb;
 using System.IO;
 using System.Text;

 namespace Test
 {
     public class DataAccess_Excel
     {
         private string GetConnectionString(string path)
         {
             string extension = Path.GetExtension(path).ToUpper();
             if (".XLS".Equals(extension))
                 return GetXLSConnStr(path);
             else if (".XLSX".Equals(extension))
                 return GetXLSXConnStr(path);
             else
                 return null;
         }

         /// <summary>
         /// "HDR=Yes:"用于指示将Excel表格中的第一行作为标题,此时在查询语句中可以将标题作为数据表的字段名使用"
         /// "HDR= No:"则表示将Excel表格中的所有行都作为数据内容而不包含标题"
         /// </summary>
         /// <param name="path"></param>
         /// <returns></returns>
         private string GetXLSConnStr(string path)
         {
             StringBuilder sb = new StringBuilder();
             sb.Append("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
             sb.Append(path);
             sb.Append(";Extended Properties='Excel 8.0;HDR=YES;'");
             return sb.ToString();
         }

         private string GetXLSXConnStr(string path)
         {
             StringBuilder sb = new StringBuilder();
             sb.Append("Provider=Microsoft.ACE.OLEDB.12.0;");
             sb.Append("Data Source=" + path + ";");
             sb.Append("Properties='Excel 12.0;HDR=YES'");
             return sb.ToString();
         }

         /// <summary>
         /// 用来获取数据连接
         /// </summary>
         /// <param name="path">excel文件的路径</param>
         /// <returns>返回一个OleDbConnection对象</returns>
         private OleDbConnection GetConnection(string path)
         {
             string conString = GetConnectionString(path);
             OleDbConnection oleConnection = new OleDbConnection(conString);
             try
             {
                 oleConnection.Open();
             }
             catch (Exception ex)
             {
                 throw ex;
             }
             return oleConnection;
         }

         /// <summary>
         /// 从EXCEL中获取第一个SHEET的名称
         /// 注意Excel wooksheet的名字必须以"$"结尾并且包含在方括号中。列名如有需要也应当包含在方括号中(如列名中包含有空格其它特殊字符等)。
         /// </summary>
         /// <param name="path"></param>
         /// <returns></returns>
         private string GetSheetName(string path)
         {
             try
             {
                 string tableName = string.Empty;
                 DataTable dt = null;
                 using (OleDbConnection oleConnection = GetConnection(path))
                 {
                     dt = oleConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                 }
                 )
                 {
                     tableName = dt.Rows[][].ToString().Trim();
                     if (!tableName.Contains("$"))
                     {
                         tableName += "$";
                     }
                     tableName = "[" + tableName + "]";
                 }
                 return tableName;
             }
             catch (Exception ex)
             {
                 throw ex;
             }
         }

         /// <summary>
         /// 修改数据
         /// </summary>
         /// <param name="path">excel文件路径</param>
         /// <returns>sql语句</returns>
         public int ExecuteNonQuery(string path, string sql)
         {
             ;
             try
             {
                 using (OleDbConnection oleConnection = GetConnection(path))
                 {
                     OleDbCommand oleCommand = oleConnection.CreateCommand();
                     oleCommand.CommandText = sql;
                     oleCommand.CommandType = CommandType.Text;
                     i = oleCommand.ExecuteNonQuery();
                 }
             }
             catch (Exception ex)
             {
                 throw ex;
             }
             return i;
         }

         /// <summary>
         /// 查询数据
         /// </summary>
         /// <param name="path">excel文件路径</param>
         /// <returns>sql语句</returns>
         public DataTable ExecuteQuery(string path, string sql)
         {
             DataTable dt = null;
             try
             {
                 dt = new DataTable();
                 dt.TableName = GetSheetName(path);
                 using (OleDbConnection oleConnection = GetConnection(path))
                 {
                     OleDbCommand oleCommand = oleConnection.CreateCommand();
                     oleCommand.CommandText = sql;
                     oleCommand.CommandType = CommandType.Text;
                     OleDbDataAdapter oleAdapter = new OleDbDataAdapter(oleCommand);
                     oleAdapter.Fill(dt);
                 }
             }
             catch (Exception ex)
             {
                 throw ex;
             }
             return dt;
         }

         /// <summary>
         /// 获取excel文件中的数据,默认从sheet1中获取数据,如果sheet1中没有数据,则从nicelabel中获取数据
         /// </summary>
         /// <param name="path">excel文件路径</param>
         /// <returns>返回一个DataTable</returns>
         public DataTable GetDataFromExcelFile(string path)
         {
             string sheetName = GetSheetName(path);
             string sql = string.Format(@"Select * From {0}", sheetName);
             return ExecuteQuery(path, sql);
         }

         /// <summary>
         /// 创建表并插入数据
         /// </summary>
         /// <param name="dgv">DataGridView对象</param>
         /// <param name="path">excel 文件路径</param>
         /// <param name="row">表示哪一行</param>
         public void CreateTableAndInsertValue(DataTable dt, string path, int? row = null)
         {
             CreateTable(dt, path);
             InsertData(dt, path, row);
         }

         /// <summary>
         /// 创建表单
         /// </summary>
         /// <param name="dgv"></param>
         /// <param name="path"></param>
         public void CreateTable(DataTable dt, string path)
         {
             StringBuilder createSql = new StringBuilder();
             createSql.Append(string.Format("Create Table {0}",dt.TableName));
             createSql.Append(" ( ");
             ; i < dt.Columns.Count; i++)
             {
                 createSql.Append("[");
                 createSql.Append(dt.Columns[i].ColumnName);
                 createSql.Append("]");
                 createSql.Append(" memo");
                 )
                     createSql.Append(",");
             }
             createSql.Append(" )");
             ExecuteNonQuery(path, createSql.ToString());
         }

         /// <summary>
         /// 插入表数据
         /// </summary>
         /// <param name="dgv">表单</param>
         /// <param name="path">文件路径</param>
         /// <param name="row">如果ROW为NULL,则插入所有数据,否则只插入特定行的数据</param>
         public void InsertData(DataTable dt, string path, int? row = null)
         {
             ;
             ;
             if (row == null)
             {
                 rowFrom = ;
                 rowEnd = dt.Rows.Count;
             }
             else
             {
                 rowFrom = row.Value;
                 rowEnd = rowFrom + ;
             }
             for (int rowIndex = rowFrom; rowIndex < rowEnd; rowIndex++)
             {
                 string insertSql = GetInsertSql(dt.Rows[rowIndex]);
                 ExecuteNonQuery(path, insertSql);
             }
         }

         /// <summary>
         /// 插入数据
         /// </summary>
         public int InsertData(DataRow dr, string path)
         {
             string insertSql = GetInsertSql(dr);
             return ExecuteNonQuery(path, insertSql);
         }

         private string GetInsertSql(DataRow dr)
         {
             StringBuilder insertSql = new StringBuilder();
             insertSql.Append(string.Format("Insert Into {0} Values ",dr.Table.TableName));
             insertSql.Append(" ( ");
             int columnCount = dr.Table.Columns.Count;
             ; j < columnCount; j++)
             {
                 if (dr.Field<string>(j) != null)
                 {
                     insertSql.Append("'");
                     insertSql.Append(dr.Field<string>(j).Replace("'", "''"));
                     insertSql.Append("'");
                 }
                 else
                 {
                     insertSql.Append("''");
                 }
                 )
                     insertSql.Append(",");
             }
             insertSql.Append(")");
             return insertSql.ToString();
         }

            //使用OLEDB无法直接删除excel中的数据,需要先删除原数据文件,然后重新CreateTable
     }
 }

.Net com组件操作excel(不建议采用Com组件操作excel)的更多相关文章

  1. [改善Java代码]建议采用的顺序是 List&lt;T&gt;、List&lt;?&gt;、List&lt;Object&gt;

    建议98:建议采用的顺序是 List<T>.List<?>.List<Object> List<T>.List<?>.List<Obj ...

  2. 代码走查工具StyleCop建议采用的规则总结

    代码走查工具StyleCop建议采用的规则总结 续接上篇:代码走查工具篇SytleCop的规则总结与翻译,本篇主要是以我个人的观点总结的一份建议使用的Rule点. 建议使用的Rule点 1.公共的接口 ...

  3. 用Excel做出比肩任务管理软件的操作技巧

    用Excel做出比肩任务管理软件的操作技巧 在项目管理中,网上有各种各样的工具可以选择,到底用哪个,曾一度困扰着我.我是一个有轻度强迫症的人,总是喜欢试用各种各样的系统,以比较他们之间的不同,试图选择 ...

  4. 从DOM操作看Vue&amp;React的前端组件化,顺带补齐React的demo

    前言 接上文:谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo 上次写完博客后,有朋友反应第一内容有点深,看着迷迷糊糊:第二是感觉没什么使用场景,太过业务化,还不如直接写Vue ...

  5. C#中的Excel操作【1】——设置Excel单元格的内容,打开Excel文件的一种方式

    前言 作为项目管理大队中的一员,在公司里面接触最多的就是Excel文件了,所以一开始就想从Excel入手,学习简单的二次开发,开始自己的编程之路! 程序界面 功能说明 打开文件按钮,可以由使用者指定要 ...

  6. RESTORE 无法处理数据库 &#39;Students&#39;,因为它正由此会话使用。建议在执行此操作时使用 master 数据库。

    恢复数据库是总弹出报错对话框如下:RESTORE 无法处理数据库 'Students',因为它正由此会话使用.建议在执行此操作时使用 master 数据库.RESTORE DATABASE 正在异常终 ...

  7. C# 读取Excel,一波华丽的操作

    C# 读取Excel,其实有很多方法.但是今天要来一波华丽的操作. 先看效果: 以上这波操作使用了 ExcelDataReader 和 ExcelDataReader.DataSet 完成的. Exc ...

  8. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  9. 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串

    最近拜读了陆敏技老师的<编写高质量代码改善C#程序的157个建议>,感觉不错,决定把笔记整理一遍. 建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使 ...

随机推荐

  1. mysql初级命令

    修改本地mysql root密码 #mysqladmin -uroot -p原密码 password  现密码 #mysqladmin -uroot -p passwd  password nowwd ...

  2. 安装Windows10,Ubuntu双系统14.04LTS记录

    参考链接:http://www.jianshu.com/p/2eebd6ad284d(推荐直接看这个链接,我也是看这篇博客装的)然后自己记录一下,防止以后找不到了 本记录是在Windows10 上安装 ...

  3. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  4. [BI项目记]-搭建代码管理环境之创建团队项目

    此篇主要介绍如何基于TFS环境创建团队项目来进行项目代码的版本管理工作,这一系列将侧重于BI项目,当然对于其它项目也同样适用. 在TFS里开始一个项目,我们首先需要创建一个团队项目. 在Team Ex ...

  5. 无废话SharePoint入门教程三[创建网站集和网站]

    一.前言 前两篇文章讲解了什么是SharePoint,并且介绍了在SharePoint中一些常用的概念.但概念终究是概念,我们还是要脚踏实地的去动手实践.下面的文章对于了解SharePoint的人来说 ...

  6. HTTP 2.0的那些事

    转自:http://www.admin10000.com/document/9310.html 在我们所处的互联网世界中,HTTP协议算得上是使用最广泛的网络协议.最近http2.0的诞生使得它再次互 ...

  7. 解决Win10默认占用80端口

    方案1: 以管理员身份运行cmd;输入net stop http;如果提示是否真的需要停止这些服务,则选择“Y”;完成后输入:sc config http start=disabled 方案2: Ct ...

  8. [转]PHP Session原理分析及使用

    之前在一个叫魔法实验室的博客中看过一篇<php session原理彻底分析>的文章,作者从session的使用角度很好阐述了在代码运行过程中,每个环节的变化以及相关参数的设置及作用.本来想 ...

  9. 【转】JAVA程序中Float和Double精度丢失问题

    原文网址:http://blog.sina.com.cn/s/blog_827d041701017ctm.html 问题提出:12.0f-11.9f=0.10000038,"减不尽" ...

  10. C#:装箱和拆箱相关知识整理

    1.装箱和拆箱是一个抽象的概念   2. 装箱是将值类型转换为引用类型 ;   拆箱是将引用类型转换为值类型   利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型 ...