一、缘由。

    最近公司的一个需求,导出 Excel, 相同的数据进行合并,并且 还有 二级合并。

  最终效果图如下:

  

哈哈哈哈哈,图表略微有些丑陋,请大家不要介意。

他的原始数据,是一条一条的,

如下图:

  

二、导出 处理 逻辑。

  

  

try
{
int propertyCount = getPropertyCount(typeof(T)); var hssfWorkbook = new XSSFWorkbook();
var sheet1 = hssfWorkbook.CreateSheet(sheetName); var row1 = (XSSFRow)sheet1.CreateRow();
//表头样式
var rowstyle = hssfWorkbook.CreateCellStyle();
rowstyle.Alignment = HorizontalAlignment.Center;
//rowstyle.FillBackgroundColor = HSSFColor.Grey25Percent.Index;
var font1 = hssfWorkbook.CreateFont(); font1.FontHeight = ;
//font1.Boldweight = 600;
rowstyle.SetFont(font1); font1.FontHeightInPoints = ;
font1.Boldweight = ; WriteHeader(typeof(T), row1, rowstyle); int i = ;
for (int j = ; j < listData.Count; j++)
{
int rowIndex = i;
var rowData = (XSSFRow)sheet1.CreateRow(rowIndex + );
WriteData(listData[j], typeof(T), rowData);
i++;
} setAutoColumn(sheet1, i);
          //sheet1 就是 在内存中 填充好的 Excel数据。下面合并要用到           ///////
          ///////这里 放置 合并方法。
          ///////第 0 列 合并。
          mergeuser(sheet1,0);
          
var rowfooter = (XSSFRow)sheet1.CreateRow(i + );
//NpoiMemoryStream 是 重写Npoi流方法
using (NpoiMemoryStream ms = new NpoiMemoryStream())
{
ms.AllowClose = false;
hssfWorkbook.Write(ms);
ms.Flush();
ms.Position = ;
hssfWorkbook = null;
return ms;
}
}
catch (Exception ex)
{
throw ex;
}

  重写 Npoi流。

    /// <summary>
/// 重写Npoi流方法
/// </summary>
public class NpoiMemoryStream : MemoryStream
{
public NpoiMemoryStream()
{
AllowClose = true;
}
public bool AllowClose { get; set; } /// <summary>
/// 关闭
/// </summary>
public override void Close()
{
if (AllowClose)
base.Close();
}
}

合并 单元格 方法。

  

private static void mergeuser(ISheet sheet, int columnIndex)
{
       //开始 要合并的内容为空
var previous = "";
       //startRow 是你Excel 数据是 第几行开始的
var startRow = ;
for (int rowNum = ; rowNum <= sheet.LastRowNum; rowNum++)
{
          //获取 指定行,指定列的 数据内容
var current = sheet.GetRow(rowNum).GetCell(columnIndex).StringCellValue;
          // 判断 获取到的内容是否和 上一列 相等
if (current.Equals(previous))
{continue;}
else
{
            // 第一级 合并。
            //将获取到的 内容 赋值到 previous
previous = current;
            // 判断开始行,是否小于 循环的行数。
if (startRow < rowNum)
{
               //第二级 合并
var celltext = "";
var startAM = startRow;
for (int i = startRow; i <= rowNum; i++)
{
var endtext = sheet.GetRow(i).GetCell().StringCellValue;
if (celltext.Equals(endtext))
{ continue; }
else
{
celltext = endtext;
if (startAM < i)
{
                      // CellRangeAddress(起始行号,终止行号, 起始列号,终止列号)
                      //这里 终止行号 -1 原因是:上面循环判断时 内容不一样的 才进行 合并,
                      //这时 行数 i 内容 已经不一样,所以 需要减去 1 进行合并 sheet.AddMergedRegion(new CellRangeAddress(startAM, i - , columnIndex + , columnIndex + ));
                                }
                    // 将 当前行数,进行赋值给 启始行数。
startAM = i;
}
}
sheet.AddMergedRegion(new CellRangeAddress(startRow, rowNum - , columnIndex, columnIndex));
}
startRow = rowNum;
}
}
}

  

至此 ,合并结束。

