添加"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);
}
if (dt.Rows.Count > )
{
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)
{
int i = -;
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(" ( ");
for (int i = ; i < dt.Columns.Count; i++)
{
createSql.Append("[");
createSql.Append(dt.Columns[i].ColumnName);
createSql.Append("]");
createSql.Append(" memo");
if (i != dt.Columns.Count - )
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)
{
int rowFrom = ;
int rowEnd = ;
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;
for (int j = ; j < columnCount; j++)
{
if (dr.Field<string>(j) != null)
{
insertSql.Append("'");
insertSql.Append(dr.Field<string>(j).Replace("'", "''"));
insertSql.Append("'");
}
else
{
insertSql.Append("''");
}
if (j != columnCount - )
insertSql.Append(",");
}
insertSql.Append(")");
return insertSql.ToString();
} //使用OLEDB无法直接删除excel中的数据,需要先删除原数据文件,然后重新CreateTable
}
}

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

  1. [改善Java代码]建议采用的顺序是 List<T>、List<?>、List<Object>

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

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

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

  3. Qt中容器类应该如何存储对象(最好使用对象指针类型,如:QList<TestObj*>,而不要使用 QList<TestObj> 这样的定义,建议采用 智能指针QSharedPointer)

    Qt提供了丰富的容器类型,如:QList.QVector.QMap等等.详细的使用方法可以参考官方文档,网上也有很多示例文章,不过大部分文章的举例都是使用基础类型:如int.QString等.如果我们 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. D - 湫湫系列故事——减肥记II

    虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但是没有什么能难倒高智商美女湫湫的,她决定另寻对策——吃没关系,咱吃进去再运动运动消耗掉不就好了? 湫 ...

  2. WIN10 vagrant和virtualbox虚拟机和一键搭建lnmp环境配置thinkphp虚拟主机

    版本:win10系统 virtualbox:5.1.26 vagrant :1.9.7 centos 7.0 xshell/git 首先下载好对应版本的软件 配置vagrant和virtualbox ...

  3. 路由器基础设置之ospf

    我们将以上面的拓扑图来进行实验,要用ospf的协议达到全网互通的效果 router1: enable 进入特权模式 config t 进入全局配置模式 interface L0 ip address ...

  4. Linux之redis主从复制

    redis集群中的数据库复制就是通过主从同步实现的 主节点Master把数据分发给节点Salve 主从同步的好处在高可用, redis节点有冗余设计 redis主从同步的原理 1. 从服务器向主服务器 ...

  5. [转]select top n 动态赋值

    怎样实现 select top n 语句中 n 的动态赋值呢?怎样实现 select   top   n   语句中 n 的动态赋值,求教各位了. 要把这个n值传到存储过程中,再加入 select t ...

  6. Scala语法(三)

    模式匹配 1)match val a = 1 val b=a match { *// a match { }返回值赋予变量 b case 1 => "red" case 2 ...

  7. u-boot、kernel、root系统烧写和挂载命令命令

    一.uboot 环境变量: 1. 打印环境变量:# print 2. 设置启动参数# set bootargs noinitrd init=/linuxrc console=ttySAC0,11520 ...

  8. python应用:爬虫实例(动态网页)

    以爬取搜狗图片为例,网页特点:采用“瀑布流”的方式加载图片,图片的真实地址存放在XHR中 #-*-coding:utf8-*- import requests import urllib import ...

  9. 2019-04-10 python入门学习——教材和工具准备

    # 从决定学习编程语言到正式做出计划挤出空余时间,历经一年半,因工作原因及生活原因不断搁浅,从湖北到浙江再回湖北,暂时稳定在一家小公司,从日常加班中压缩时间学习,于此记录学习进度.学习问题,在此过程中 ...

  10. 反向代理服务器——nginx

    一.概述 先来看百度百科的介绍: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强 ...