-
.net npoi 导出合并单元格
我写这个是因为 一个妹子(因为我喜欢这妹子,不然谁鸟你,所以身边对你好的异性一定对你图谋不轨,就像我)请教我这个问题
导出exexl,大多数人百度一下就知道怎么写,但合并单元格就要有一定思考,我也看过大量的资料,但我觉得有解决问题的思路很重要,废话不说了 ,直接来看代码:
CellRangeAddress(y, y1, x, x1)分别代表这 合并的初始行,结束行,初始列,结束列
CellRangeAddress region = new CellRangeAddress(y, y1, x, x1);//合并单元格 sheet.AddMergedRegion(region); cell = sheet.GetRow(item.Ya).GetCell(2); cell.CellStyle = cellstyles;//合并单元格后的样式
这里的
cellstyles合并单元格的样式,我就不做解释,直接贴代码:
//这里就是合并单元格后单元格的样式 //在合并单元格后 cell.CellStyle = cellstyles; 这样就ok了 字体大小也可以在这里该 NPOI.SS.UserModel.ICellStyle cellstyles = workbook.CreateCellStyle();//设置垂直居中格式 cellstyles.VerticalAlignment = VerticalAlignment.Center;//垂直居中 cellstyles.Alignment = HorizontalAlignment.Left;//水平居左 cellstyles = workbook.CreateCellStyle();//设置垂直居中格式 cellstyles.VerticalAlignment = VerticalAlignment.Center;//垂直居中 cellstyles.Alignment = HorizontalAlignment.Left;//水平居中
上面都是凑字数,接下来说一说 我对合并上下单元格的理解想法就是 :用数组或者集合存放合并单元格的坐标,对就是这么简单,算了直接贴代码:
//写入列 for (int i = 0; i < dts.Columns.Count; i++) { row.CreateCell(i).SetCellValue(dts.Columns[i].ColumnName); } //根据上次代码 做的改进,用一个集合来存放 合并单元格的位置,因为 我们这只需要上下单元格合并 所以 一条数据只存放2个值,代表这 从第几行 到第几行 注意 后者的值必定大于等于前者 //如 是上下左右的单元格 合并一条数据就要存放4个值 List<indexs> ids = new List<indexs>(); bool flag = true; ; string temp = ""; //写入行数据 for (int i = 0; i < dts.Rows.Count; i++) { /* 标题占一行 列名占一行 所以 row = sheet.CreateRow(i + 2); 这里是 i+2 */ row = sheet.CreateRow(i + 2); for (int j = 0; j < dts.Columns.Count; j++) { if (dts.Columns[j].ColumnName == "IDNumber")//判断是否到需要合并的单元格 { if (i != 0) { if (temp != dts.Rows[i][j].ToString().Trim()) { temp = dts.Rows[i][j].ToString().Trim(); if (temp == dts.Rows[i - 1][j].ToString().Trim()) { ids.Add(new indexs { Ya = i + 1, }); } else { if (ids.Count() != 0 && ids[ids.Count - 1].Yb == 0) { ids[ids.Count - 1].Yb = i + 1; flag = true; } } } else { if (temp == dts.Rows[i - 1][j].ToString().Trim()) { //flag 防止出现重复 if (flag) { //出现相同订单号的位置 flag = false; ids.Add(new indexs { Ya = i + 1, }); } temp = dts.Rows[i][j].ToString().Trim();//感觉这里可以不写这个 你可以试试 } //防止最后一条数据也是合并项 if (i == dts.Rows.Count - 1) { ids[ids.Count - 1].Yb = i + 2; } } } } //写入单元格 var col = row.CreateCell(j); col.SetCellValue(dts.Rows[i][j].ToString().Trim()); } } //这里就是合并单元格后单元格的样式 //在合并单元格后 cell.CellStyle = cellstyles; 这样就ok了 字体大小也可以在这里该 NPOI.SS.UserModel.ICellStyle cellstyles = workbook.CreateCellStyle();//设置垂直居中格式 cellstyles.VerticalAlignment = VerticalAlignment.Center;//垂直居中 cellstyles.Alignment = HorizontalAlignment.Left;//水平居左 cellstyles = workbook.CreateCellStyle();//设置垂直居中格式 cellstyles.VerticalAlignment = VerticalAlignment.Center;//垂直居中 cellstyles.Alignment = HorizontalAlignment.Left;//水平居中 foreach (var item in ids) { //CellRangeAddress(item.Ya, item.Yb, 0, 0) 这里的两个0是没行中第一个单元格 而item.Ya, item.Yb 代表第几行到第几行 我们需求是上下相同的订单号合并所以只需要改变这个的前两个值,后面两个值 随之递增 //因为 我们这只需要合并上下单元格的序号 而序号在每行的第一个单元格 所以这里的后两个值都是0, CellRangeAddress region = new CellRangeAddress(item.Ya, item.Yb, 0, 0);//合并单元格 sheet.AddMergedRegion(region); cell = sheet.GetRow(item.Ya).GetCell(0); cell.CellStyle = cellstyles; }
哎!,要是问我的是个男的,上面代码一个中文字都不会存在,所以还在为合并单元格发愁的你们 ,一定要感谢这妹子。
还有dome写的是合并上下单元格,但左右单元格的合并大致是一样的
心情好给你们看看我写的dome:
链接:https://pan.baidu.com/s/1zp6rVsQEn_PY2mGLalnlfA
提取码:1580
出处:https://www.cnblogs.com/panliwu521801314/p/15020488.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数