我写这个是因为 一个妹子(因为我喜欢这妹子,不然谁鸟你,所以身边对你好的异性一定对你图谋不轨,就像我)请教我这个问题
导出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