需要引用NPOI.dll程序集和Ionic.Zip.dll程序集

string[] headerRowName = { "序号", "地市", "镇街", "企业名称", "监控类型", "企业联网负责人", "企业联网负责人手机号",
"环保督办人", "环保督办人联系电话", "所属重点行业", "是否原国控企业",
"监测类型", "产污工艺名称", "排放口安装视频监控数", "安装工控监控数",
"排放口名称", "监控点位名称", "是否安装设备", "是否暂缓安装", "暂缓备注",
"安装期限", "是否与环保部门联网传输", "联网期限", "联网传输方式", "监控污染物", "执行标准"};

IWorkbook book = RenderToExcel1(dt2, headerRowName);
ISheet sheet = book.GetSheet("Sheet1");

ICellStyle style = book.CreateCellStyle();
//style.Alignment = HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;

Merge1(sheet, style);

MemoryStream ms = new MemoryStream();
book.Write(ms);
ms.Flush();
ms.Position = 0;
RenderToBrowser(ms, HttpContext.Current, FileName);

//第一个方法

/// <summary>
/// 将数据写入工作簿中
/// </summary>
/// <param name="table">数据</param>
/// <param name="headerRowName">对应table数剧中的列名称的数组</param>

public static IWorkbook RenderToExcel1(DataTable table, string[] headerRowName)
{
//MemoryStream ms = new MemoryStream();

using (table)
{
IWorkbook workbook = new HSSFWorkbook();//创建Workbook对象
ISheet sheet = workbook.CreateSheet("Sheet1");//创建工作表
//创建第一行
IRow headerRow = sheet.CreateRow(0);

//设置第一行的名称
for (int i = 0; i < headerRowName.Length; i++)
{
string value = headerRowName[i];
headerRow.CreateCell(i).SetCellValue(value);//If Caption not set, returns the ColumnName value
}
// handling value.
int rowIndex = 1;

string sourceName1 = table.Rows[0]["SourceName"].ToString();

foreach (DataRow row in table.Rows)
{
IRow dataRow = sheet.CreateRow(rowIndex);
//添加序号
//dataRow.CreateCell(0).SetCellValue(rowIndex);
//添加table中的数据
foreach (DataColumn column in table.Columns)
{
int column_Ordinal = column.Ordinal;
string value = row[column].ToString();
dataRow.CreateCell(column_Ordinal).SetCellValue(value);
}
rowIndex++;
}

//列宽自适应,只对英文和数字有效
for (int i = 0; i <= table.Rows.Count; i++)
{
sheet.AutoSizeColumn(i);
}

//workbook.Write(ms);
//ms.Flush();
//ms.Position = 0;
return workbook;
}
//return ms;
}

//第二个方法(合并单元格)

public void Merge1(ISheet sheet, ICellStyle style)
{
int num = 1;
string FirstSource = null;
int dept = 0;
for (int rowID = 0; rowID <= sheet.LastRowNum + 1; rowID++)
{
IRow row = null;
string nowSource = null;
if (rowID <= sheet.LastRowNum)
{
row = sheet.GetRow(rowID);

//获取用来判断是否合并的列的值
nowSource = row.GetCell(3).ToString();
}

//如果当前那个用来判断是否合并的列的值与上一列的值相同就不合并,继续看下一行

if (nowSource != FirstSource)
{
if (FirstSource != null)
{
//序号
//if (rowID - dept != 0)
// sheet.GetRow(rowID - dept).GetCell(0).SetCellValue(num++);

//如果深度超过1,进行合并企业信息列
if (dept > 1)
{
for (int gi = 0; gi < 15; gi++)
{
IRow iRow = sheet.GetRow(rowID - dept);
ICell iCell = iRow.GetCell(gi);
iCell.CellStyle = style;
sheet.AddMergedRegion(new CellRangeAddress(rowID - dept, rowID - 1, gi, gi));
}

//合并企业信息后,检索排放口列,排放口信息从13列开始
string FirstCheck = null;
int cDept = 1;
for (int cRowID = rowID - dept; cRowID <= rowID; cRowID++)
{
IRow crow = null;
string nowCheck = null;
if (cRowID != rowID)
{
crow = sheet.GetRow(cRowID);
nowCheck = crow.GetCell(16).ToString();
}

if (nowCheck != FirstCheck)
{
if (FirstCheck != null && cDept > 1)
{
//合并排放口
for (int gi = 16; gi <= 23; gi++)
{
IRow iRow = sheet.GetRow(cRowID - cDept);
ICell iCell = iRow.GetCell(gi);
iCell.CellStyle = style;
//sheet.GetRow(cRowID - cDept).GetCell(gi).CellStyle = style;
sheet.AddMergedRegion(new CellRangeAddress(cRowID - cDept, cRowID - 1, gi, gi));
}
}

FirstCheck = nowCheck;
cDept = 1;
}
else
{
cDept++;
}
}
}
}

FirstSource = nowSource;
dept = 1;
}
else
{
dept++;
}
}
}

