一、1. Warship定位

Warship是一款基于NPOI的优秀的Excel导入导出组件,基于实体、特性、注入、多线程实现Excel的导入和导出,是一款使用方便、扩展性强、性能优良的组件,开发者不需要关注如何操作NPOI,只需要对实体进行操作即可实现导入导出,使用它可以低成本、高质量的实现业务场景的导入和导出。

QQ群(1154777006):

二、Warship背景

面向各业务系统,在业务使用过程中对于清单化的数据往往都有强烈的Excel导入导出需求,以避免通过系统逐条录入,利用Excel的便利性快速的完成数据的维护和导入。但目前市面上能够提供的组件也就只有NPIO等基础的组件,这些组件更多聚焦于Excel交互,对于业务开发者的支撑非常少,开发者需要编写大量的基础代码来实现业务逻辑,因此急需一个组件能够支持业务代码的快速开发,接管大量基础的功能,让开发者把经理聚焦在高价值的业务兑现上。

三、Warship解决的痛点

开发人员需要基于每一个场景都实现一次针对NPOI的操作来实现导入导出,业务场景中往往不同的场景导入导出的要求还不一样,有的有特殊的业务逻辑校验、有的有动态列、有的有多Sheet级联,往往开发人员没有很好的封装思路,导致每个场景都实现一套导入导出逻辑,代码各种交织,调用非常混乱,后续改动一个基础场景各种影响点。特别是对于Excel导入有很多场景是通用,比如头部校验、必填、长度、范围、格式校验等,每一个场景开发者都要单独实现一次。即耗时又容易遗漏,随着场景的增多,代码扩展性、质量和危害性都面临巨大的问题。

四、Warship代码简介

1)标准导入导出指基于标准组件即可完成导入导出功能,不需要进行扩展开发。同时导入导出都是实体化的,可以通过实体操作来进行Excel的操作。

2)特性介绍

 2.1)ExcelHead:ExcelHead为属性对应Excel的单元格头部,通过该特性可以锁定Excel里面的单元格进行属性值设置,同时对Excel进行锁定、隐藏、头部颜色、整列颜色、列类型(文本、选项、日期、金额等)、格式设置

 2.2)Required:添加Required特性即为必填校验,可设置校验不通过时的提示信息ErrorMessage

 2.3)Length:添加Length特性即进行长度校验,可设置校验不通过时的提示信息ErrorMessage

 2.4)Range:添加Range特性即进行范围控制,可设置校验不通过时的提示信息ErrorMessage

 2.5)Format:添加Format特性即限制字段的输入格式,可设置校验不通过时的提示信息ErrorMessage,格式校验内置4个标准:邮箱、电话、移动电话、身份证,如果内置的不够,可通过正则进行设置,使用特性的重载函数即可

3)ExcelGlobalDTO介绍

 3.1)ExcelGlobalDTO为Excel级别的全局信息,包含Excel的文件信息、所有Sheet起始行、所有Sheet起始列、Sheet实体集合

 3.2)可通过ExcelGlobalDTO设置跟Excel的Sheet相关的设置,如禁用Sheet、设置活动的Sheet

4)ExcelSheetModel介绍

 4.1)ExcelSheetModel为Sheet级别的信息,包含Sheet的名称(SheetName)、序号(SheetIndex)、起始行(StartRowIndex)、起始列(StartColumnIndex)、说明(AreaBlock)

 4.2)导入Excel后,可获取到Sheet头部集合SheetHeadList、Sheet实体集合SheetEntityList

 4.3)可设置Sheet内列的选项值,通过ColumnOptions进行单元格输入的限制

5)ExcelRowModel介绍

 5.1)所有导入导出DTO对象必须继承ExcelRowModel,ExcelRowModel为组件级的封装

 5.2)ExcelRowModel为Excel行对象,里面包含所有行相关的信息,如行号、实体中未定义列的单元格信息集合

 5.3)可以通过实体对ExcelRowModel中的属性进行样式设置(RowStyleSet)、是否删除行设置(IsDeleteRow)、动态列设置(SetDynamicColumns)

 5.3)当调用组件导入后,可以通过ExcelRowModel的ColumnErrorMessage获取到本行内单元格验证不通过信息,同时也可以基于组件以外的业务校验向ColumnErrorMessage追加异常信息,导出的时候会向单元格上打批注。

 5.4)也可通过ExcelGlobalDTO的GetColumnErrorMessages获取Excel的所有验证不通过信息。

二、代码示例

标准导入导出-代码示例

