EXCEL数据导入数据库
using System;
using System.Data;
using System.Collections;
using System.Data.OleDb;
namespace HKH.Common
{
/// <summary>
/// Excel 表格中 列标头 与 列索引 的对应转换
/// </summary>
/// <remarks>Create By Liwt on 2006 - 09 - 15
/// </remarks>
enum EnumExcelColumn
{
A = 0,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,
AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ,
BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ,
CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO,CP,CQ,CR,CS,CT,CU,CV,CW,CX,CY,CZ,
DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DO,DP,DQ,DR,DS,DT,DU,DV,DW,DX,DY,DZ,
EA,EB,EC,ED,EE,EF,EG,EH,EI,EJ,EK,EL,EM,EN,EO,EP,EQ,ER,ES,ET,EU,EV,EW,EX,EY,EZ,
FA,FB,FC,FD,FE,FF,FG,FH,FI,FJ,FK,FL,FM,FN,FO,FP,FQ,FR,FS,FT,FU,FV,FW,FX,FY,FZ,
GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK,GL,GM,GN,GO,GP,GQ,GR,GS,GT,GU,GV,GW,GX,GY,GZ,
HA,HB,HC,HD,HE,HF,HG,HH,HI,HJ,HK,HL,HM,HN,HO,HP,HQ,HR,HS,HT,HU,HV,HW,HX,HY,HZ,
IA,IB,IC,ID,IE,IF,IG,IH,II,IJ,IK,IL,IM,IN,IO,IP,IQ,IR,IS,IT,IU,IV
}
/// <summary>
/// 从Excel导入数据到DataSet,带有虚函数的基类
/// </summary>
/// <remarks>Create By Liwt on 2006 - 09 - 15
/// </remarks>
public class clsImportExcel
{
#region 变量
protected String m_MappingFile; //映射配置文件路径
protected String m_ExcelSheetName; //Excel中要导入数据的表名
protected String m_SqlTableName; //要导入的Sql表名,也可为其它类型的,如Oracle
protected ArrayList[] m_ColumnMapping; //列映射配置列表,包括3部分 0--Sql列名,1--Excel列索引
//2-- 如当前Excel行为空,是否赋值为上一行的值
private bool isLoadMapping;
#endregion
#region 构造函数
/// <summary>
/// 无参构造
/// </summary>
public clsImportExcel()
{
m_MappingFile = "";
m_ExcelSheetName = "";
isLoadMapping = false;
m_ColumnMapping = new ArrayList[3];
m_ColumnMapping[0] = new ArrayList();
m_ColumnMapping[1] = new ArrayList();
m_ColumnMapping[2] = new ArrayList();
}
/// <summary>
/// 构造函数重载
/// </summary>
/// <param name="mappingFilePath">映射配置文件路径</param>
/// <param name="excelSheetName">Excel中要导入数据的表名</param>
public clsImportExcel(String mappingFilePath, String excelSheetName)
{
m_MappingFile = mappingFilePath;
m_ExcelSheetName = excelSheetName;
isLoadMapping = false;
m_ColumnMapping = new ArrayList[3];
m_ColumnMapping[0] = new ArrayList();
m_ColumnMapping[1] = new ArrayList();
m_ColumnMapping[2] = new ArrayList();
}
#endregion
#region 属性
/// <summary>
/// 读取或设置 映射配置文件路径
/// </summary>
public String MappingFilePath
{
get
{
return m_MappingFile;
}
set
{
m_MappingFile = value;
isLoadMapping = false;
}
}
/// <summary>
/// 读取或设置 Excel中要导入数据的表名
/// </summary>
public String ExcelSheetName
{
get
{
return m_ExcelSheetName;
}
set
{
m_ExcelSheetName = value;
isLoadMapping = false;
}
}
#endregion
#region 公共方法
/// <summary>
/// 导入数据
/// </summary>
/// <param name="excelFilePath">要导入的Excel文件路径</param>
/// <param name="dsTarget">目标DataSet</param>
/// <returns>ture -- 成功, false -- 失败
/// </returns>
public bool Import(String excelFilePath,ref DataSet dsTarget)
{
try
{
if (!isLoadMapping)
{
if (!LoadMapping())
{
return false;
}
}
//利用Ole读取Excel数据
OleDbConnection oleConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + excelFilePath + ";");
OleDbDataAdapter oleDA = new OleDbDataAdapter("SELECT * FROM [" + m_ExcelSheetName + "$]",oleConn);
DataSet dsExcel = new DataSet();
oleDA.Fill(dsExcel,m_ExcelSheetName);
oleDA.Dispose();
oleConn.Dispose();
//对建立数据行缓存,以备填充对空单元格进行处理
DataRow tempRow = dsExcel.Tables[m_ExcelSheetName].Rows[0];
for ( int i = 0 ;i<dsExcel.Tables[m_ExcelSheetName].Rows.Count; i ++ )
{
DataRow excelRow = dsExcel.Tables[m_ExcelSheetName].Rows[i];
//调用导入前数据处理函数,并根据返回值确定下一步处理
if (!ImportingBefore(ref excelRow))
{
continue;
}
DataRow sqlNewRow = dsTarget.Tables[0].NewRow();
for ( int j = 0 ;j<m_ColumnMapping[0].Count; j ++ )
{
String sqlColName = m_ColumnMapping[0][j].ToString();
int excelColindex = (int)m_ColumnMapping[1][j];
bool inherit = Convert.ToBoolean(m_ColumnMapping[2][j]);
//如果当前行当前列为空
if (Convert.IsDBNull(excelRow[excelColindex]))
{
//如果允许以临时值填充
if (inherit)
{
sqlNewRow[sqlColName] = tempRow[excelColindex];
}
}
else
{
//填充数据,更新缓存行数据
sqlNewRow[sqlColName] = excelRow[excelColindex];
tempRow[excelColindex] = excelRow[excelColindex];
}
}
//调用导入后数据处理,并根据返回值决定下一步处理
if (ImportingAfter(ref sqlNewRow))
{
dsTarget.Tables[0].Rows.Add(sqlNewRow);
}
}
return true;
}
catch
{
return false;
}
}
#endregion
#region 受保护的虚函数,子类须重写
/// <summary>
/// 在导入前对Excel行数据进行处理
/// </summary>
/// <param name="drExcelRow">正在读取的当前Excel行</param>
/// <returns>true -- 继续处理,false -- 跳过当前行
/// </returns>
protected virtual bool ImportingBefore(ref DataRow drExcelRow)
{
return true;
}
/// <summary>
/// 在数据转存后对当前行进行处理
/// </summary>
/// <param name="drSqlRow">已经转存数据的当前Sql行</param>
/// <returns>true -- 继续处理,false -- 跳过当前行
/// </returns>
protected virtual bool ImportingAfter(ref DataRow drSqlRow)
{
return true;
}
#endregion
#region 私有方法
/// <summary>
/// 加载配置文件,取得表和列的映射
/// </summary>
/// <returns></returns>
private bool LoadMapping()
{
try
{
//清除已过时的配置
m_ColumnMapping[0].Clear();
m_ColumnMapping[1].Clear();
m_ColumnMapping[2].Clear();
if (m_MappingFile == null || m_MappingFile == "")
{
throw new Exception("找不到配置文件");
}
//读入配置文件
DataSet dsMaping = new DataSet();
dsMaping.ReadXml(m_MappingFile);
if (dsMaping.Tables.Count == 0)
{
throw new Exception("读取配置文件失败");
}
//读取表映射
DataRow[] tableMap = dsMaping.Tables["TableMapping"].Select("excelSheet='" + m_ExcelSheetName + "'");
if (tableMap.Length != 1)
{
throw new Exception("该Sheet不存在或多次配置");
}
//读取列映射
DataRow[] colMap = dsMaping.Tables["ColumnMapping"].Select("TableMapping_id="+tableMap[0]["TableMapping_id"].ToString());
if (colMap.Length <= 0)
{
throw new Exception("没有为该表配置列映射");
}
for (int i = 0; i < colMap.Length; i ++)
{
m_ColumnMapping[0].Add(colMap[i]["sqlCol"]);
m_ColumnMapping[1].Add((int)Enum.Parse(typeof(EnumExcelColumn),colMap[i]["excelCol"].ToString(),true));
m_ColumnMapping[2].Add(colMap[i]["inherit"]);
}
//设置为已加载配置
isLoadMapping = true;
return true;
}
catch
{
return false;
}
}
#endregion
}
}
2、配置文件XSD
3、 配置文件样例
excelSheet ----要导入数据库的EXCEL文件中的工作薄名
SQLTABLE---要导入的数据库表名
EXCELCOL--EXCEL表中列标头
SQLCOL--SQL数据库中列名
inherit---当EXCEL中有表格合并时,是否继续上面的单元格值,此处用于拆解单元格,本处指合并行,TRUE为拆解,即所有单元格都以合并值填充,为FALSE则第一行为填充值,其它各行以空填充
<ImportConfiguration>
<TableMapping excelSheet="Sheet1" sqlTable="CNKI_illegalIPInfo">
<ColumnMapping excelCol="A" sqlCol="UnitName" inherit="false"/>
<ColumnMapping excelCol="B" sqlCol="StartIP" inherit="false"/>
<ColumnMapping excelCol="C" sqlCol="EndIP" inherit="false"/>
</TableMapping>
</ImportConfiguration>
相关文章:

