博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NPOI操作excel——利用反射机制,NPOI读取excel数据准确映射到数据库字段
阅读量:7089 次
发布时间:2019-06-28

本文共 4403 字,大约阅读时间需要 14 分钟。

hot3.png

整体博文已迁移到博客园:

其实需求很明确,就是一大堆不一样的excel,每张excel对应数据库的一张表,我们需要提供用户上传excel,我们解析数据入库的功能实现。

那么,这就涉及到一个问题:我们可以读出excel的表头,但是怎么知道每个表头具体对应数据库里面的字段呢?

博主经过一段时间的思考与构思,想到一法:现在的情况是我们有excel表A,对应数据库表B,但是A与B具体属性字段的映射关系我们不知。那我们是不是可以有一个A到B的映射文件C呢?

我想,说到这,大家就很明了了...

第一步:为每张excel创建一个与数据库表对应的映射文件(xml配置文件),我们称之为规则集,当然,我们的需求是excel的列表头不变(顺序可换---原因请继续往下看)

  
  
  
  
  
  
  
  
  

当然,这个xml文件由于是我们自己定义的节点,所以每个单词的意义就不详细解释了。

附:excel原表如下:

190108_1MWZ_1864532.png

其中【剔除行关键字】在后续详细代码中介绍,请继续关注微博。

表头含有层级结构,具体读取方法也在后续详细代码中介绍...今天之讲述设计思想与部分基础代码。

第二步:新建一个读取我们自己定义的xml文件的类 RegularXMLReaderService.cs:

public class RegularXMLReaderService : IRegularXMLReaderService    {        public List
 GetXMLInfo(string xmlpath)        {            //xmlpath为xml的路径名称            var reader = new XmlTextReader(xmlpath);            var doc = new XmlDocument();            //从指定的XMLReader加载XML文档            doc.Load(reader);            var headerList = new List
();            foreach (XmlNode node in doc.DocumentElement.ChildNodes)            {                var header = new Regular();                if (node.Attributes["firstHeaderRow"] != null)                    header.HeaderRegular.Add("firstHeaderRow", int.Parse(node.Attributes["firstHeaderRow"].Value));                if (node.Attributes["lastHeaderRow"] != null)                    header.HeaderRegular.Add("lastHeaderRow", int.Parse(node.Attributes["lastHeaderRow"].Value));                if (node.Attributes["sheetCount"] != null)                    header.HeaderRegular.Add("sheetCount", int.Parse(node.Attributes["sheetCount"].Value));                if (node.Attributes["ExcelType"] != null)                    header.HeaderRegular.Add("ExcelType", int.Parse(node.Attributes["ExcelType"].Value));                if (node.Attributes["Supplementary"] != null)                    header.HeaderRegular.Add("Supplementary", int.Parse(node.Attributes["Supplementary"].Value));                if (node.Attributes["headerText"] != null)                    header.HeaderText = node.Attributes["headerText"].Value;                if (node.Attributes["propertyName"] != null)                    header.PropertyName = node.Attributes["propertyName"].Value;                if (node.Attributes["dataType"] != null)                    header.DataType = node.Attributes["dataType"].Value;                headerList.Add(header);            }            return headerList;        }    }

这段代码相信大家都能看懂,不做详细解释。其中设计到一个规则集类Regular.cs

///     /// 模板规则类    ///     public class Regular    {        ///         /// 表头文本   --对应excel表头名称        ///         public string HeaderText { set; get; }        ///         /// 属性名称    --对应数据库字段名称        ///         public string PropertyName { set; get; }        ///         /// 数据类型   ---对应数据库字段类型(用作判断excel数据是否合法用)        ///         public string DataType { set; get; }        private Dictionary
 _regular = new Dictionary
();        /// 
        /// 表头规则  --我们所定义的具体规则,如我们文中例子的起始行、结束行、表单数等等        ///         public Dictionary
 HeaderRegular        {            get { return _regular; }            set { _regular = value; }        }    }

这个类根据具体需求可能会有所不同,具体随设计而改变。

第三步:创建一个解析excel数据的类(excel越多越复杂,实现就越困难),此处先假设已建好(详细代码请关注后续博客)

///     /// Excel表格检查与数据读取接口    ///     public interface IExcelImportService    {        ///         /// 初始化Excel数据及配置文件        ///         /// 
Excel文件        /// 
配置文件        /// 
可以为空        void InitDataAndConfig(string filePath, string xmlPath, bool nullable);        /// 
        /// 综合验证Excel表格符合性        ///         /// 
某单元项自定义检验接口        /// 
        UploadExcelFileResult ValidateExcel(ISpecification
> customValidate);        /// 
        /// 导入EXCEL文件        ///         /// 
数据对象DTO        /// 
EXCEL数据集合
        List
 Import
();        /// 
        /// 导入EXCEL 文件------矩阵类模板        /// 19.6-长江干线货物流量流向        /// 20.5-西江航运干线货物流量流向        ///         /// 
        /// 
        List
 ImportForMatrix
();    }

此处是已建好的解析excel接口。(具体实现请参考后续博客)

博主的设计理念是:用户上传一个excel后我们后台分三步走:

    1、初始化数据(excel文件流、对应配置文件--我们的规则集xml文件、以及一些其他的配置参数)

    2、验证excel里面的数据合格(通过验证表头可以判定用户是否错误上传excel文件,验证里面数据是否违规(格式错误等)等等需要验证的方面)。验证成功后返回基础表头、附加信息等数据让用户确认并提交;失败后提示具体失败原因,准确定位到失败数据行列数。

    3、用户看到验证通过的返回结果,确认无误后点击提交,此时读取数据入库。

至此,我们整个解析读取入库excel的流程就完成了,重在设计规则类这个设计思想,其中涉及到很多具体实现的代码,请参考后续博客专题。

整体博文已迁移到博客园:

转载于:https://my.oschina.net/u/1864532/blog/292630

你可能感兴趣的文章
Leetcode_Wildcard Matching
查看>>
docker 私有仓库简易搭建
查看>>
WCF系列教程之客户端异步调用服务
查看>>
P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers
查看>>
Android自带的分享功能案例
查看>>
Android广播机制分析
查看>>
Android ADB工具-截图和录制视频(五)
查看>>
配置docker官方源并用yum安装docker
查看>>
PHP/Javascript 数组定义 及JSON中的使用 ---OK
查看>>
php中urldecode()和urlencode()起什么作用啊
查看>>
UVA 11542 Square 高斯消元 异或方程组求解
查看>>
Nginx的内部(进程)模型
查看>>
基于设备树的controller学习(1)
查看>>
递归--练习1--noi3089爬楼梯
查看>>
慢慢过渡到个人博客
查看>>
深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 4:Debugging: Gradient Checking
查看>>
【转】spring boot web相关配置
查看>>
oc53--autorelease注意事项
查看>>
sigmod2017.org
查看>>
MongoDB集群运维笔记
查看>>