一、缘由。

    最近公司的一个需求,导出 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. /proc目录下文件详解

    /proc “文件系统”是一个目录,其中包含的文件层次结构代表了 Linux 内核的当前状态.它允许用户和管理员查看系统的内核视图. /proc 目录中还包含关于系统硬件及任何当前正在运行的程序信息. ...

  2. 交叉编译OpenCV的Android版本

    交叉编译OpenCV的Android版本 OpenCV作为一个强大的图像处理库,在Android上也有强大的应用. OpenCV官网提供了SDK的下载,可以直接下载使用 OpenCV官网地址:http ...

  3. 一次使用 Redis 优化查询性能的实践

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到 ...

  4. JS 根据url 下载

    一. window.location="htpp://www.baidu.com/test.rar"; 二. var $form = $('<form method=&quo ...

  5. 实现socketChannel 通信例子

    https://blog.csdn.net/qq_33935895/article/details/79678345

  6. outlook更改邮件存储路径

    由于司邮箱容量磁盘配额很小,没收几封邮件就提示邮箱容量已满请删除不重要的邮件很是烦人,于是乎就想着怎么把邮件存到本地然后自动删除服务器上的邮件不做备份,这样就不会在提示邮箱容量已满了,就不用担心发不出 ...

  7. LeetCode之链表

    2. Add Two Numbers You are given two linked lists representing two non-negative numbers. The digits ...

  8. idea提示,格式化代码,清除不使用的包快捷键,maven自动导jar包

    一.提示快捷键 idea默认快捷键是ctrl+space,通常和别的软件快捷键冲突,所以将快捷键修改为alt+/ 二.格式化快捷键ctrl+alt+l,通常和qq.tim快捷键冲突,请修改qq或者ti ...

  9. Oracle的服务端_默认_启动的服务

  10. String和CharSequence

    String 是java中的字符串,它继承于CharSequence. String类所包含的API接口非常多.为了便于今后的使用,我对String的API进行了分类,并都给出的演示程序. Strin ...