//第三个方法

static void RenderToBrowser(MemoryStream ms, HttpContext context, string fileName)
{
if (context.Request.Browser.Browser == "IE")
fileName = HttpUtility.UrlEncode(fileName);
context.Response.AddHeader("Content-Disposition", "attachment;fileName=" + fileName);
context.Response.BinaryWrite(ms.ToArray());
}

npoi导出excel合并单元格的更多相关文章

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

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

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

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

  3. poi导出excel合并单元格(包括列合并、行合并)

    1 工程所需jar包如下:commons-codec-1.5.jarcommons-logging-1.1.jarlog4j-1.2.13.jarjunit-3.8.1.jarpoi-3.9-2012 ...

  4. java poi导出Excel合并单元格并设置边框

    import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; i ...

  5. C#使用NPOI导出excel设置单元格背景颜色

    ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.FillPattern = FillPattern.SolidForegrou ...

  6. asp.net C#取Excel 合并单元格内容

    asp教程.net c#取excel 合并单元格内容读取excel数据,填充dataset// 连接字符串 string xlspath = server.mappath("~/www.11 ...

  7. Html Table用JS导出excel格式问题 导出EXCEL后单元格里的000412341234会变成412341234 7-14 会变成 2018-7-14(7月14) 自定义格式 web利用table表格生成excel格式问题 js导出excel增加表头、mso-number-format定义数据格式 数字输出格式转换 mso-number-format:"\@"

    Html Table用JS导出excel格式问题 我在网上找的JS把HTML Tabel导出成EXCEL.但是如果Table里的数字内容为0开的的导成Excel后会自动删除0,我想以text的格式写入 ...

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

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

  9. NPOI 生成Excel (单元格合并、设置单元格样式:字段,颜色、设置单元格为下拉框并限制输入值、设置单元格只能输入数字等)

    NPIO源码地址:https://github.com/tonyqus/npoi NPIO使用参考:源码中的 NPOITest项目 下面代码包括: 1.包含多个Sheet的Excel 2.单元格合并 ...

随机推荐

  1. 【Python】python2.7 安装配置OpenCV2

    环境:Ubuntu16.04 anaconda Python2.7 opencv2.4.13 安装opencv后 import cv2 遇到错误信息: No module named cv2 安装op ...

  2. C#如何立即回收内存

    1.把对象赋值为null 2.立即调用GC.Collect(); 注意:这个也只是强制垃圾回收器去回收,但具体什么时候执行不确定.  代码: class Test { ~Test() { Consol ...

  3. POJ1144(割点入门题)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11378   Accepted: 5285 Descript ...

  4. ambari2.1.1安装

    1       安装环境 系统:centos6.6 Ambari版本:2.1.1 安装指南:https://cwiki.apache.org/confluence/display/AMBARI/Ins ...

  5. angular.foreach 格式

    angular有自己的生命周期.循环给一个 angular监听的变量复值时.最好还是用angular自带的循环方法.“angular.foreach” 格式: var objs =[{a:1},{a: ...

  6. 开源.Net项目合集

    http://www.cnblogs.com/StrangeCity/p/OpenSourceProject.html

  7. [hdu3586]Information Disturbing树形dp+二分

    题意:给出一棵带权无向树,以及给定节点1,总约束为$m$,找出切断与所有叶子节点联系每条边所需要的最小价值约束. 解题关键:二分答案,转化为判定性问题,然后用树形dp验证答案即可. dp数组需要开到l ...

  8. 转:isualvm远程监控Tomcat

    一.Java VisualVM 概述 对于使用命令行远程监控jvm 太麻烦 . 在jdk1.6 中 Oracle 提供了一个新的可视化的. JVM 监控工具 Java VisualVM .jvisua ...

  9. linux控制USB的绑定/解绑

    linux控制USB的绑定/解绑 http://www.jianshu.com/p/57293f9be558 今天工作中遇到一个问题, 要用代码实现USB的enable和disable. 谷歌了一番, ...

  10. 教你如何暴力破解-telnet ftp ssh mysql mssql vnc 等

    大家应该都知道暴力破解的原理,但却不知道遇见telnet和ftp等服务和数据库如何破解,今天小R就教大家如何利用一个工具就能对其破解. 今天要给大家介绍的工具是:hydra(中文名:九头蛇) 这个名听 ...