using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
public static class ExcelHelper
{

#region 导入

/// <summary>
/// 导入EXCEL(默认的sheet)
/// </summary>
/// <param name="fileName">excel文件路径</param>
/// <returns></returns>
public static System.Data.DataTable ImpExcelDt(string fileName)
{
return ImpExcelDt(fileName, "Sheet1");
}

/// <summary>
/// excel 导入
/// </summary>
/// <param name="fileName">excel文件路径</param>
/// <param name="sheetName"></param>
/// <returns></returns>
public static System.Data.DataTable ImpExcelDt(string fileName, string sheetName)
{
try
{
if (!File.Exists(fileName))
{
return null;
}

// 连接字符串: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混合模式

string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [" + sheetName + "$] ";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
DataSet myDataSet = new DataSet();
myCommand.Fill(myDataSet, "[" + sheetName + "$]");
myConn.Close();
System.Data.DataTable dt = myDataSet.Tables[0];
return dt;
}
catch (Exception ex)
{
throw ex;
}
}

#endregion

#region 导出到EXCEL

/// <summary>
/// 将数据导出到指定的Excel文件中
/// </summary>
/// <param name="listView">System.Windows.Forms.ListView,指定要导出的数据源</param>
/// <param name="destFileName">指定目标文件路径</param>
/// <param name="tableName">要导出到的表名称</param>
/// <param name="overWrite">指定是否覆盖已存在的表</param>
/// <returns>导出的记录的行数</returns>
public static int ExportToExcel(System.Data.DataTable dt, string destFileName, string tableName)
{
if (File.Exists(destFileName))
{
File.Delete(destFileName);
}

//得到字段名
string szFields = "";
string szValues = "";
for (int i = 0; i < dt.Columns.Count; i++)
{
szFields += "[" + dt.Columns[i] + "],";
}
szFields = szFields.TrimEnd(',');
//定义数据连接
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = GetConnectionString(destFileName);
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
//打开数据库连接
try
{
connection.Open();
}
catch
{
throw new Exception("目标文件路径错误。");
}

//创建数据库表
try
{
command.CommandText = GetCreateTableSql("[" + tableName + "]", szFields.Split(','));
command.ExecuteNonQuery();
}
catch (Exception ex)
{
//如果允许覆盖则删除已有数据
throw ex;
}
try
{
//循环处理数据------------------------------------------
int recordCount = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
szValues = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
szValues += "'" + dt.Rows[i][j] + "',";
}
szValues = szValues.TrimEnd(',');
//组合成SQL语句并执行
string szSql = "INSERT INTO [" + tableName + "](" + szFields + ") VALUES(" + szValues + ")";
command.CommandText = szSql;
recordCount += command.ExecuteNonQuery();
}
connection.Close();
return recordCount;
}
catch (Exception ex)
{
throw ex;
}
}

//得到连接字符串
private static String GetConnectionString(string fullPath)
{
string szConnection;
szConnection = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties=Excel 8.0;data source=" + fullPath;
return szConnection;
}

//得到创建表的SQL语句
private static string GetCreateTableSql(string tableName, string[] fields)
{
string szSql = "CREATE TABLE " + tableName + "(";
for (int i = 0; i < fields.Length; i++)
{
szSql += fields[i] + " VARCHAR(200),";
}
szSql = szSql.TrimEnd(',') + ")";
return szSql;
}
#endregion

}
}

//导入到数据库
var getDT= ExcelHelper.ImpExcelDt(@"F:\新建 XLS 工作表 (2).xls");
var rowcount = 0;
for (int i = 0; i < getDT.Rows.Count; i++)
{
var sql = "insert into Users values('";
sql += getDT.Rows[i].ItemArray[1]+"')";
rowcount+=DBHelper.ExecuteNonQuery(sql);
}

//导入到Excel
var dt = DBHelper.ExecuteDataSet("select * from Users").Tables[0];
var result= ExcelHelper.ExportToExcel(dt, @"F:\新建 XLS 工作表.xls", "Users");
Console.ReadKey();

HDR=Yes,这代表第一行是标题,不做为数据使用(但是我在实际使用中,如果第一行存在复杂数值,那么读取得到的Datatable列标题会自动设置为F1、F2等方式命名,与实际应用不符,所以当时是通过HDR=No方式将所有内容读取到Datatable中,然后手动将第一行设置成标题的);IMEX ( IMport EXport mode )设置  IMEX 有三种模式:  0 is Export mode  1 is Import mode  2 is Linked mode (full update capabilities)  我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:  当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。  当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。  当 IMEX=2 时为“链接模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。