小记:

  合并时 ,最好是在  添加内容 到 sheet 里面时,进行合并,这样的话,减少了 一次 循环所有数据的操作,提高了 速度问题。

  

以上,如果 有好的建议 欢迎 指正。

Npoi--合并单元格的更多相关文章

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

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

  2. NPOI之Excel——合并单元格、设置样式、输入公式

    首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkboo ...

  3. NPOI扩展--判断指定单元格是否为合并单元格和输出该单元格的行列跨度(维度)

    因工作需要用到跨合并单元格获取数据,所以写了个NPOI扩展类. 主要方法如下: 1.判断指定行/列索引(单元格)是否为合并单元格. 2.获取指定列索引的实际含有数据的单元格. 3.返回指定行/列索引的 ...

  4. NPOI之Excel——合并单元格、设置样式、输入公式、设置筛选等

    首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkboo ...

  5. 用NPOI创建Excel、合并单元格、设置单元格样式、边框的方法

    本篇文章小编为大家介绍,用NPOI创建Excel.合并单元格.设置单元格样式.边框的方法.需要的朋友参考下 今天在做项目中,遇到使用代码生成具有一定样式的Excel,找了很多资料,最后终于解决了,Ex ...

  6. 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

    前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...

  7. C# 如何使用NPOI操作Excel以及读取合并单元格等

    C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...

  8. npoi导出excel合并单元格

    需要引用NPOI.dll程序集和Ionic.Zip.dll程序集 string[] headerRowName = { "序号", "地市", "镇街 ...

  9. 使用npoi导入Excel - 带合并单元格--附代码

    之前我们在使用npoi导入excel表格的时候,往往会遇见那种带有合并单元格的数据在导入的时候出现合并为空的问题, 也就是只有第一条有数据,其余均为空白.在网上翻了半天也没有找到合适的解决方案,最后还 ...

  10. C# NPOI Excel 合并单元格和取消单元格

    1.合并单元操作 //合并单元格 /** 第一个参数:从第几行开始合并 第二个参数:到第几行结束合并 第三个参数:从第几列开始合并 第四个参数:到第几列结束合并 **/ CellRangeAddres ...

随机推荐

  1. tomcat下载安装和配置

    Tomcat服务器 1.Web开发中的常见概念 (1)B/S系统和C/S系统 Brower/Server:浏览器 服务器 系统 ----- 网站 Client/Server:客户端 服务器 系统 -- ...

  2. maven+testng+reportng的pom设置

    在pom.xml 加入: <dependency> <groupId>org.testng</groupId> <artifactId>testng&l ...

  3. DrawGrid DrawFocusRect

    http://docwiki.embarcadero.com/CodeExamples/XE7/en/GridLineWidth_%28C%2B%2B%29 void __fastcall TForm ...

  4. Best free online svn repositories

    Maybe you want to develop in a custom team environment or you usualy work on different machines (tha ...

  5. docker-compose搭建单机多节点es + kibana

    docker-compose.yml配置如下: version: '2.2' services: elasticsearch: image: docker.elastic.co/elasticsear ...

  6. Linux centos下php安装cphalcon扩展的方法

    说明: 操作系统:CentOS php安装目录:/usr/local/php php.ini配置文件路径:/usr/local/php/etc/php.ini 1.安装cphalcon cd /usr ...

  7. 获取openid回调两次

    解决了好久,请教了各路大神也没找到解决方案. 最后灵感一现,是不是参数顺序问题?按照官网示例的先后顺序从新调用了一次,回调一次,成功解决. 官网文档:https://mp.weixin.qq.com/ ...

  8. [DT] 数据结构术语中英文对照

    数据结构术语中英文对照 数据 Data 数据元素 Data element 数据项 Data item 数据结构 Data structure 逻辑结构 Logical structure 数据类型 ...

  9. Java程序设计19——类的加载和反射-Part-A

    1 本文概要 本章介绍Java类的加载.连接和初始化的深入知识,并重点介绍Java反射相关的内容.本章知识偏底层点,这些运行原理有助于我们更好的把我java程序的运行.而且Java类加载器除了根加载器 ...

  10. centos环境下创建数据库和表的方法

    centos环境下创建数据库和表的方法 //查询数据库的命令: mysql> SHOW DATABASES; +--------------------+ | Database         ...