需要引用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. RMI RPC socket

      1.RPC RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC不依赖于具体的 ...

  2. UVa 11552 Fewest Flops (DP)

    题意:给一个字符串,把它分为k块,每一块里面的字母可以任意的排序.最终字符串, 连续的一样的字母算作一个chunk,问总chunks最少是多少? 析:dp[i][j] 表示第 i 个块,第 j 位在末 ...

  3. hostent结构体和wsadata结构体

    一.hostent结构体 使用这个东西,首先要包含2个头文件:#include <netdb.h>#include <sys/socket.h> struct hostent ...

  4. VC OnCtlColor函数来修改控件背景颜色

    CWnd::OnCtlColor afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); 返回值:OnCtlColor必须 ...

  5. 防止APP退到被安卓系统清理

    一个是尽量提高APP权限,无非就是保持APP始终界面在前台 二是使用守护进程方法,被清理了立刻自己启动, 三是前台跟后台进程分开,被重启了恢复原始环境. // 申请设备电源锁,在服务start的时候. ...

  6. 使用HTML辅助方法载入分部视图

    在webform中我们用过user control可以减少重复代码也利于将页面模组化, 在mvc中 叫分部视图 Partial View.   也就是一个片段的view.可以利用Partial vie ...

  7. Android在Win10环境搭建

    一.安装JDK并配置环境变量 1.在Java官方网站上下载相应系统的jdk文件安装,如win7 64 位系统下安装jdk-6u45-windows-x64,全部选择默认的安装路径即可安装完成. 2.配 ...

  8. Vee-validate 父组件获取子组件表单校验结果

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  9. JS中map list 数组的迭代

    后台传给前台一个map 前台如何迭代呢 $.post("getSys.jhtml", function(data){ var temp = ""; $.each ...

  10. 伪类选择器 :nth-child(even) :nth-child(odd) :nth-of-type

    属性 描述 CSS :active 向被激活的元素添加样式. 1 :focus 向拥有键盘输入焦点的元素添加样式. 2 :hover 当鼠标悬浮在元素上方时,向元素添加样式. 1 :link 向未被访 ...