VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • .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


相关教程