需要引用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. 「LOJ#10045」「一本通 2.2 练习 1」Radio Transmission (KMP

    题目描述 原题来自:BalticOI 2009 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入格式 第一行给出字符串的长度 L,第 ...

  2. ie下使用文本编辑器导致input文本框无法聚焦的问题原因

    最近公司的一个项目遇到一个如下问题: 描述:测试发现,每当我们在发布活动的页面发布完活动后,页面跳转到我的活动,然后再次回到发布活动页面,发现所有的input文本框都不能聚焦.然后再去看看其他页面(我 ...

  3. Lagom学习(一)

    Lagom是JAVA系下响应式 微服务框架,其特性包括: 目前,大多数已有的微服务框架关注于简化单个微服务的构建,Lagom将其扩展到了微服务所构成的系统,分布式系统的复杂性. 同步通信使用HTTP, ...

  4. 梯度算子(普通的+Robert + sobel + Laplace)

    1.水平垂直差分法: 2.Robert 算子梯度 3.sobel算子 4.拉普拉斯算子

  5. 利用CSS3给图片添加旋转背景特效

    首先看旋转特效:http://***/demo/201512/2015-12-09-css3-image-hover-animate/index.html 这是一款纯CSS3实现的当鼠标滑过图片时文字 ...

  6. Sybase.在PowerDesigner中如何添加-约束

    Sybase.在PowerDesigner中如何添加-约束 资料 2010-06-23 08:57:09 阅读21 评论0   字号:大中小 订阅 唯一约束 唯一约束与创建唯一索引基本上是一回事,因为 ...

  7. MySQL数据库基础详解(非原创)

    文章大纲 一.数据库简介二.Mysql数据库简介三.Mysql安装与服务启动(Windows版本)四.Mysql图形化工具五.Mysql存储引擎精讲六.Mysql数据类型介绍七.Mysql主要专业名称 ...

  8. 脚本执行JavaScript代码

    下面是一个具体的demo测试脚本引擎,执行javas文件. package Rhino; import java.io.FileReader;import java.net.URL; import j ...

  9. 获得用户IP、城市、国家等信息的api接口

    1 这个信息比较多 https://api.ipdata.co/?api-key=test <script> $.get("https://api.ipdata.co?api-k ...

  10. 代码修改shader Properties uniform变量

    2.4 Shader的数据接口:属性和 uniform变量     如果我们想设定一个特定的值到Shader,即为了在实例化Shader为Material时,可以通过为属性赋值达到创建具体对象的目的, ...