.net npoi 导出合并单元格

  • A+
所属分类:.NET技术
摘要

          我写这个是因为 一个妹子(因为我喜欢这妹子,不然谁鸟你,所以身边对你好的异性一定对你图谋不轨,就像我)请教我这个问题

          我写这个是因为 一个妹子(因为我喜欢这妹子,不然谁鸟你,所以身边对你好的异性一定对你图谋不轨,就像我)请教我这个问题

          导出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