1、类设计,EXCEL要据配置读入DATASET
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>
分享到:
相关推荐
excel数据导入数据库。 查询sheet, 按照列名与数据库字段名依次对应循环插入
java读取excel数据导入数据库源码 java读取excel数据导入数据库源码
C#将数据导入excel和Excel数据导入数据库使用的是SQL Server数据库
一个简单的python程序带图形化界面用于读取excel将其中数据导入数据库
java对excel的操作,可以取的excel的行数,列数,取的每个单元格中的数据,,将excel数据导入数据库中
将Excel 表格数据批量导入数据库,带数据库、daoru.xls 、导入提交页面、导入后显示页面等 可以使用!代码为php语言 数据库 mysql
内容概要:本资源介绍了如何从利用Npoi库操作Excel,如相关读取单元格、行,介绍了如何对单元格数据格式进行操作,并分享了如何将Datatable数据导入Mysql数据库,方便项目管理。 阅读建议:此资源以如何读取Excel...
通过java技术,实现excel数据导入数据库sqlserver2005的操作,代码简单易于理解。
Delphi如何把Excel数据中的节点及数据快速导入MySQL数据库并独立创建数据库
c#语言,将excel数据导入到oracle数据库表中
Java高效实现批处理Excel数据导入数据库代码
在VS2010中打开网站,浏览ReadExcel.aspx页面,这里选择你要导入的excel表,并且还可以为导入数据库中的表命名,点击Upload完成上传。注意:需要修改ReadExcel.aspx.cs页面中CreateTable中的连接字符串。
主要介绍了使用python将excel数据导入数据库过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
实现,excel数据表导入mysql数据中,用java实现,好不容易解决了,就把他上传下吧,免得有人跟我似的,找了好几天都没有找到代码!~有什么不明白的可以加Q:568151875,不过大部分时间我都在工作,你可以留言!~
java实现Excel数据导入到数据库,如果数据库中存在就更新。 数据库数据导入到Excel表中。
自己写的Excel导入dbgrid的方法函数,需要和数据库的列名保持一致,用的ole,遍历每一行数据,速度一般般吧,