哈哈~~~很高兴还活着。总算加班加点的把最后一类EXCEL模板的解析做完了...

前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~

今天再简单讲诉一下另一种“变异”EXCEL表头模板——矩阵表头模板的解析(博主感觉这种模板虽说怪异,但是偶尔也能遇到,的确是有一定的实用性),我们用一个流量流向的excel作为例子来讲解:

先来解释一下这个表头:

1、“上表头”看似复杂,按我们前几篇文章说到的XML配置规则集的方法,轻易就能解析

2、这个表头“上表头”、“左表头”内容不定,行列数不定

我相信这种表头还是有一定价值的,值得做一个了解。

由于“上表头”列不定,我们就不能按常规的思想,以列为数据库字段来建表存储。在建实体类时,博主偶然联想到了大一高数(也不枉我考了90分)学到的矩阵,总感觉很神似,于是乎就以“矩阵类EXCEL模板”命名之。

然后取变化的“上表头”、“左表头”为属性字段,最终新建实体类如下:

     /// <summary>
/// XX年XX月西江航运干线货物流量流向
/// PS_XJ_VolumeAndDirection
/// </summary>
public class CargoFlowVolumeAndDirectionInXjItem : DataFoundationItem
{
/// <summary>
/// 该表项在表格中的索引位置
/// </summary>
public int Index { get; set; } /// <summary>
/// 货物重量(或同期比)
/// CargoWeight
/// </summary>
public double CargoWeight { get; set; } /// <summary>
/// 出发航段、支流
/// LeavingPort
/// </summary>
public string LeavingSegment { get; set; } /// <summary>
/// 到达航段、支流
/// ArrivingPort
/// </summary>
public string ArrivingSegment { get; set; }
}

当然,这么存也不是3/5分钟想出来的,只是偶发奇想。

很明显,这次我们需要重构的依然只是表头解析方法GetExcelHeaders()和解析Excel数据的方法GetExcelDatas()。

我们先来看表头,以前我们是把列全部配置到XML文件作为规则集,我们这次做得再像矩阵一点,在XML规则集中配置“X轴”、“Y轴”分别用来代表“上表头”、“左表头”,再外加一个字段配置具体的值就OK:

 <?xml version="1.0" encoding="utf-8" ?>
<module>
<add firstHeaderRow="" lastHeaderRow="" />
<add headerText="Y轴" propertyName="LeavingSegment" dataType="System.String"/>
<add headerText="X轴" propertyName="ArrivingSegment" dataType="System.String"/>
<add headerText="值" propertyName="CargoWeight" dataType="System.double"/>
</module>

哈哈,有木有很简洁的感觉。

具体解析EXCEL表头的方法在第三篇文章GetExcelHeaders():

http://www.cnblogs.com/csqb-511612371/p/4891492.html

我们只需要把第42行-52行,规则集的验证干掉,这次我们把表头作为一个“X轴”数据先存起来,那么我们就能得到类似下面的表头信息:

0,出发

1,到达总计

2,同期比(%)

3,干线合计

4,肇庆

...

接下来就来重构我们解析excel数据的方法GetExcelDatas(),在第三篇文章第7点。

我们注意第26/27行,以前的模板我们都是在这儿通过表头与规则集匹配查找到相应DTO属性进行赋值。

但是这次我们的规则集中并未对表头进行配置(因为表头内容不定),而是只配置了“X轴”、“Y轴”与“值”,那么我们重构这两行代码:

                     // 产生一个新的泛型对象
var model = Activator.CreateInstance<TableDTO>();
// 获取第i行第一列值
string rowItem = dataRow.GetCell().ToString();
if (rowItem == "")
{
break;
}
//添加Y轴值到DTO对象
Regular YHeader = list.Find(h => h.HeaderText == "Y轴");
string YProperty = YHeader.PropertyName;
PropertyInfo YProp = model.GetType().GetProperty(YProperty);
YProp.SetValue(model, rowItem, null); //添加X轴值到DTO对象
Regular XHeader = list.Find(h => h.HeaderText == "X轴");
string XProperty = XHeader.PropertyName;
PropertyInfo XProp = model.GetType().GetProperty(XProperty);
XProp.SetValue(model, dict[j], null); string value = "";
Regular header = list.Find(h => h.HeaderText == "值");
string property = header.PropertyName;
PropertyInfo prop = model.GetType().GetProperty(property);

注:

1.第四行我们一直取第一列值,作为Y轴,当我们在循环X轴数据时,应当不变。

2.第20行,我们上面说到,已经把当前“上表头”全部存入到了表头解析数据dict字典中,所以X轴只需要按索引取出“上表头”值即可

3.然后第24行,我们取出对单元格具体值的配置属性,接下来就是以前的代码获取单元格值,反射赋值到该属性中即可

重构到这一步,我们已经基本完成了对“矩阵类EXCEL模板”的数据解析。我们可以预料返回的DTO集合数据将是:

1423.53  总计  到达总计

111.2     总计  同期比(%)

525.24   总计    干线合计

......

111.2    同期比(%)  到达总计

0          同期比(%)  同期比(%)

130.7    同期比(%)   干线合计

......