/// <summary>
/// 合同
/// </summary>
[Serializable]
public class ContractImportDTO : ExcelRowModel
{/// <summary>/// 合同名称/// </summary>[ExcelHead("合同名称", IsLocked = false, IsHiddenColumn = false, ColumnWidth = 8)][Required(ErrorMessage = "合同名称必填")][Length(100, ErrorMessage = "长度不能超过100")]public string Name { get; set; }/// <summary>/// 合同编码/// </summary>[ExcelHead("合同编码", IsLocked = false, IsHiddenColumn = false, ColumnWidth = 8)][Required(ErrorMessage = "合同名称必填")][Length(100, ErrorMessage = "长度不能超过100")]public string Code { get; set; }/// <summary>/// 合同编码/// </summary>[ExcelHead("甲方单位", IsLocked = false, IsHiddenColumn = false, ColumnWidth = 8)][Required(ErrorMessage = "合同名称必填")][Length(100, ErrorMessage = "长度不能超过100")]public string JfProvider { get; set; }/// <summary>/// 合同编码/// </summary>[ExcelHead("乙方单位", IsLocked = false, IsHiddenColumn = false, ColumnWidth = 8)][Required(ErrorMessage = "合同名称必填")][Length(100, ErrorMessage = "长度不能超过100")]public string YfProvider { get; set; }/// <summary>/// 合同编码/// </summary>[ExcelHead("合同金额", IsLocked = false, IsHiddenColumn = false, ColumnWidth = 8)][Range(0, 999999999, ErrorMessage = "超出范围")]public decimal? Amount { get; set; }[ExcelHead("邮箱")][Format(FormatEnum.Email,ErrorMessage ="格式错误")]public string Email { get; set; }
}public class 标准导入导出
{public void Execute(){string excelPath = Directory.GetCurrentDirectory() + "\\..\\Template\\动态添加特性启用禁用.xlsx";//导入Import<Mysoft.Clgyl.Demo.DemoDTO.ContractImportDTO> import = new Import<Mysoft.Clgyl.Demo.DemoDTO.ContractImportDTO>(1);import.Execute(excelPath);Export<Mysoft.Clgyl.Demo.DemoDTO.ContractImportDTO> export = new Export<Mysoft.Clgyl.Demo.DemoDTO.ContractImportDTO>();export.ExportMemoryStream(import.ExcelGlobalDTO);}
}

材料图片导入-代码示例

    public class 材料图片导入{public void Execute(){string excelPath = Directory.GetCurrentDirectory() + "\\..\\Template\\图片导入.xlsx";//导入Import<Warship.Demo.DemoDTO.ProductDTO> import = new Import<Warship.Demo.DemoDTO.ProductDTO>();import.ExcelGlobalDTO.DisableSheetIndexs = new List<int> { 1,2,3,4,5 };import.Execute(excelPath);Export<Warship.Demo.DemoDTO.ProductDTO> export = new Export<Warship.Demo.DemoDTO.ProductDTO>();export.Execute(import.ExcelGlobalDTO);}}

动态添加特性启用禁用-代码示例

class 动态添加特性启用禁用{/// <summary>/// 执行/// </summary>public void Execute(){string excelPath = Directory.GetCurrentDirectory() + "\\..\\Template\\动态添加特性启用禁用.xls";//设置属性特性Dictionary<string, BaseAttribute> dic = new Dictionary<string, BaseAttribute>{{ "Name", new RequiredAttribute { ErrorMessage = "名称必填***" } },{ "Code", new RequiredAttribute { ErrorMessage = "编码必填***" } }};//TODO执行启用特性:待优化(统一设置特性,不用单独一个个特性设置)AttributeFactory<DemoDTO.ContractImportDTO>.GetValication(ValidationTypeEnum.Required).EnableAttributes(dic);//执行禁用特性AttributeFactory<DemoDTO.ContractImportDTO>.GetValication(ValidationTypeEnum.Required).DisableAttributes(new List<string> {"Name","Code"});//导入Import<DemoDTO.ContractImportDTO> import = new Import<DemoDTO.ContractImportDTO>(1);import.Execute(excelPath);//导出Export<DemoDTO.ContractImportDTO> export = new Export<DemoDTO.ContractImportDTO>();export.Execute(import.ExcelGlobalDTO);}}

二开扩展增加导出列-代码示例

class 二开扩展增加导出列{/// <summary>/// 执行/// </summary>public void Execute(){string excelDynamicPath = Directory.GetCurrentDirectory() + "\\..\\Template\\动态列.xls";new DynamicColumnDTO().SetDynamicColumns(new List<ColumnModel> {new ColumnModel{ColumnName = "动态列A",ColumnValidations=new List<ColumnValidationModel>{new ColumnValidationModel(){ValidationTypeEnum = ValidationTypeEnum.Required,RequiredAttribute = new RequiredAttribute() { ErrorMessage = "动态列A必填" }}}},new ColumnModel{ColumnName = "动态列B",ColumnValidations=new List<ColumnValidationModel>{new ColumnValidationModel(){ValidationTypeEnum = ValidationTypeEnum.Required,RequiredAttribute = new RequiredAttribute() { ErrorMessage = "动态列B必填" }}}}});Import<DynamicColumnDTO> import = new Import<DynamicColumnDTO>();import.ExcelGlobalDTO.SetDefaultSheet("合同材料");import.Execute(excelDynamicPath);Export<DynamicColumnDTO> export = new Export<DynamicColumnDTO>();export.Execute(import.ExcelGlobalDTO);}}

导入注入-代码示例

/// <summary>/// 导入注入/// </summary>public class ImportInjection : IImport<DemoDTO.ContractImportDTO>{public void ValidationHeaderAfter(ExcelGlobalDTO<DemoDTO.ContractImportDTO> ExcelGlobalDTO){return;}public void ValidationValueAfter(ExcelGlobalDTO<DemoDTO.ContractImportDTO> ExcelGlobalDTO){return;}}/// <summary>/// 导出注入/// </summary>public class ExportInjection : IExport<DemoDTO.ContractImportDTO>{public void ExcelHandleAfter(ExcelGlobalDTO<DemoDTO.ContractImportDTO> excelGlobalDTO){return;}public void ExcelHandleBefore(ExcelGlobalDTO<DemoDTO.ContractImportDTO> excelGlobalDTO){return;}}class 二开扩展注入{/// <summary>/// 执行/// </summary>public void Execute(){string excelPath = Directory.GetCurrentDirectory() + "\\..\\Template\\合同导入性能测试.xls";//导入注入ServiceContainer.Register<IImport<DemoDTO.ContractImportDTO>, ImportInjection>();            //执行导入Import<DemoDTO.ContractImportDTO> import = new Import<DemoDTO.ContractImportDTO>(0);import.ExcelGlobalDTO.SetDefaultSheet();import.Execute(excelPath);//导出注入ServiceContainer.Register<IExport<DemoDTO.ContractImportDTO>, ExportInjection>();//执行导出Export<DemoDTO.ContractImportDTO> export = new Export<DemoDTO.ContractImportDTO>();export.Execute(import.ExcelGlobalDTO);}}

级联-代码示例

/// <summary>/// 合同/// </summary>[Serializable]public class ContractImportDTO : ExcelRowModel{/// <summary>/// 合同名称/// </summary>[ExcelHead("合同名称", IsLocked = false, IsHiddenColumn = false, ColumnWidth = 8)][Required(ErrorMessage = "合同名称必填")][Length(100, ErrorMessage = "长度不能超过100")]public string Name { get; set; }/// <summary>/// 合同编码/// </summary>[ExcelHead("合同编码", IsLocked = false, IsHiddenColumn = false, ColumnWidth = 8)][Required(ErrorMessage = "合同编码必填")][Length(100, ErrorMessage = "长度不能超过100")]public string Code { get; set; }/// <summary>/// 材料/// </summary>[Sheet(SheetName = "合同材料",MasterEntityProperty = "Code",SlaveEntityProperty = "ContractCode")][ExcelHead("合同材料", IsLocked = false, IsHiddenColumn = false, ColumnWidth = 8)]public List<ContractProductImportDTO> Products { get; set; }public decimal? HtAmount { get; set; }}public class 级联{/// <summary>/// 执行/// </summary>public void Execute(){string path = System.AppDomain.CurrentDomain.BaseDirectory;string dir = System.Environment.CurrentDirectory;//级联处理string excelPath = Directory.GetCurrentDirectory() + "\\..\\Template\\合同导入模板-级联.xls";Import<ContractImportDTO> import = new Import<ContractImportDTO>(1);import.ExcelGlobalDTO.SetDefaultSheet();import.Execute(excelPath);Export<ContractImportDTO> export = new Export<ContractImportDTO>();export.Execute(import.ExcelGlobalDTO);var errors = import.ExcelGlobalDTO.GetColumnErrorMessages();return;}}

Warship+NPOI导入导出组件介绍【对象化】相关推荐

  1. 使用NPOI导入导出标准Excel

    使用NPOI导入导出标准Excel 转自http://www.cnblogs.com/lwme/archive/2011/11/18/npoi_excel_import_export.html 试过很 ...

  2. mvc npoi导出excel ajax,ASP.Net MVC利用NPOI导入导出Excel

    因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// /// 批 ...

  3. npoi的mvc怎么ajax导出,asp.net mvc利用NPOI导入导出Excel解决方法

    asp.net mvc利用NPOI导入导出Excel 导出Excel 2003没有问题,导出Excel2007老是出现无法访问已关闭的流,请帮忙解决,或是哪位有mvc导入导出excel的工具类能提供, ...

  4. 使用NPOI导入导出标准Excel(源码)

    http://www.cnblogs.com/lwme/archive/2011/11/18/npoi_excel_import_export.html 尝试过很多Excel导入导出方法,都不太理想, ...

  5. 【C】@程序员,我们送给你一个成熟的Excel导入导出组件

    程序员的显著特点 有一天跟一位同事跟我闲聊,讨论起过去若干年软件行业的感受,他问了个问题:你觉得一个好的软件工程师最显著的特点是什么?我想了一会,说:大概是坐得住吧. 某种意义上来说,在互联网技术飞速 ...

  6. 安全组规则跨region导入导出功能介绍

    功能介绍 您可以在控制台clone一个安全组,进而快速创建安全组和添加安全组规则,但这个功能有个限制是无法跨region使用.为此ECS控制台开发了安全组规则导入导出功能,使用这个功能您可以把一个安全 ...

  7. oracle 的导入导出,Oracle 导入导出详细介绍

    数据库version 导入导出工具 ( from )导出数据库 ( to )导入数据库 Expdp/Impdp 11.2.0.2.0 10.2.0.3.0 From 11g(11.2.0.2.0) t ...

  8. 分享:一个基于NPOI的excel导入导出组件(强类型)

    一.引子 新进公司被安排处理系统的数据报表任务--对学生的考试成绩进行统计并能导出到excel.虽然以前也有弄过,但感觉不是很好,所以这次狠下心,多花点时间作个让自己满意的插件. 二.适用领域 因为需 ...

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

    由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案. 注意:若直接使用在WinForm项目中,必需先下 ...

  10. Npoi html导入到excel,.net mvc 利用NPOI导入导出excel

    因近期项目做到,所以记录一下: 1.导出Excel: 首先引用NPOI包,从这里下载>download (Action一定要用FileResult) /// /// 批量导出需要导出的列表 // ...

最新文章

  1. 5G LAN — 解决方案示例
  2. 最佳实践: 勿在 Servlet 中实现 SingleThreadModel
  3. 检测客户pc电脑端VC++环境并安装
  4. 【招聘(上海)】美团酒店招聘 .NET 高级开发
  5. 《SSM框架实战》 整合 Freemarker
  6. jdbc连接mysql数据库过程_jdbc连接数据库的步骤
  7. aspnetcore的中间件
  8. iOS开发之复制字符串到剪贴板
  9. menu什么意思中文意思_pipeline什么意思
  10. 前馈神经网络_深度学习基础理解:以前馈神经网络为例
  11. android椭圆形形框_什么是计算机硬件上的椭圆形Kong?
  12. 1389: 程序员PIPI II
  13. 带农历日历的DatePicker控件 - Xamarin控件开发小记
  14. alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝
  15. plc梯形图的c语言写法,PLC梯形图讲解.ppt
  16. 如何创作出优质的短视频文案?
  17. CDH6.3.1安装指南
  18. 冒险岛启动游戏提示计算机丢失,各种无法登陆情况解决建议汇总
  19. IIC、SPI和UART区别
  20. 挺着肚皮的小淘气 蒙语版铃声 挺着肚皮的小淘气 蒙语版手机铃...

热门文章

  1. 思科模拟器vlan的划分
  2. 我可以请你吃一千块钱的饭,但是你欠我的一百块钱你得还,不为什么,这是规矩!
  3. LynxFly科研小四轴横空出世,开源,F4,WIFI
  4. 为什么不要随便点击下载链接:过时的远程病毒灰鸽子木马示范
  5. HTML将广告关闭的JS代码,js实现可关闭的对联对联广告代码广告效果代码
  6. C#语言与Java语言程序的比较[转自chinaitlab]
  7. 免费电子书籍--网址
  8. sis防屏蔽程序_程序员经常看的开源月刊《HelloGitHub》第 56 期
  9. cloud2声卡_带你解惑HyperX Cloud2(飓风)和Alpha(阿尔法)的终极选择
  10. xp关机时询问对计算机做什么,XP关机的六个方法