一、缘由。

    最近公司的一个需求,导出 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. EasyUI汇总

    easyui combobox添加清除选项按钮 <input class="easyui-combobox" name="appType" data-op ...

  2. Selenium2+python自动化64-100(大结局)[已出书]

    前言 小编曾经说过要写100篇关于selenium的博客文章,前面的64篇已经免费放到博客园供小伙伴们学习,后面的内容就不放出来了,高阶内容直接更新到百度阅读了. 一.百度阅读地址: 1.本书是在线阅 ...

  3. 小米笔记本pro CPU GPU 做科学计算的算力对比

    小米笔记本pro:15.6寸,i7-8850,16G,256G,GPU:MX150 测试对象Caffe,MNIST训练 使用纯CPU训练: 1.耗时:11分58秒 2.功耗:35W 使用GPU训练: ...

  4. html5 filereader 读取图片信息

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. “MSDTC 事务的导入失败: Result Code = 0x8004d00e。

    今天搞数据库移植,也把分布式程序移植了一下,一直报上面的错误,差点要重装了  %>_<%,网上看了几篇文章偶然间用DPCPING工具测试了下连接,发现不行.想到host文件的配置,发现其中 ...

  6. open中的mode

    [open中的mode] 当使用O_CREAT标志的open来创建文件时,我们必须使用三个参数格式的open调用.第三个参数mode 是几个标志按位OR后得到的.他们是: S_IRUSR: 读权限,文 ...

  7. 分区恢复和NTFS文件恢复试验

    一.实验室名称:主楼实验室A2-412                  二.实验项目名称:分区恢复和NTFS文件恢复试验 三.实验学时:6学时 四.实验原理: 借助fdisk.diskgen软件对磁 ...

  8. ICG游戏:斐波那契博弈

    描述: 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗: 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍: ...

  9. Visual studio 2017编译 boost

    下载: https://www.boost.org/   或者 https://dl.bintray.com/boostorg/release/1.66.0/source/ 下载完成以后解压到自己想要 ...

  10. 关于java项目中的.classpath文件:

    Classpath是Java中的重要概念: 它描述了Java虚拟机在运行一个Class时在哪些路径中加载要运行的类以及运行的类要用到的类 简单的说,就是像操作系统的path 只不过这个classpat ...