---------------------------------

另外,读取Excel2007版本的文件时,版本应该从8.0改为12.0,同时驱动不能再用Jet,而应该用ACE。负责会造成“找不到可安装的 ISAM”的错误。

OLEDB导入导出Excel的更多相关文章

  1. 从SQL Server中导入/导出Excel的基本方法(转)

    从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...

  2. C#导入导出Excel表的数据

    一:C#导入导出EXCEL文件的类 代码如下: 首先将Microsoft Excel 14.0 Object Library 引用导入 using System; using System.Data; ...

  3. .Net core NPOI导入导出Excel

    最近在想.net core NPOI 导入导出Excel,一开始感觉挺简单的,后来真的遇到很多坑.所以还是写一篇博客让其他人少走一些弯路,也方便忘记了再重温一遍.好了,多的不说,直接开始吧. 在.Ne ...

  4. .NET 导入导出Excel

    第一种方式:OleDb 需要安装office,且读数据慢,而且有数据格式的Cell读出数据不正确等问题.放弃. 第二种方式:NPOI开源库 使用NPOI导入导出Excel应该是.NET开发很常用的手段 ...

  5. ASP.NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

  6. thinkphp导入导出excel表单数据

    在PHP项目经常要导入导出Excel表单. 先去下载PHPExcel类库文件,放到相应位置. 我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/ 导入 在页面上传e ...

  7. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  8. php中导入导出excel的原理

    在php中我们要经常导入导出excel文件,方便后台管理.那么php导入和导出excel的原理到底是什么呢?excel分为两大版本excel2007(后缀.xlsx).excel2003(后缀.xls ...

  9. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

随机推荐

  1. JNI 里使用STL

    JNI里的c或者c++ 调用stl 的时候,比如引入map头文件: #include <map> 在cygwin使用NDK编译的时候,会提示: fatal error:map: No su ...

  2. C++Primer笔记-----day06

    ================================================================day06=============================== ...

  3. 【摘录】UNITY优化-有关骨骼数量的上限问题

    1.顶点性能一般来说,如果您想在iPhone 3GS或更新的设备上每帧渲染不超过40,000可见点,那么对于一些配备 MBX GPU的旧设备(比如,原始的 iPhone,如 iPhone 3g和 iP ...

  4. java算法 第七届 蓝桥杯B组(题+答案) 9.取球博弈

    9.取球博弈  (程序设计) 两个人玩取球的游戏.一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目.如果无法继续取球,则游戏结束.此时,持有奇数个球的一方获胜.如果两人都是 ...

  5. MenuItem属性

    [MenuItem属性] The MenuItem attribute allows you to add menu items to the main menu. The MenuItem attr ...

  6. Cassandra读写性能测试

    1. 测试目的 测试Cassandra集群读写TPS的极值,确定Cassandra读写性能. 2. 测试环境 2.1 硬件信息 CPU 8核 Intel(R) Xeon(R) CPU E5-2650 ...

  7. 使用Django完成CRM管理系统

    CRM介绍: CRM即客户关系管理,是指企业用CRM技术来管理与客户之间的关系.在不同场合下,CRM可能是一个管理学术语,可能是一个软件系统.通常所指的CRM,指用计算机自动化分析销售.市场营销.客户 ...

  8. 【BZOJ3998】弦论 【后缀自动机】

    题意 给定一个长度为n的字符串,求他的第k小子串是什么. 分析 T=0的时候,这个题跟SPOJ-SUBLEX的做法一样,当T=1的时候,不同位置的子串算多个,那么初始化的时候d[u]=cnt[u],没 ...

  9. 【总结整理】UGC内容

    除了内容了产品,还有什么适合引入UGC? :引发讨论,诱导参与,然后促成销售. User Generated Content,也就是用户生成内容的意思. 购买类产品,内容催生购买 1.为用户购买提供思 ...

  10. qt的exe文件查找依赖的dll

    用qtcreater编译完工程生成的exe文件往往会依赖dll文件.如何一次定位exe文件所以依赖的所有dll文件呢,今天发现了软件叫hap-depends. 截图如下: 用这个软件打开exe文件就会 ...