基于 Aspose.Cells与XML导入excel 数据----操作类封装
前言
导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也不再累述。导入npoi封装的方法特别好,但是导出好像没有那一个是进行封装操作的,这两天正好有这块需求,所有就写了一个操作类xx,请不要看到xml就说这不是还要写东西吗,此封装是为了减少代码的书写。功能扩展基本上来源于XML。
需求分析
1.首先我们要做的就是要把excel中的数据导入到数据库,基于项目中的导入封装,我要吧excel转为对象数据集即:list<model>,那么就需要我们的model要和excle的数据对象进行编写。
2.在操作过程中会有一些特殊字段,比如PK(主键),外键(客户不知道id只能根据名称找到id)
3.验证与判断:
验证---是有些字段必须不能为空等
判断----对象类型
为此我们就大致知道我们的xml到底该怎么来定义了。如下图
图片上已经大致介绍了每个节点表示的什么意思。其中OracleType如果为空excel可以为空。其他节点就不再累述。
功能实现
接下来实现就很简单了,只要获取excel数据集,让后获得对象数据的值把它和对象属性字段对象组成键值对,然后利用反射进行对象转换即可。
根基路径读取文件
/// <summary> /// 根据文件路径,读取文件 /// </summary> /// <typeparam name="T">对象</typeparam> /// <param name="strPath">文件地址</param> /// <param name="name">对象xml对应节点</param> /// <returns></returns> public List<T> ReadData<T>(string strPath, string name) { List<T> list = new List<T>(); Workbook wb = new Workbook(strPath); foreach (Worksheet ws in wb.Worksheets) { if (ws.Name == "ReadOnly") continue; ExcelToModel r = new ExcelToModel(); var l = r.ReadTable<T>(ws, name); list.AddRange(l); } return list; }
上述代码中支持多页excel上传如果你们像之上传第一页也行 list.AddRange(l) 合并list,你们可以把对象定义成嵌套对象也可以进行相应处理,在这不再累述。
具体实现代码
/// <summary> /// 获取excel数据集合 /// </summary> /// <typeparam name="T">对象</typeparam> /// <param name="ws">excel数据流</param> /// <param name="xmlNodeName">xml对应节点节点</param> /// <returns></returns> public List<T> ReadTable<T>(Worksheet ws, string xmlNodeName) { Cells all = ws.Cells; DataSet ds = new DataSet(); ds.ReadXml(System.Web.HttpContext.Current.Request.MapPath("~/ImportFiles/InputRules.xml")); DataTable dt = ds.Tables[xmlNodeName]; // 数据区 ; List<T> list = new List<T>(); ; i < all.Rows.Count; i++) { T model = Activator.CreateInstance<T>(); Dictionary<string, object> dic = new Dictionary<string, object>(); ; J < ds.Tables[xmlNodeName].Rows.Count; J++) { #region 获取excel表格中的值 int ExcelColumn = int.Parse(ds.Tables[xmlNodeName].Rows[J]["ExcelColumn"].ToString()); string OracleType = ds.Tables[xmlNodeName].Rows[J]["OracleType"].ToString(); string OracleColumn = ds.Tables[xmlNodeName].Rows[J]["OracleColumn"].ToString(); string ParameterName = ds.Tables[xmlNodeName].Rows[J]["ParameterName"].ToString(); string MethodName = ds.Tables[xmlNodeName].Rows[J]["MethodName"].ToString(); string strValue = string.Empty; strValue = ExcelColumn > - ? all[i, ExcelColumn].StringValue : ""; if (!Verification(ExcelColumn, OracleType, strValue)) break; if (!string.IsNullOrEmpty(ParameterName.ToString())) { string ParameterValue = all[i, int.Parse(ParameterName)].StringValue; var factory = CustomParmeter_Factory.Cresate_CustomParmeter_Factory(MethodName, ParameterValue); strValue = factory.GetCustomParmeter(); if (string.IsNullOrEmpty(strValue)) break; if (OracleType == "Guid") dic.Add(OracleColumn, new Guid(strValue)); } else if (OracleType == "PK") dic.Add(OracleColumn, Guid.NewGuid()); else if (OracleType == "datetime") dic.Add(OracleColumn, Convert.ToDateTime(strValue)); else if (OracleType == "decimal") dic.Add(OracleColumn, Convert.ToDecimal(strValue)); else if (OracleType == "int") dic.Add(OracleColumn, Convert.ToInt32(strValue)); else if (OracleType == "Guid") dic.Add(OracleColumn, new Guid(strValue)); else dic.Add(OracleColumn, strValue); #endregion } PropertyInfo[] modelPro = model.GetType().GetProperties(); && dic.Count() > ) { ; z < modelPro.Length; z++) { if (dic.ContainsKey(modelPro[z].Name)) { modelPro[z].SetValue(model, dic[modelPro[z].Name], null); } } list.Add(model); } } return list; }
上述代码,首先获取xml各个节点:
其中ExcelColumn根据此节点获取OracleColumn(数据库对象名称)数据,把两字段存入字典 Dictionary<string, object>;
OracleType根据此字段进行条件判断,与数据类型转换(excel获取过来的都是string)代码如下:
判断
/// <summary> /// 数据验证 /// </summary> /// <param name="ExcelColumn">excek列号</param> /// <param name="OracleType">数据类型</param> /// <param name="strValue">获取的值</param> /// <returns></returns> public static bool Verification(int ExcelColumn, string OracleType, string strValue) { DateTime dtDate; ) return true; if (string.IsNullOrEmpty(OracleType) || string.IsNullOrEmpty(strValue)) return false; if (OracleType == "datetime" && !DateTime.TryParse(strValue, out dtDate)) return false; return true; }
转换:
; J < ds.Tables[xmlNodeName].Rows.Count; J++) { #region 获取excel表格中的值 int ExcelColumn = int.Parse(ds.Tables[xmlNodeName].Rows[J]["ExcelColumn"].ToString()); string OracleType = ds.Tables[xmlNodeName].Rows[J]["OracleType"].ToString(); string OracleColumn = ds.Tables[xmlNodeName].Rows[J]["OracleColumn"].ToString(); string ParameterName = ds.Tables[xmlNodeName].Rows[J]["ParameterName"].ToString(); string MethodName = ds.Tables[xmlNodeName].Rows[J]["MethodName"].ToString(); string strValue = string.Empty; strValue = ExcelColumn > - ? all[i, ExcelColumn].StringValue : ""; if (!Verification(ExcelColumn, OracleType, strValue)) break; if (!string.IsNullOrEmpty(ParameterName.ToString())) { string ParameterValue = all[i, int.Parse(ParameterName)].StringValue; var factory = CustomParmeter_Factory.Cresate_CustomParmeter_Factory(MethodName, ParameterValue); strValue = factory.GetCustomParmeter(); if (string.IsNullOrEmpty(strValue)) break; if (OracleType == "Guid") dic.Add(OracleColumn, new Guid(strValue)); } else if (OracleType == "PK") dic.Add(OracleColumn, Guid.NewGuid()); else if (OracleType == "datetime") dic.Add(OracleColumn, Convert.ToDateTime(strValue)); else if (OracleType == "decimal") dic.Add(OracleColumn, Convert.ToDecimal(strValue)); else if (OracleType == "int") dic.Add(OracleColumn, Convert.ToInt32(strValue)); else if (OracleType == "Guid") dic.Add(OracleColumn, new Guid(strValue)); else dic.Add(OracleColumn, strValue); #endregion }
其中没有把这段代码独立出来,其实你们可以独立出来的。
其中最为关键的为列号为-1的,表示它是主键或者需要根据excel中的值进行特殊获取。我这边是写了一个工厂类,为什么写工厂,考虑的是为了容易扩展,其实为了装13
public class CustomParmeter_Factory { public static ICustomParmeter Cresate_CustomParmeter_Factory(string MethodName, string ParameterName) { ICustomParmeter newService = null; switch (MethodName) { case "SetLine": newService = new SetLine(ParameterName); break; case "SetSegment": newService = new SetSegment(ParameterName); break; case "SetSite": newService = new SetSite(ParameterName); break; } return newService; } } public interface ICustomParmeter { string GetCustomParmeter(); } public class SetSegment : ICustomParmeter { private string ParameterName; public SetSegment(string _ParameterName) { ParameterName = _ParameterName; } public string GetCustomParmeter() { CustomParmeterCommonService c = new CustomParmeterCommonService(); return c.GetSegmentPatmet(ParameterName).ToString(); } } public class SetLine : ICustomParmeter { private static string ParameterName; public SetLine(string _ParameterName) { ParameterName = _ParameterName; } public string GetCustomParmeter() { CustomParmeterCommonService c = new CustomParmeterCommonService(); return c.GetLineParmet(ParameterName).ToString(); } } public class SetSite : ICustomParmeter { private string ParameterName; public SetSite(string _ParameterName) { ParameterName = _ParameterName; } public string GetCustomParmeter() { CustomParmeterCommonService c = new CustomParmeterCommonService(); return c.GetSitePatmet(ParameterName).ToString(); } }
其中还有一块比较重要的代买需要说明一下就是字典转为对象类型:
字典转为对象类型
PropertyInfo[] modelPro = model.GetType().GetProperties(); && dic.Count() > ) { ; z < modelPro.Length; z++) { if (dic.ContainsKey(modelPro[z].Name)) { modelPro[z].SetValue(model, dic[modelPro[z].Name], null); } } list.Add(model); }
其中如果你想导入新的数据库只需在xml写上自己的对象节点即可:
<?xml version="1.0" encoding="utf-8" ?> <InputRules> <BuildUnit ExcelColumn="-1" DisplayText="主键" OracleColumn="BID" OracleType="PK" ParameterName="" MethodName=""/> <BuildUnit ExcelColumn="-1" DisplayText="线路ID" OracleColumn="LineID" OracleType="Guid" ParameterName="0" MethodName="SetLine"/> <BuildUnit ExcelColumn="-1" DisplayText="标段ID" OracleColumn="SegmentID" OracleType="Guid" ParameterName="1" MethodName="SetSegment"/> <BuildUnit ExcelColumn="-1" DisplayText="工点ID" OracleColumn="SiteID" OracleType="Guid" ParameterName="2" MethodName="SetSite"/> <BuildUnit ExcelColumn="0" DisplayText="线路" OracleColumn="LineName" OracleType="varchar50" ParameterName="" MethodName=""/> <BuildUnit ExcelColumn="1" DisplayText="标段" OracleColumn="SegmentName" OracleType="varchar" ParameterName="" MethodName=""/> <BuildUnit ExcelColumn="2" DisplayText="工点" OracleColumn="SiteName" OracleType="varchar" ParameterName="" MethodName=""/> <BuildUnit ExcelColumn="3" DisplayText="计取月度" OracleColumn="RememberTime" OracleType="varchar" ParameterName="" MethodName=""/> <BuildUnit ExcelColumn="4" DisplayText="金额(元)" OracleColumn="Money" OracleType="decimal" ParameterName="" MethodName=""/> <BuildUnit ExcelColumn="5" DisplayText="创建人" OracleColumn="CreateUser" OracleType="varchar" ParameterName="" MethodName=""/> <BuildUnit ExcelColumn="6" DisplayText="创建时间" OracleColumn="CreateTime" OracleType="datetime" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="-1" DisplayText="主键" OracleColumn="CUID" OracleType="PK" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="-1" DisplayText="线路ID" OracleColumn="LineID" OracleType="Guid" ParameterName="0" MethodName="SetLine"/> <ConstructionUnit ExcelColumn="-1" DisplayText="标段ID" OracleColumn="SegmentID" OracleType="Guid" ParameterName="1" MethodName="SetSegment"/> <ConstructionUnit ExcelColumn="0" DisplayText="线路" OracleColumn="LineName" OracleType="varchar50" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="1" DisplayText="标段" OracleColumn="SegmentName" OracleType="varchar" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="2" DisplayText="使用年月" OracleColumn="UseYears" OracleType="varchar" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="3" DisplayText="使用时间" OracleColumn="UseTime" OracleType="datetime" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="4" DisplayText="付款对象" OracleColumn="Paymenter" OracleType="varchar" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="5" DisplayText="金额(元)" OracleColumn="Money" OracleType="decimal" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="6" DisplayText="用途" OracleColumn="Actiion" OracleType="varchar" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="7" DisplayText="创建人" OracleColumn="CreateUser" OracleType="varchar" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="8" DisplayText="备注" OracleColumn="Remork" OracleType="varchar" ParameterName="" MethodName=""/> <ConstructionUnit ExcelColumn="9" DisplayText="创建时间" OracleColumn="CreateTime" OracleType="datetime" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="-1" DisplayText="主键" OracleColumn="ID" OracleType="PK" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="-1" DisplayText="线路ID" OracleColumn="LineID" OracleType="Guid" ParameterName="0" MethodName="SetLine"/> <SupervisionUnit ExcelColumn="-1" DisplayText="标段ID" OracleColumn="SegmentID" OracleType="Guid" ParameterName="1" MethodName="SetSegment"/> <SupervisionUnit ExcelColumn="-1" DisplayText="工点ID" OracleColumn="SiteID" OracleType="Guid" ParameterName="2" MethodName="SetSite"/> <SupervisionUnit ExcelColumn="0" DisplayText="线路" OracleColumn="LineName" OracleType="varchar50" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="1" DisplayText="标段" OracleColumn="SegmentName" OracleType="varchar" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="2" DisplayText="工点" OracleColumn="SiteName" OracleType="varchar" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="3" DisplayText="审核时间" OracleColumn="AuditTime" OracleType="datetime" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="4" DisplayText="付款对象" OracleColumn="PayMenter" OracleType="varchar" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="5" DisplayText="审核金额" OracleColumn="AuditMoney" OracleType="decimal" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="6" DisplayText="创建者" OracleColumn="CreateUser" OracleType="varchar" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="7" DisplayText="审核意见" OracleColumn="AuditOpinion" OracleType="varchar" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="8" DisplayText="监理审核意见" OracleColumn="BossOpinion" OracleType="varchar" ParameterName="" MethodName=""/> <SupervisionUnit ExcelColumn="9" DisplayText="备注" OracleColumn="Remork" OracleType="varchar" ParameterName="" MethodName=""/> </InputRules>
记得特殊字段要在工厂类中添加相应的自定义函数哈,至此整个的功能应该就实现了。
注:如果有更好的实现方案大家请一起讨论,如果有不合理的地方还请你提出你的建议。
基于 Aspose.Cells与XML导入excel 数据----操作类封装的更多相关文章
- C# WinForm使用Aspose.Cells.dll 导出导入Excel/Doc 完整实例教程
1.添加引用: Aspose.Cells.dll(我们就叫工具包吧,可以从网上下载.关于它的操作我在“Aspose.Cells操作说明 中文版 下载 Aspose C# 导出Excel 实例”一文中的 ...
- POI 导入excel数据自己主动封装成model对象--代码分析
上完代码后,对代码进行基本的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后须要调用init()方法初始化 ...
- Aspose.Cells for .NET 8.5.0 工具类
基于 Aspose.Cells for .NET 8.5.0 工具类, Aspose.Cells for .NET 8.5.0 这个自己去CSDN下载里面有破解的,没有破解的导出excel的时候会(A ...
- 利用Aspose.Cell控件导入Excel非强类型的数据
导入Excel的操作是非常常见的操作,可以使用Aspose.Cell.APOI.MyXls.OLEDB.Excel VBA等操作Excel文件,从而实现数据的导入,在导入数据的时候,如果是强类型的数据 ...
- 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...
- 导入excel数据
前提条件:先要安装好EXCEL软件. 程序中经常要用到导入excel数据的功能.其实通过ole操作excel就简单的几行代码,但记性不好,经常要用经常要找, 还是作篇笔记吧. var ExcelApp ...
- aspose.cells根据模板导出excel
又隔十多天没写博客了,最近都在忙项目的事情,公司人事变动也比较大,手头上就又多了一个项目.最近做用aspose.cells根据模板导出excel报价单的功能,顺便把相关的核心记下来,先上模板和导出的效 ...
- 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...
- Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel
Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...
随机推荐
- 教你ASP.NET中如何防止注入攻击
你应该在程序中验证所有的不信任输入.你应该假定所有的用户输入都是非法的.用户可以在应用程序中提供表单字段,查询字串,客户端cookies和浏览器环境值比如用户代理字串和IP地址等. 弱输入校验通常为注 ...
- dos攻击命令
net user //查看有哪些用户 net start //查看开启了哪些服务项目 net send ip "文本信息" //向对方发送消息(如果对方关了信使有可能会收不到) n ...
- ch5-Class 与 Style 绑定(v-bind:class v-bind:style)
数据绑定一个常见需求是操作元素的 class 列表和它的内联样式. 因为它们都是属性 ,我们可以用v-bind 处理它们:只需要计算出表达式最终的字符串. 不过,字符串拼接麻烦又易错.因此,在 v-b ...
- ubuntu的应用程序哪里找
一般来说11.04以前的桌面是gnome,点左上角的那个小圆圈,会出来一个下拉菜单,里面就有应用程序. 11.10以后的桌面换成unity 在dash中寻找应用程序很不方便,知道名字的还好,不知道名字 ...
- MVC 中获取Json数据
@{ ViewBag.Title = "json示例项目"; } @Scripts.Render("~/bundles/jquery") <h2>j ...
- easyUI tree点击文字展开节点
easyUI默认展开树的时候,点击节点前边的黑色小三角 ,这样操作存在不人性化的地方,在实际使用中由于老旧电脑的存在和大龄使用者的眼花经常点不准:因此要实现点击节点名称展开的方式,其实就是在展开事件上 ...
- 关于TileBrush中Viewbox,Viewport以及Stretch,AlignmentX/Y的详细研究
我们知道TileBrush是WPF中一个战斗力爆表的虚基类,从它派生出的DrawingBrush,ImageBrush和VisualBrush在WPF图形编程中发挥着重要作用.然而关于TileBrus ...
- Echarts数据可视化series-radar雷达图,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- JSONP、图片Ping、XMLHttpRequest2.0等跨域资源请求(CORS)
跨域:当协议.主域名.子域名.端口号中任意一个不相同时都不算同一个域,而在不同域之间请求数据即为跨域请求.解决方法有以下几种(如有错误欢迎指出)以请求图片url为例: 1.通过XMLHttpReque ...
- ABAP字符串的加密与解密
FIEB_PASSWORD_DECRYPT:字符串解密:FIEB_PASSWORD_ENCRYPT:字符串加密.旧版本的可以用. PARAMETERS:str1 type char32 OBLIGAT ...