免费正则表达式辅助工具(转)
免费正则表达式辅助工具 前段时间由于工作需要,学了一天的正则表达式,发现正则表达式功能实在是强大,但是也很奇怪,刚接触会很不习惯。我不需要很深入地了解,所以也没学多久,不过找了几款很不错的免费的正则…

@所有人,CSDN 粉丝专属福利来啦!
属于CSDN粉丝专属福利来了!不一样的专属福利,只属于少数人的免费计算资源!即日起,并行科技联袂CSDN针对社区粉丝,推出“免费算力限时领”活动,新用户填写表单,即可获得“5000核时CPU或500元卡时…

算法:快速排序实现 定制比较函数
1. 快速排序基本算法 1 #include<stdio.h>2 const static int NUM 47; 3 4 int quick_sort(int *a, int start, int end){5 if (start > end) 6 return 0; 7 8 int partition a[start]; //分割点value, 设置为第一个点.最后patition点设置为这个…

人民币大小写转换
using System;using System.Text;using System.Text.RegularExpressions; namespace HKH.Common{ /// <summary> /// 人民币大小写格式转换 /// </summary> /// <remarks> Create By Lwt on 2006/09/23 /// </remarks> public class clsRMB { privat…

冒泡排序(java实现)
冒泡排序,就是每次遍历都会把最小(或者最大)的数放在前面。比如要升序{A1,........An} 第一次排序要取出整个数组中最小放在A1的位置,从An开始往前遍历,相邻两个数比较,如果Aj < Aj-1 则换位。知道比较到A1 这一趟完事之后 A…

好看又好用的 GUI,你需要这七个 Python 必备库,
来源 | 法纳斯特头图 | 下载于ICphotoGUI(图形用户界面),顾名思义就是用图形的方式,来显示计算机操作的界面,更加方便且直观。与之相对应的则是CUI(命令行用户交互),就是常见的Dos命令行操作,需要记忆一些常用的命令&a…

总结PHP 7新增加的特性
?? 运算符(NULL 合并运算符) 把这个放在第一个说是因为我觉得它很有用。用法: $a $_GET[a] ?? 1;它相当于: <?PHP $a isset($_GET[a]) ? $_GET[a] : 1; 我们知道三元运算符是可以这样用的: $a ?: 1但是这是…

谈“云”色变?近80%企业曾遭受数据泄露
出品 | 《大咖来了》 一边是企业上云这一毋庸置疑的发展趋势,但另一边,云数据泄露事件的频繁,却让不少企业谈“云”色变。 2020年2月,万豪酒店520万客人信息被泄露,英国信息专员办公室(ICO)对其进行了1840万英镑(约1.…

C语言的32个关键字
C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。1 数据类型关键字(12个): (1) char :声明字符型变量或函数 (2) double :声…

Python中线程Timeout的使用
Python中关于Timeout有另一种用起来更简便的方法,即使用装饰器。这种方式是使用sys模块的settrace等方法重构了python的threading类:#!/usr/bin/python import threading import sys class KThread(threading.Thread):"""Subclass of thr…
Vue的模板语法学习
模板语法 1、插值 a、文本 数据绑定最常见的形式就是使用 “Mustache” 语法(双大括号)的文本插值 我们在普通插值的时候无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新 【案例】 <div id"app"…

求二维数组中最大子数组的和
任国庆 张博 之前我们讨论了在一维数组中求最大子数组的和,在此基础上我们开始讨论二维数组的最大子数组。 求二维数组的最大子数组思想是建立在以为数组。首先将数组的第一列看成一个一维数组,找到该列的最大子数组的值,然后将第二列与第一…

赠书 | 详解 4 种爬虫技术
作者 | 赵国生 王健来源 | 大数据DT头图 | 下载于视觉中国前言:聚焦网络爬虫是“面向特定主题需求”的一种爬虫程序,而通用网络爬虫则是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分,主要目的是将互联网上…

nginx 通过proxy_next_upstream实现容灾和重复处理问题
proxy_next_upstream指令语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 |http_504 |http_404 | off ...; 默认值: proxy_next_upstream error timeout; 上下文: http, server, locationerror # 和后端服务器建立连接时&…

javascript身份证号码验证函数支持带x
//--身份证号码验证-支持新的带x身份证functionisIdCardNo(num) { varfactorArr newArray(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1); varerror; varvarArray newArray(); varintValue; varlngProduct 0; varintCheckDigit; varintStrLen num.length; v…

「AI 质检员」在富士通上岗,效率比人工高 25%
日本第一 IT 厂商富士通,于近日宣布开发了用于检测产品外观异常的 AI 技术,从而节省人力成本、材料成本等,同时也可节省声誉损失和退货/召回相关的成本,「无人工厂」已来。来源 | Hyper超神经责编 | 寇雪芹头图 | 下载于视觉中国去…

asp在线压缩和解压缩文件(文件夹)
asp在线压缩和解压缩文件(文件夹) <%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1. c:\windows\system32\cmd.exe\\ 拷贝把本文件所在的路径\\\\ 2. 把 c:\program\winrar\rar.exe\\ 拷贝把本文件所在的路径 并改名为WinRAR.e…

SpringMVC + Hibernate-Validator 参数校验
2019独角兽企业重金招聘Python工程师标准>>> 前言: Web开发中,最为常见的场景就是前端表单数据、Json数据与后端实体类的绑定,即使JS能校验并阻止大部分的必填漏填的风险,但并不能防止恶意破坏者修改脚本。因此后端参数…

深入浅出,机器学习该怎么入门?
来源 | 算法进阶责编 | 寇雪芹头图 | 下载于视觉中国前言:机器学习作为人工智能领域的核心组成,是计算机程序学习数据经验以优化自身算法,并产生相应的“智能化的”建议与决策的过程。一个经典的机器学习的定义是:A computer prog…

防止SQL注入式攻击
1将sql中使用的一些特殊符号,如 -- /* ; %等用Replace()过滤;2限制文本框输入字符的长度;3检查用户输入的合法性;客户端与服务器端都要执行,可以使用正则。4使用带参数的SQL语句形式。 尽量用存储过程

js中document.write的那点事
document.write()方法可以用在两个方面:页面载入过程中用实时脚本创建页面内容,以及用延时脚本创建本窗口或新窗口的内容。该方法需要一个字符串参数,它是写到窗口或框架中的HTML内容。这些字符串参数可以是变量或值为字符串的表达式…

SVN提示被锁定的解决方法(转)
1、(常用)出现这个问题后使用“清理”即"Clean up"功能,如果还不行,就直接到上一级目录,再执行“清理”,然后再“更新”。 2、(没试过)有时候如果看到某个包里面的文件夹没…

征集佳句-精妙SQL语句收集
征集佳句-精妙SQL语句收集 SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我…

【WP8】ResourceDictionary
WP8中引用资源字典 当我们定义的样式太多的时候,我们可以把样式分别定义在不同的文件中,然后通过 MergedDictionaries 应用到其他资源字典中,看下面Demo 我们可以把样式定义在多个文件中,然后再App.xaml中引用 我们先定义三个文件…

拿来就能用! CTO 创业技术栈指南!
作者 | Nitin Aggarwal译者 | 弯月出品 | CSDN(ID:CSDNnews)随着开发运维概念的诞生,以及“You build it, you run it.”(谁构建,谁运维)理念的盛行,现代创业公司的技术栈也发生了许…

Go处理百万每分钟的请求
2019独角兽企业重金招聘Python工程师标准>>> I have been working in the anti-spam, anti-virus and anti-malware industry for over 15 years at a few different companies, and now I know how complex these systems could end up being due to the massive a…

data pump工具
expdp和impdp的用法ORCALE10G提供了新的导入导出工具,数据泵。Oracle官方对此的形容是:OracleDataPump technology enables Very High-Speed movement of data and metadata from one database to another.其中Very High-Speed是亮点。先说数据泵提供的主…

游标对于分页存储过程
1。我个人认为最好的分页方法是: Select top 10 * from table where id>200写成存储过程,上面的语句要拼一下sql语句,要获得最后大于的哪一个ID号 2。那个用游标的方式,只适合于小数据量的表,如果表在一万行以上,就差劲了 你的存储过程还比不上NOT IN分页,示例: SELECT …

混沌、无序、变局?探索之中,《拟合》开启
从无序中寻找踪迹,从眼前事探索未来在东方的神话里,喜鹊会搭桥,银河是条河,两端闪耀的牵牛星和织女星,则是一年一相会的佳偶,他们彼此间的惦念,会牵引彼此在七夕那天实现双星聚首。在西方的世界…

linxu 下安装mysql5.7.19
2019独角兽企业重金招聘Python工程师标准>>> 1、首先检查是否已经安装过mysql,查找mysql相关软件rpm包 # rpm -qa | grep mysql 2、将所有与mysql相关的东西删除 #yum -y remove mysql-libs-5.1.66-2.el6_3.x86_64 3、安装依赖包 #yum -y install make gcc-c cmake …