我们只需要在DTO向实体做Mapper的时候,将Index属性按从0开始递加赋值即可。

至此,博主想分享的EXCEL操作系列就告一段落。

虽然还有一些更加复杂的excel(玫瑰图等),但是博主感觉都很小众化,这辈子遇上一次就算倒霉的了,就不再做方案分享了。

写了六篇了,才感觉整体文章命名不好,其实NPOI在博主的项目中只起到了一个操作EXCEL的开源工具作用,使用其他开源组件可以随意替换它。

主要想介绍用XML搭桥做规则集的一种excel解析思想。

希望对您有所帮助。如有写的不对不好的地方,请指出,一定虚心请假...

原创文章,代码都是从自己项目里贴出来的。转载请注明出处哦,亲~~~

NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析的更多相关文章

  1. POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值

    一.excel公共样式类(包含数据科学计数法转为普通值) package com.thinkgem.jeesite.common.utils.excel; import org.apache.poi. ...

  2. 导出excel(利用工具类导出excel)

    /** * 添加导出功能 * @param creditPageResult * @param request * @param response */ @RequestMapping(value = ...

  3. NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析

    我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...

  4. 通过NPOI操作Excel

    最近在做的一个项目中需要生成Excel,通过学习使用NPOI实现了相关需求,写了一个简便操作的类,记录如下: public class NPOIHelperForExcel { #region exc ...

  5. NPOI操作EXCEL(四)——反射机制批量导出excel文件

    前面我们已经实现了反射机制进行excel表格数据的解析,既然有上传就得有下载,我们再来写一个通用的导出方法,利用反射机制实现对系统所有数据列表的筛选结果导出excel功能. 我们来构想一下这样一个画面 ...

  6. C#利用NPOI操作Excel文件

    NPOI作为开源免费的组件,功能强大,可用来读写Excel(兼容xls和xlsx两种版本).Word.PPT文件.可是要让我们记住所有的操作,这便有点困难了,至此,总结一些在开发中常用的针对Excel ...

  7. .NET 通过 NPOI 操作 Excel

    目录 .NET 通过 NPOI 操作 Excel 第一步:通过 NuGet 获取 NPOI 包并引入程序集 第二步:引入 NPOI 帮助类 第三步:在程序中调用相应的方法对数据进行导出导入操作 将 D ...

  8. C#开发中使用Npoi操作excel实例代码

    C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...

  9. C#中npoi操作Excel[版本2.0.1读写2003、2007格式]

    下载npoi2.0.1dll文件:http://download.csdn.net/detail/pukuimin1226/5851747 public static void test1()     ...

随机推荐

  1. Hive索引功能测试

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 从Hive的官方wiki来看,Hive0.7以后增加了一个对表建立index的功能,想试下性能是 ...

  2. 基于 HTML5 的 Web SCADA 报表

    背景 最近在一个 SCADA 项目中遇到了在 Web 页面中展示设备报表的需求.一个完整的报表,一般包含了筛选操作区.表格.Chart.展板等多种元素,而其中的数据表格是最常用的控件.在以往的工业项目 ...

  3. iOS 编辑UITableView(根据iOS编程编写)

    上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为  e ...

  4. MVC采用Jquery实现局部刷新

    该文纯粹属于个人学习,有不足之处请多多指教! 效果图: 单击Detail下面出现详细,效果如下: 为了使操作时两个不同的数据源相互干扰,使用局部视图刷新,代码如下: 首先介绍主页Index代码: @m ...

  5. springmvc配置文件web.xml详解各方总结(转载)

    Spring分为多个文件进行分别的配置,其中在servlet-name中如果没有指定init-param属性,那么系统自动寻找的spring配置文件为[servlet-name]-servlet.xm ...

  6. spring mvc返回json字符串的方式

    spring mvc返回json字符串的方式 方案一:使用@ResponseBody 注解返回响应体 直接将返回值序列化json            优点:不需要自己再处理 步骤一:在spring- ...

  7. C#Excel文件加密实现,支持xlsx、docx、pptx(C#\Net\Asp.Net)

    从此刻开始,我已封闭!概不接客! 像风一样的男人,像风一样的性格,无拘无束,不拘一格.那么问题来了,当风遇到沙,不一定你是风儿,我是沙儿的缠缠绵绵,.也许是漫天黄沙,飞粒走石.如果我们期望擒住这漫天的 ...

  8. Oracle数据库的链接数目超标

    测试场景:Oracle数据库的链接数目超标,iServer是否自动连接. 测试步骤:(1)设置了最大连接数为85,oracle后台进程有83:(2)开启3台iserver(A,B,C)A,B发布tes ...

  9. 在Java中使用xpath对xml解析

    xpath是一门在xml文档中查找信息的语言.xpath用于在XML文档中通过元素和属性进行导航.它的返回值可能是节点,节点集合,文本,以及节点和文本的混合等.在学习本文档之前应该对XML的节点,元素 ...

  10. (视频)Erich Gamma 与 Visual Studio Online 的一点野史

    大家对Erich Gamma的熟悉应该都集中在<设计模式>, Eclipse以及最近微软所发布的Visual Studio Code跨平台代码编辑器.其实在Erich加入微软的头几年里,他 ...